12.2 进行中的XSS攻击

要了解XSS漏洞导致的严重后果,有必要分析一些真实的XSS攻击示例,这有助于我们了解XSS攻击能够执行的各种恶意操作,以及如何针对受害者实施这类攻击。

12.2.1 真实XSS攻击

2010年,Apache Foundation被攻击者利用其问题追踪应用程序中的漏洞、通过反射型XSS攻击攻破。首先,攻击者发布一个使用重定向服务进行模糊处理的链接,该链接指向一个利用上述XSS漏洞获取登录用户的会话令牌的URL。如果管理员单击该链接,他的会话将被攻破,攻击者将获得对应用程序的管理访问权限。然后,攻击者修改某个项目的设置,将该项目的上传文件夹更改为应用程序的Web根目录中的可执行目录。随后,攻击者向此文件夹上传一个木马登录表单,从而获取特权用户的用户名和密码。通过这种方法,攻击者确定一些在基础架构的其他系统中重复使用的密码,并完全攻破这些系统,将攻击范围扩展到易受攻击的Web应用程序之外。

有关此次攻击的详情,请参阅以下URL:

img346b

2005年,发现社交网络站点MySpace易于受到保存型XSS攻击。虽然MySpace的应用程序实施了过滤,防止用户在他们的用户资料页面嵌入JavaScript脚本,但是,一位名叫Samy的用户找 到了一种避开这些过滤的方法,并在用户资料页面中插入了一些JavaScript脚本。如果一名用户查看他的用户资料,这段脚本就会执行,导致受害者的浏览器执行各种操作。这就造成了两个严重后果:首先,它把Samy加为受害者的“朋友”;其次,它把上述脚本复制到受害者自己的用户资料页面中,因此,任何查看受害者用户资料的用户也会成为这次攻击的受害者。结果,一个基于XSS的蠕虫在因特网上迅速扩散,几小时内,Samy收到了近100万个朋友邀请。为此,MySpace被迫关闭它的应用程序,从所有用户的资料中删除恶意脚本,并修复反XSS过滤机制中的缺陷。

有关此次攻击的详细信息,请参阅以下URL:

http://namb.la/popular/tech.html

当收件人查阅电子邮件时,邮件内容在浏览器中显示;Web邮件应用程序的这种行为本身就存在着保存型XSS攻击风险。电子邮件中可能包含HTML格式的内容,因此应用程序会立即将第三方HTML复制到向用户显示的页面中。2009年,一家名为StrongWebmail的Web邮件提供商悬赏1万美元,征询能够侵入其CEO电子邮件的黑客。最终,黑客在该Web邮件应用程序中发现一个保存型XSS漏洞,如果收件人查看恶意电子邮件,黑客就可以执行任意JavaScript。于是,黑客们向该CEO发送了一份恶意电子邮件,攻破了他在应用程序上的会话,从而赢得了赏金。

有关此次攻击的详细信息,请参阅以下URL:

http://blogs.zdnet.com/security/?p=3514

2009年,Twitter成为了两个XSS蠕虫的受害者,这两个蠕虫利用保存型XSS漏洞在Twitter用户间进行传播,并发布推文来宣传蠕虫作者的网站。人们还在Twitter中发现各种基于DOM的XSS漏洞,这主要是因为它在客户端大量使用类似于Ajax的代码所致。

有关这些漏洞的详细信息,请参阅以下URL:

www.cgisecurity.com/2009/04/two-xss-worms-slam-twitter.html

http://blog.mindedsecurity.com/2010/09/twitter-domxss-wrong-fix-andsomething.html

12.2.2 XSS攻击有效载荷

迄今为止,我们已经重点分析了典型的XSS攻击有效载荷,如截获一名受害者的会话令牌,劫持他的会话,进而“作为”受害者使用应用程序,执行任意操作并占有该用户的账户。实际上,还有其他大量的攻击有效载荷可通过任何类型的XSS漏洞传送。

1.虚拟置换

这种攻击需要在一个Web应用程序页面注入恶意数据,从而向应用程序用户传送误导性信息。它包括简单向站点中注入HTML标记,或者使用脚本(有时保存在外部服务器上)在站点中注入精心设计的内容和导航。这种攻击被称为虚拟置换(virtual defacement),因为攻击者实际上并没有修改保存在目标Web服务器上的内容,而是利用应用程序处理并显示用户提交的输入方面的缺陷实现置换。

除造成无关紧要的损害外,这种攻击也可用于严重的犯罪活动中。一个专门设计的置换,如果以可信的方式传送给适当的接受者,可能会被新闻媒体报导,对人们的行为、股票价格等造成重大影响,从而帮助攻击者从中获得经济利益,如图12-6所示。

img348a

图12-6 一次利用XSS漏洞的虚拟置换攻击

2.注入木马功能

这种攻击造成的后果远比虚拟置换严重,它在易受攻击的应用程序中注入实际运行的功能,旨在欺骗终端用户执行某种有害操作(如输入敏感数据),随后将它们传送给攻击者。

在一个明显的攻击中,攻击者注入的功能向用户显示一个木马登录表单,要求他们向攻击者控制的服务器提交他们自己的证书。如果由技巧熟练的攻击者实施,这种攻击还允许用户无缝登录到真正的应用程序中,确保他们不会发觉访问过程中的任何反常情况。然后,攻击者就可以自由使用受害者的证书实现自己的目的。这种类型的有效载荷非常适于用在钓鱼攻击中,向用户传送一个经过专门设计、连接可信应用程序的URL,并要求他们正常登录以访问这个URL。

另一种明显的攻击是以某种有吸引力的条件为诱饵,要求用户输入他们的信用卡信息。例如,图12-7是一个由Jim Ley设计的概念验证攻击,它利用了2004年在Google中发现的一种反射型XSS漏洞。

img348b

图12-7 一次注入木马功能的反射型XSS攻击

由于这些攻击中的URL指向真实应用程序的可信域名,如果在必要时使用有效的SSL证书,它们就比纯粹的钓鱼Web站点更有可能说服受害者提交敏感信息;后者通常位于另一个域中,而且只是克隆目标Web站点的内容。

3.诱使用户执行操作

如果攻击者劫持受害者的会话,那么他就可以“作为”该用户使用应用程序,并代表这名用户执行任何操作。但是,这种执行任意操作的方法并不总能达到想要的目的。它要求攻击者监控他们自己的服务器,看其是否收到被攻破的用户的会话令牌;而且,它还要求他们代表每一名用户执行相关操作。如果要向许多用户实施攻击,这种方法并不可行。而且,它在应用程序的日志中留下相当明显的痕迹,用户在调查过程中利用它可迅速确定执行未授权操作的计算机。

如果攻击者想要代表每位被攻破的用户执行一组特殊的操作,就可以采用另一种劫持会话的方法,即利用攻击有效载荷脚本执行操作。如果攻击者想要执行某个需要管理权限的操作,如修改他控制的一个账户的权限,这种方法特别有用。由于用户众多,要劫持每名用户的会话并确定其是否为管理员,可能需要付出极大的努力。一种更加有效的方法是,诱使每个被攻破的用户尝试升级攻击者账户的权限。大多数尝试都会失败,但如果一个管理用户被攻破,攻击者就能够成功提升他的权限。我们将在13.1.1节说明各种诱使其他用户执行操作的方法。

前面描述的MySpace XSS蠕虫就是这种攻击有效载荷的一个典型示例;同时,它说明这种攻击者可以毫不费力就代表大量用户执行未授权操作的严重性。这种攻击利用一系列采用Ajax技术的复杂请求(如第3章所述)来执行传播蠕虫所需的各种操作。

如果攻击者的主要目标为应用程序,并且希望在攻击时尽可能地保持隐秘,他就可以利用这种类型的XSS攻击有效载荷让其他用户执行他选择的、针对应用程序的恶意操作。例如,攻击者可以促使其他用户利用一个SQL注入漏洞在数据库的用户账户表中添加一个新的管理员用户。然后,攻击者就可以控制这个新账户,通过它执行恶意操作;但是,任何对应用程序日志的调查结论却将怀疑对象指向这名新建的用户。

4.利用信任关系

上文已经介绍了可被XSS利用的一种重要的信任关系:浏览器信任由发布cookie的Web站点提交的JavaScript。有时,在XSS攻击中还可以利用其他一些信任关系。

img002 如果应用程序采用激活自动完成功能的表单,由应用程序提交的JavaScript就可以截获任何以前输入的、用户浏览器保存在自动完成缓存中的数据。通过示例化相关表单,等待浏览器自动完成它的内容,然后查询表单字段值,上述JavaScript脚本就能够窃取这些数据并将其传送至攻击者的服务器。这种攻击比注入木马功能更加强大,因为它不需要用户执行任何操作就可以截获敏感数据。

img002 一些Web应用程序推荐或要求用户把其域名添加到浏览器的“可信站点”区域内。这种要求几乎总会造成不利影响,并意味着攻击者可以利用任何XSS类型的漏洞在受害用户的计算机上执行任意代码。例如,如果一个站点在Internet Explorer的可信站点区域内运行,那么注入以下代码将会在用户的计算机上启动Windows计算器程序。

img350

img002 Web应用程序通常采用包含强大方法的ActiveX控件(请参阅第13章)。一些应用程序在该控件内核实调用的Web页面确实属于正确的Web站点,力求防止第三方滥用这种控件。在这种情况下,通过XSS攻击仍然可以滥用这个控件,因为这时调用的代码可以通过控件实施信任检查。

img003  错误观点  “钓鱼与XSS攻击只会影响公众因特网上的应用程序。”

XSS漏洞可以影响任何类型的Web应用程序;通过一封群发电子邮件传送的针对内联网应用程序的攻击可以利用两种形式的信任关系。首先,在同事之间传送的内部电子邮件利用他们之间的社交信任关系。其次,与公众因特网上的Web服务器相比,受害者的浏览器往往会更加信任企业Web服务器。例如,如果一台计算机属于企业域的一部分,那么在访问内联网应用程序时,浏览器会默认使用较低的安全级别。

5.扩大客户端攻击范围

攻击者可以采用各种方式直接攻击访问一个Web站点的用户。所有这些攻击都可以通过易受攻击的应用程序中的一个跨站点脚本漏洞传送,当然,用户偶然访问的任何恶意站点也可以直接传送它们。我们会在第13章的最后详细介绍这种类型的攻击。

12.2.3 XSS攻击的传送机制

确定一个XSS漏洞并设计出利用它的适当有效载荷后,攻击者需要找出办法向应用程序的其他用户传送攻击。我们在前面已经讨论了几种传送方法。实际上,攻击者还可以使用其他许多传送机制。

1.传送反射型与基于DOM的XSS攻击

除了通过电子邮件向随机用户大量发送专门设计的URL这种明显的钓鱼向量外,攻击者还可以尝试使用以下机制传送反射型或基于DOM的XSS攻击。

img002 在有针对性的攻击中,攻击者可以向个体目标用户或少数几名用户发送一封伪造的电子邮件。例如,可以向管理员发送一封明显由已知用户送出的电子邮件,抱怨某个特殊的URL造成错误。如果攻击者想要攻破某个特殊用户的会话(而非截取随机用户的会话),实施合理、可靠的针对性攻击往往是最有效的传送机制。有时我们也把这类攻击称为“鱼叉式钓鱼”。

img002 可以在即时消息中向目标用户提供一个URL。

img002 第三方Web站点上的内容与代码可用于生成触发XSS漏洞的请求。各种常见的应用程序允许用户发布数量有限的HTML标记,这些标记将按原样向其他用户显示。如果可以使用GET方法触发XSS漏洞,攻击者就可以在第三方站点上发布一个指向某恶意URL的IMG标 签,任何查看以上第三方内容的用户将在不知情的情况下请求该恶意URL。

或者,攻击者可以创建自己的Web站点,在其中包含诱使用户访问的有趣内容,但也可能含有一些脚本,导致用户的浏览器向易受攻击的应用程序提出包含XSS有效载荷的请求。如果某用户登录以上易受攻击的应用程序,并且碰巧浏览了攻击者的站点,该用户访问以上易受攻击的应用程序的会话将被攻破。

建立适当的Web站点后,攻击者可以使用搜索引擎操纵技巧生成某些用户提交的访问,例如,将相关关键字放入站点内容中并使用相关表达式将其链接到相关站点。但是,这种传送机制与钓鱼攻击无关,因为攻击者的站点并未试图模仿它所针对的站点。

注意,这种传送机制使得攻击者可利用只通过POST请求触发的反射型与基于DOM的XSS漏洞。但是,利用这些漏洞,攻击者明显不能通过向受害用户发送一个简单的URL来传送一次攻击。然而,某个恶意Web站点可能包含一个HTML表单,它使用POST方法并以易受攻击的应用程序作为它的目标URL。其页面上的JavaScript或导航控件可用于提交表单,成功利用漏洞。

img002 在另一种利用第三方Web站点的攻击中,一些攻击者付费购买许多链接至一个URL的横幅广告,该URL中包含一个针对某易受攻击的应用程序的XSS有效载荷。如果一名用户登录这个易受攻击的应用程序,并单击广告,那么他登录该应用程序的会话就会被攻破。因为许多提供商使用关键字将广告分配给与其有关的页面,有时就会出现这样的情况:一个攻击特定应用程序的广告恰巧被分配在这个应用程序的页面中。这不仅提高了攻击的可信性,而且还可以确保在攻击者实施攻击时,单击广告的用户正在使用那个易受攻击的应用程序。此外,由于目标URL现在为“本站点” URL,该攻击能够避开用于防范XSS的基于浏览器的机制(将在本章后面部分详细介绍)。另外,由于许多横幅广告提供商按点击率收费,这种技巧使得攻击者能够“买进”大量用户会话。

img002 许多应用程序执行一种“推荐给朋友”或向站点管理员发送反馈的功能。这种功能通常允许用户生成一封电子邮件,其内容与收件人均可自由设置。攻击者能够利用这种功能,通过一封实际源自自己服务器的电子邮件传送XSS攻击,提高邮件被技术熟练的用户与反恶意软件的软件接受的可能性。

2.传送保存型XSS攻击

保存型XSS攻击共有两种传送机制:带内与带外传送机制。

带内传送机制适用于大多数情况,这时漏洞数据通过主Web界面提交给应用程序。用户控制的数据最终显示给其他用户的常见位置包含:

img002 个人信息字段,如姓名、地址、电子邮件、电话等;

img002 文档、上传文件及其他数据的名称;

img002 提交给应用程序管理员的反馈或问题;

img002 向其他应用程序用户传送的消息、注释、问题等;

img002 记录在应用程序日志中,并通过浏览器显示给管理员的任何内容,如URL、用户名、HTTP Referer、 User-Agent等;

img002 在用户之间共享的上传文件内容。

在这些情况下,只需向应用程序页面提交XSS有效载荷,然后等待受害者查看恶意代码,就可以传送XSS有效载荷。

带外传送机制适用于通过其他渠道向应用程序提交漏洞数据的情况。应用程序通过这种渠道接收数据,并最终在主Web界面生成的HTML页面中显示它。前面描述的针对Web邮件应用程序的攻击就是这种传送机制的典型示例。这种攻击向一个SMTP服务器传送恶意数据,并最终在一条HTML格式的电子邮件消息中向用户显示这些数据。

3.链接XSS与其他攻击

XSS漏洞有时可与其他漏洞链接在一起,造成破坏性的后果。笔者曾遇到一个应用程序,它的用户昵称中存在一个保存型XSS漏洞。这个数据的唯一用途是在用户登录后显示一条个性化欢迎消息。该昵称从不向其他应用程序用户显示,因此,最初似乎没有任何攻击向量会致使用户在编辑昵称时造成问题。在其他各点都相同的情况下,这种漏洞属于风险极低的漏洞。

但是,该应用程序还存在另一个漏洞。由于访问控制存在缺陷,任何用户都可以编辑其他用户的昵称。同样,这个问题本身并不严重。有哪个攻击者会对修改其他用户的昵称感兴趣呢?

然而,如果将这两个低风险的漏洞链接在一起,攻击者就可以完全控制应用程序。首先,攻击者只需设计一个自动攻击,在每个应用程序用户的昵称中注入一段脚本。每次用户登录应用程序,这段脚本就会执行,并将该用户的会话令牌传送到攻击者控制的服务器中。应用程序的一些用户为管理员,他们经常登录,能够创建新用户并修改其他用户的权限。攻击者只需等待一名管理员登录,劫持管理员的会话,然后升级自己的账户,获得管理权限。因此,这两个漏洞同时出现会给应用程序的安全造成极大的风险。

在另一个示例中,仅向提交它们的用户显示的数据可以通过跨站请求伪造攻击(请参阅第13章了解详细信息)进行更新。同时,应用程序中还包含保存型XSS漏洞。同样,如果单独出现,这两个漏洞的风险相对较低。但是,如果被攻击者结合在一起加以利用,它们就可能会造成严重的影响。

img003  错误观点  “我们不必担心低风险XSS漏洞;用户只能利用它攻击他们自己。”

如上所述,在适当的情况下,即使是明显低风险的漏洞,也会为更具破坏性的攻击打下基础。实施深层安全防御必须删除每一个已知的漏洞,无论它多么无关紧要。笔者就曾利用XSS在页面响应中插入文件浏览器对话框或AcitveX控件,侵入与目标Web应用程序绑定在一起的Kiosk模式系统。在想出办法利用细微漏洞方面,渗透测试员应该始终假定攻击者比自己更富有想象力。