XSS漏洞利用姿势

什么是XSS

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。(来源:百度百科)

XSS就是利用网页的漏洞,让网页执行自己的js脚本,来达到一些目的。

所以XSS漏洞需要有输出,只有输出来能将你上传的js代码调动并执行。

XSS常见的有反射型XSS(也叫非持续性XSS)和存储型XSS(也叫持续性XSS)

反射型XSS

脚本通过用户提交执行,并没有写入数据库,所以是非持续的,只有提交了相应的url,才会执行javascript脚本。
例如:

1
2
3
<?php
echo $_ GET['test'];
?>

访问:

1
127.0.0.1/test/xss.php?test=<script>alert(1)</script>

会发现代码被直接输出并被浏览器解析,弹出了一个弹窗。

储存型XSS

通过某种方式将js代码写入数据库中,并在输出界面输出,达到执行js代码的效果。

最常见的例子是留言板,有的留言板不加过滤,就可以将js代码写入到数据库中,就可以通过这个留言板界面盗取用户的cookie,甚至一些更严重的事。

发现漏洞姿势

一般会用 <script>alert(1)</script>来检测是否存在XSS漏洞。

如果存在会直接弹窗并显示1

XSS依赖输出,所以找到输出位置是很重要的,可以输入后查看源代码找找位置

输出的位置基本有以下四种情况:

  • HTML标签之间,如出现在<div>[输出]/</div>的位置上

当遇到一些优先级较高的html标签或者在标签中,如<textarea></textarea><title></title><iframe></iframe>等等,就要先闭合相应的标签,再插入js代码。

payload:

1
</textarea><script>alert(1)<script><textarea>

  • HTML标签之内,如出现在 <input value='[输出]'/> 的位置上

可以闭合标签,事件触发或者用伪协议的方式执行js代码。

payload:

1
2
3
4
/><script>alert(1);</script><input value=
clickmouse=alert(1) x=
javascript:alert(1)//
data:text/html;base64, PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=

  • 成为JavaScript代码的值,在<script>var a='[输出];'</script>的位置上

闭合标签、直接引用代码中的变量。

1
2
3
;</script><script>alert(1);</script><script>a=
";alert(1);//
</script><script>alert(1)//

  • 成为CSS代码的值,出现在<style>body{color:[输出];}</style>的位置上

常存在于ie中

1
1;xss:expression(if(!window.x){alert(1);window.x=1;})

XSS漏洞的绕过

  • 与SQL注入相似,在gbk或gbXXX编码中可以通过宽字节绕过
1
%bf\、%df、%81

*CRLF注入绕过,利用\r\n在HTTP响应头注入回车换行符,并注入X-XSS-Protection: 0,可以防止脚本运行被阻止。

  • IE同域白名单

Referer来源为本域则XSS Filter不生效

  • Chorme同域白名单

<script></script>标签嵌入的是同域内的js文件,XSS Filter就不会防御

  • 大小写混合
    <scRiPt></SCrIpt>

  • 编码(url编码等)

  • 代码混淆(例如:jsfk)

XSS利用姿势

XSS常用利用方式:

  • 弹出cookie并发送给攻击者
  • 伪造登陆界面钓鱼
  • 获取后台地址
  • ……

利用XSS的流程:

  1. 输入正常内容,观察输出界面。
  2. 观察<>\/“‘等字符过滤情况。
  3. 分析输出的解析情况。
  4. 构造payload。