XSS(Cross Site Scripting)跨站点脚本是一种代码注入攻击,攻击者利用Web站点的代码漏洞,在用户访问的网页时运行植入的恶意JS脚本,从而影响用户访问或窃取用户信息。
XSS分类
根据恶意脚本的触发方式,XSS攻击可分成三种形式,分别是反射型,存储型和DOM型。
- 反射型XSS:客户端的提交的内容中带XSS脚本,服务器端处理不当,直接在页面上输出内容,导致恶意代码被执行。
例如:恶意用户在页面中的文本框中输入脚本代码,表单提交后,服务器程序未对文本框数据进行转义处理,直接打印到页面上,页面返回到客户端展示时,触发脚本执行。
- 存储型XSS:攻击者向系统中注入恶意代码,恶意代码在数据库中保存,用户访问从数据库中读取的内容生成的页面时,触发恶意代码执行。
例如:恶意用户在论坛发帖内容中包含脚本代码,发帖内容提交后保存到服务器数据库中,当其他用户浏览此帖子时,从数据库中读取帖子内容展示,帖子内容触发脚本在浏览器中执行。
- DOM型XSS:反射型XSS类似,区别在于带恶意代码的数据不通过服务器端处理,直接由客户端JS脚本处理(DOM树操作)时,触发恶意代码执行。
例如:恶意用户在URL参数中植入脚本,用户点击URL在浏览器打开后,JS读取有脚本的参数,未做适当处理,触发脚本执行。
DOM型XSS
在不需要和服务器交互情况下,客户端JS脚本可以在浏览器中直接查找、操作(增删改)DOM模型的元素。同时也能读取用户在浏览器的输入,如URL对象、location对象,并提取相关的参数。如果用户输入的内容总包含恶意脚本,而程序没有进行有效的处理和过滤(如把传输数据直接交给eval执行),就会导致DOM型XSS攻击。
攻击示例
- 网页代码
以下示例代码中,JS代码从浏览器URL中读取param参数,未经校验和处理,直接写入document中,如果参数内容中夹带可执行的JS脚本块,脚本就会直接执行。
<!--dom_xss_sample.html-->
<!DOCTYPE html>
<html>
<head>
<title>DOM XSS</title>
</head>
<body>
<p>DOM XSS攻击示例</p>
</body>
<script>
var pos=document.URL.indexOf("param=") + 6;
document.write(decodeURI(document.URL.substring(pos,document.URL.length)));
</script>
</html>
- 运行效果
- 在URL中,增加
param=<script>alert(0)</script>
参数,参数内容通过document.write直接写入到页面中。
- 参数中的脚本代码块直接执行,触发XSS攻击。
除了直接在参数中带显而易见的脚本外,在其他标签中夹杂可执行的事件也是常见方式,如在img标签的onerror事件中执行脚本。示例如下:param=<img src="null" onerror="alert('1')" />
从以上示例中可以看出,造成DOM型XSS漏洞攻击,主要有两个过程:
- 在输入的数据源中夹带了恶意脚本
- 程序未对输入进行必要的处理,导致恶意脚本执行
其中,输入除了上述document.URL
,还包括如下数据源:
- document.URL
- document.URLUnencoded
- document.location
- document.referrer
- window.location
- location
- location.href
- location.search
- location.hash
- location.pathname
对输入的处理,除了上述document.write
,还包括如下方法:
- 直接执行脚本类
- eval(…)
- window.execScript(…)
- window.setInterval(…)
- window.setTimeout(…)
- 写HTML页面类
- document.write(…)
- document.writeln(…)
- element.innerHTML(…)
- 直接修改DOM类
- document.forms[0].action=…
- document.attachEvent(…)
- document.create…(…)
- document.execCommand(…)
- document.body. …
- window.attachEvent(…)
- 替换文档URL类
- document.location=…
- document.location.hostname=…
- document.location.replace(…)
- document.location.assign(…)
- document.URL=…
- window.navigate(…)
- 打开/修改窗口类
- document.open(…)
- window.open(…)
- window.location.href=… (and assigning to location’s href, host and hostname)
更多的DOM型XSS攻击方法,可参考如下文档 DOM Based Cross Site Scripting or XSS of the Third Kind
防御方法
对于XSS攻击的防御方法,总体思想概括为3条:
- 不要信任任何用户输入
- 对输入进行校验
- 对输出进行转义,包括HTML片段,HTML属性,URL输出、JS输出,CSS输出。
- 对于HTML片段的转义,一般建议把单引号、双引号、大于号、小于号、连词号进行转义。
& --> &
< --> <
> --> >
" --> "
' --> '
/ --> /
- 对于HTML属性,除字母数字外的其他字符,全部转化为
&#xHH
格式的ASCII码。 - 对于URL输出,除字母数字外的其他字符,全部转化为
%HH
格式的ASCII码。 - 对于JS输出,除字母数字外的其他字符,全部转化为
\xHH
格式的ASCII码。 - 对于CSS输出,除字母数字外的其他字符,全部转化为
\HH
格式的ASCII码
相关防御方法,OWASP组织网站上有比较全面的介绍,此处不再累赘,请参考官方指导。
- XSS攻击防御指导:Cross Site Scripting Prevention Cheat Sheet
- DOM型XSS攻击防御指导:DOM based XSS Prevention Cheat Sheet
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。