什么是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 |
|
访问:
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 | /><script>alert(1);</script><input value= |
- 成为JavaScript代码的值,在
<script>var a='[输出];'</script>
的位置上
闭合标签、直接引用代码中的变量。
1 | ;</script><script>alert(1);</script><script>a= |
- 成为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的流程:
- 输入正常内容,观察输出界面。
- 观察<>/“‘等字符过滤情况。
- 分析输出的解析情况。
- 构造payload。