注入攻击常常是针对两大漏洞:一是HTML文档注入漏洞;二是SQL查询注入漏洞。这两者分别形成了跨站脚本(Cross-site Scripting,XSS)注入攻击和SQL注入攻击。
在Web应用的早期,程序员常常用拼接字符串的方式来构造动态SQL语句来创建应用,于是SQL注入成了很流行的攻击方式。当前,参数化查询已经成了普及用法,SQL注入已经不太容易得逞。但是,历史同样悠久的XSS和CSRF(跨站请求伪造)却没有远离。
1.XSS攻击原理
XSS攻击是注入攻击的一种。其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有JavaScript的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
XSS攻击也是一种对浏览器的解释器的代码注入攻击,这些攻击能够通过HTML、JavaScript、VBScript、ActiveX、Flash等其他客户端语言执行。同时,这些攻击也可能造成用户信息泄露、配置更改、cookie窃取等危害,甚至能够用于对Web服务器进行DOS攻击。
与大部分攻击不同的是,大部分攻击往往只涉及两方(攻击者和网站、攻击者和受害者),而XSS攻击则涉及三方,攻击者、客户端、网站。XSS攻击的目的就是窃取客户端的cookie或是其他信息以冒充客户在网站上进行认证,进而在网站上操作任何想进行的操作。
XSS攻击有如下几种类型:
(1)Stored XSS攻击(存储式跨站脚本攻击)
这是最强大的一种XSS攻击,所谓存储跨站攻击是指用户提交给Web应用程序的数据首先被永久地保存在服务器的数据库、文件系统或其他地方,后面且未做任何编码就能显示到Web页面,最典型的就是2005年在MySpace发现的XSS漏洞以及利用该漏洞的Samy MySpace Worm。
举例,假设某个网站允许给其他用户留言,但事实上没有留言而是写入了一段代码,如图7-20所示。服务器将会存储这些信息,当用户单击伪造的留言时,他的浏览器就会执行攻击者的脚本。
图7-20 存储式跨站脚本攻击
(2)Reflected XSS攻击(反射跨站脚本攻击)
这是最常见也是最知名的XSS攻击,当Web客户端提交数据后,服务器端立刻为这个客户生成结果页面,如果结果页面中包含未验证的客户端输入数据,那么就会允许客户端的脚本直接注入到动态页面中。传统的例子是站点搜索引擎,如果搜索一个包含特殊HTML字符的字符串时,通常在返回页面上仍然会由这个字符串来告知搜索的是什么,如果这些返回的字符串未被编码,那么就会存在XSS漏洞了。
初看上去,由于用户只能在自己的页面上注入代码,所以似乎这个漏洞并不严重,但是,只需一点点社会工程的方法,攻击者就能诱使用户访问一个在结果页面中注入了代码的URL,这就给了攻击者整个页面的权限。由于这种攻击往往会需要一些社会工程方法,所以研发人员往往不会太过看重。例如,在服务器上有如下代码:
这就使得浏览器每3秒就刷新一次页面,而且是一个死循环的状态,这就形成了DOS攻击,导致Web服务器挂掉。
(3)基于DOM的XSS攻击(DOM-based XSS)
DOM-based XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如URI、location、refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行。如果DOM中的数据没有经过严格确认,就会产生DOM-based XSS漏洞。
这个漏洞往往存在于客户端脚本,如果一个Javascript脚本访问需要参数的URL,且需要将该信息用于写入自己的页面,但信息未被编码,那么就有可能存在这个漏洞。
DOM-based XSS攻击源于DOM相关的属性和方法,被插入用于XSS攻击的脚本。典型的例子如下。
HTTP请求http://www.DBXSSed.site/welcome.html?name=zhangsan使用以下的脚本打印出登录用户zhangsan的名字,即
如果这个脚本用于请求
时,就会导致XSS攻击的发生。
当用户单击这个链接,服务器返回包含上面脚本的HTML静态文本,用户浏览器把HTML文本解析成DOM,DOM中的document对象URL属性的值就是当前页面的URL。在脚本被解析时,这个URL属性值的一部分被写入HTML文本,而这部分HTML文本却是JavaScript脚本,这使得<script>;alert("XSS")</script>;成为页面最终显示的HTML文本,从而导致DOM-based XSS攻击发生。
DOM-based XSS攻击过程如下:
1)用户登录Web应用;(www.xing528.com)
2)黑客发给用户一个URL;
3)用户单击黑客发来的URL;
4)服务器返回包含JavaScript脚本的页面;
5)黑客提供的URL被页面的JavaScript使用,生成攻击载荷;
6)用户浏览器传送敏感信息给黑客;
7)黑客对Web应用攻击。
如图7-21所示。注意⑤黑客提供的URL被页面的JavaScript使用,生成攻击载荷。
(4)网络钓鱼(Phishing with XSS)
如图7-22所示,输入任何内容,单击“Search”后会显示在左下角。
查看左下角内容的HTML源码,如图7-23所示,看是否有需要闭合的标签。可以看到,无任何限制标签。
图7-21 黑客对Web应用的攻击
图7-22 黑客对Web应用的攻击
图7-23 查看左下角内容的HTML源码
输入:
或者钓鱼(为了排版,用回车截断了)
结果如图7-24所示。
2.XSS攻击的测试
测试是否存在XSS漏洞比较简单的方法是:验证Web应用是否会对一个包含了HTTP的简单脚本的访问请求进行响应,例如,Sambar服务器(5.3)包含一个众所周知的XSS漏洞,向服务器发送如下的请求,从服务器端能够产生一个响应从而在Web浏览器中执行:
这个脚本会在客户浏览器端被执行。
由于JavaScript是区分大小写的,有些人会尝试将所有字符转换为大写字符来避免XSS漏洞,这时最好使用VBScript,因为它是大小写不区分的:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。