免责声明:本文仅记录个人在授权 XSS 靶场中的学习过程,所有 Payload 仅用于合法测试环境,请勿用于未授权站点。
最近整理之前打过的 XSS 随堂靶场,想着既然打都打了,不如把通关过程整理成一篇博客。本文记录了从0x00到0x09共 10 关的 Payload、绕过思路和简单原理,适合刚接触 XSS 的朋友参考
一、环境说明
靶场类型:XSS 练习靶场 / 随堂靶场
浏览器:Chrome
测试方式:在输入框提交 Payload,观察是否弹窗
目标:理解反射型 XSS 中常见的闭合、过滤绕过与标签解析特性
0x00 无过滤:直接注入 script
考点:没有任何过滤,最基础的反射型 XSS。
Payload:
<script>alert(1)</script>
说明:
输入内容被直接输出到页面中,没有经过 HTML 实体编码,也没有过滤标签。浏览器把<script>当作脚本执行,成功弹窗。
0x01 textarea 标签闭合
考点:输入点位于<textarea>标签内部,需要先闭合标签。
Payload:
</textarea><svg/οnlοad=alert(1)>
说明:
如果直接输入<script>,它会被当成 textarea 的文本内容,而不会被执行。所以要先写</textarea>把前面的标签闭合,再插入 SVG 标签,利用onload事件触发 JS。
原文里写的是<textarea><svg/onload=alert(1)>,更准确地说,核心是先闭合</textarea>,再插入执行代码。
0x02 闭合 input 的 value 属性
考点:输入内容被放在<input>的value属性中。
Payload:
"><script>alert(1);</script>
说明:
输入内容在属性值里,直接写<script>不够,需要先用"闭合 value 属性,再用>闭合 input 标签,然后插入 script。
0x03 过滤括号:使用 JS 标签模板
考点:这一关正则全局过滤了括号()利用 JS 标签模板特性,用反引号代替括号调用函数,alert`1` 等价于 alert(1)
Payload:
<script>alert`1`</script>
所以当括号被过滤时,可以用反引号代替括号。注意这里不是单引号,而是反引号`。
0x04 过滤反引号:throw + window.onerror 绕过
考点:括号和反引号都被过滤,需要换一种方式执行代码。
Payload:
<img src οnerrοr="window.οnerrοr=eval;throw'=alert\x281\x29';">
这里利用了两个点:
window.onerror = eval:把全局错误处理函数设置为eval。throw抛出字符串'alert(1);',其中括号用\x28、\x29十六进制表示,绕过括号过滤。
当throw触发错误时,window.onerror会接收错误信息,而它此时是eval,从而执行alert(1)。
0x05 注释闭合:使用--!>
考点:输入内容被包裹在 HTML 注释中,且过滤了常规注释闭合符-->。
Payload:
--!><script>alert(1)</script>
说明:
HTML 注释除了常见的-->,还可以用--!>闭合。靶场过滤了-->,但没有过滤--!>,于是可以突破注释,插入脚本。
0x06 换行绕过on...=过滤
考点:正则过滤了auto、on...=和>等敏感内容。
Payload:
onmouseover
=”alert(1)”
也可以写成 URL 编码形式:
onmouseover%0a="alert(1)"
说明:
源码正则过滤了 auto、on...= 和 >。但正则默认不匹配换行符,利用换行(%0a)把敏感词劈开,服务器无法识别,浏览器却能自动拼接执行,尝试在onmouseover和=之间插入换行符,绕过正则on.*=的匹配
0x07 不闭合标签绕过标签过滤
考点:正则/</?[^>]+>/gi会过滤所有<...>或</...>形式。
Payload:
<svg/οnlοad=alert(1)
说明:
正则要求匹配到>才认为是一个完整标签。这里故意不写最后的>,从而绕过过滤。浏览器有很强的容错解析能力,仍然会把<svg/onload=alert(1)解析成 SVG 标签并执行onload。
0x08 style 标签内闭合
考点:输入内容位于<style>标签内,样式标签不能直接执行 JS。
Payload:
</style ><img src="" οnerrοr=alert(1) >
说明:
需要先闭合</style>。这里在style和>之间加一个空格,写成</style >,可以绕过对</style>的精确匹配,浏览器仍能识别为样式结束标签。闭合后再插入<img>,利用onerror执行 JS。
0x09 src 属性突破
考点:输入必须以http://www.segmentfault.com开头,且会被插入到<script src="输入内容">中。
Payload:
http://www.segmentfault.com" οnerrοr="alert(1)
说明:
源码要求输入以http://www.segmentfault.com开头,才会插入<script src="输入内容">,需突破src属性限制,那可以尝试在合法URL后加双引号闭合src,再添加onerror事件进行绕过