如 2015-05-17
跨站脚本攻击(XSS)是web应用程序中最危险和最常见的安全漏洞之一。安全研究人员发现这个漏洞在最受欢迎的网站,包括谷歌、Facebook、亚马逊、PayPal,和许多其他网站。如果你看看bug赏金计划,大多数报告的问题属于XSS。为了防止跨站脚本攻击,浏览器也有自己的过滤器,但安全研究人员总是想方设法绕过这些过滤器。这个漏洞是通常用于执行cookie窃取、恶意软件传播,会话劫持,恶意重定向。在这种攻击中,攻击者将恶意JavaScript代码到网站,这样由攻击者在脚本中执行的操作。该漏洞是容易找到但很难修补。这就是为什么它可以发现在任何网站如果你尝试。
在这篇文章,我们会看到什么跨站脚本攻击是和如何创建一个筛选器来防止它。我们还将看到几个开放源码库,将帮助您在您的web应用程序中的跨站点脚本漏洞修补。
什么是跨站脚本攻击?
跨站点脚本攻击是攻击者尝试注入恶意的脚本在受信任的网站上执行恶意操作的一种攻击方法。在跨站脚本攻击中,恶意代码在浏览器端上执行对用户影响。跨站点脚本也称为是XSS攻击。第一个问题是记住的是为什么我们称之为“XSS”而不是“CSS。答案很简单,知道谁在web开发工作的人。在网页设计中,我们有级联样式表CSS。所以跨站点脚本被称为XSS,所以它不会不混乱CSS。
现在,回到XSS。当web应用程序中执行一个脚本,攻击者提供给用户,就会发生跨站脚本攻击。这个缺陷可以在一个应用程序任何地方发现,用户输入了不正确的编码。。如果输入不正确编码并过滤,这种注入恶意脚本将发送给用户。一个浏览器没办法知道它不应该相信一个脚本。当浏览器执行的脚本时,在客户端上执行恶意操作。大多数时间,XSS用来窃取cookie和执行会话劫持偷取有效用户会话令牌。
XSS的几个例子:
示例1
你几乎在所有的网站上看到了一个搜索框。在此搜索框中,您可以搜索到网站上任何可用的东西。这个搜索表单看起来这样
<formaction=”search.php”method=”get”>
<inputtype=”text”name=”q”value=”"/>
<inputtype=”submit”value=”send”/>
</form>
在php网页上显示的搜索结果,同时它也列出了在“关键字”的搜索结果。
web页面上,它通常编码如下:
<h3>YouSearchedfor:<!–?phpecho($_GET['q'])?–>
不管一个人搜索什么,它将显示搜索结果在网页上。现在想想如果一个攻击者尝试注入恶意脚本,这边会发生什么。
搜索
“><script>alert(‘XSSinjection’)</script>
如果web应用程序中没有对输入编码和过滤恶意脚本,它将会输入,当被访问时,它将被调用输出到网页上。所以,在关键字的地方,它类似于:
<h3>YouSearchedfor:“><script>alert(‘XSSinjection’)</script>
它将由浏览器执行,将显示一个警告框,提示”XSS注入”。
示例2
假设有一个网站有消息传递功能。在这个网站上,用户可以发送邮件到他们的联系人。基本表单将会看起来像这样:
<formaction=”sendmessage.php”method=”post’”>
<textareaname=”message”></textarea>
<inputtype=”submit”value=”send”/>
</form>
当提交此表单时,该邮件将会存储在数据库中。他从收件箱打开邮件时,另一人将看到消息。假设攻击者已经在消息中发送一些cookie窃取的脚本。此脚本将作为一条消息存储在网站上。当别人试图读取消息时,将执行该脚本窃取cookie和他会话id,现在是攻击者的一面。用一个有效的会话id,攻击者可以劫持其他人的帐户。
跨站脚本攻击的类型
没有标准的分类,但大部分专家将XSS分为三种类型:非持久性XSS、持久性XSS和基于DOM的XSS。
非持久性跨站脚本攻击
非持久性XSS也称为是反射跨站漏洞。它是最常见的XSS类型。在这,注入数据反射给攻击者。如果你看看我们有上面的例子,第一个XSS列子是非持续的攻击。典型的非持久性XSS包含与XSS的链接。
持久性跨站脚本攻击(存储性)
持久性跨站脚本是存储跨站点脚本。当它发生时XSS变量存储在网站的数据库,每当用户打开网页时执行。每次用户打开浏览器,脚本执行。在上述示例中,网站消息的第二个例子是持久的XSS攻击。持久性XSS比非持久性XSS更有害,因为每当用户打开要查看的内容的网页时,将自动执行该脚本。谷歌的orkut是脆弱的持久性xss攻击,破坏网站名誉。
基于DOM的跨站脚本攻击
基于DOM的XSS有时也称为”type-0XSS”。它发生时,XSS变量执行由DOM修改用户的浏览器网页的结果。在客户端的HTTP响应不会更改,但以恶意的方式执行的脚本。这这是最先进和最知名的type-0XSS。大多数情况下,这个漏洞之所以存在是因为开发商不了解它是如何工作。
跨站脚本攻击出现的原因
跨站脚本攻击的主要原因是用户对开发商的信任。开发者很容易认为用户将不会执行什么错误,所以他们创建应用程序而无需使用任何额外的努力,阻止用户输入任何恶意活动。另一个原因是,这种攻击有许多变种。有时,正确地尝试过滤任何恶意脚本的应用程序获取混淆,并允许脚本。在过去的几个月里,我们已经看到了许多种不同的XSS的变体,可以绕过大部分可用的XSS过滤器。
所以我们不能说一个网站是完全保护。但我们可以尽力过滤大部分的事情,因为特别的变量主要来自负责安全的人员,他们也会帮助你,修补并使你的过滤器更智能。
如何创造一个良好的XSS过滤器阻止大部分XSSVectors
在我们开始创建一个XSS过滤之前,我想说一件重要的事情:我们不要求有一个完善的XSS过滤器。研究人员一直觉得奇怪的方法来绕过过滤器。但我们可以努力使一个过滤器,可以过滤容易和著名的XSSvectors。至少你将成为安全的脚本小子。
如果你没有理解你不能修补的XSS。你应该有一个想法,攻击者注入脚本。你应该有XSSvectors知识。
让我们从基本的过滤器:
有一个简单的规则您需要遵循:编码用户指定的每个数据。如果数据不是用户指定的但通过GET参数提供,编码这些数据。即使表单可以包含xssvectors。所以,每次你要在网站上使用一个变量的值,请尝试清除XSS。
这些都是在您的网站在使用之前必须被正确过滤的主要数据。
URL
HTTP引用对象
从表单中获取参数
表单POST的参数
window.location
document.referrer
document.location
document.url
document.urlunencoded
cookie数据
标题数据
数据库中的数据,如果没有正确地验证用户的输入
首先,对所有的<>,进行编码。这应该是您的XSS过滤的第一步。请参见编码如下:
&–>&
<–><
>–>>
”–>"
‘–>'
/–>/
为此,您可以在PHP中使用htmlspecialchars()函数。所有HTML标记和特殊字符,然后对它进行都编码。
$input=htmlspecialchars($input,ENT_QUOTES);
如果$inputwas=“><script>alert(1)</script>
此函数将转换它"><script>prompt(1)</script>
通过解码它在某个地方使用的编码值时,还可以帮助这行:
$input=str_replace(array(‘&’,’<’,’>’),array(‘&amp;’,’&lt;’,’&gt;’),$input);
一个变量可以使用HTML字符,所以你应该也来过滤这些。添加此规则:
$input=preg_replace(‘/(&#*\w+)[\x00-\x20]+;/u’,‘$1;’,$data);
$data=preg_replace(‘/(&#x*[0-9A-F]+);*/iu’,‘$1;’,$input);
但仅靠这些是不会帮你的。有很多地方的输入不需要脚本标签。攻击者可以注入一些事件的函数来执行脚本。有许多方法,攻击者可以绕过这个过滤器。因此,我们需要考虑所有的可能性,并添加一些其他的东西,使滤波器增强。不只是JavaScript,你也需要摆脱串联样式表和XML数据以防止XSS。
此外上OWASP可用来防止XSS的完整详细的指南。这里你可以阅读它。
开放源码库,用于防止XSS攻击
PHPAntiXSS
这是一个不错的PHP库,可以帮助开发人员从跨站脚本漏洞添加额外的一层保护。它会自动检测编码,必须经过过滤的数据编码。库的使用是很容易的。你可以阅读更多关于它在这里:https://code.google.com/p/php-antixss/
xss_clean.phpfilter
这是一个强的XSS过滤器,清除各种URF编码和嵌套的利用。开发人员在分析了各种来源之后建功能。这种编码的功能是可以免费从GitHub。请看这里:https://gist.github.com/mbijon/1098477
HTMLPurifier
这是一个标准的HTML过滤库编写的PHP。这将删除所有恶意代码的输入和防止XSS攻击网站。它也是作为大多数PHP框架的插件用。
在这里阅读更多关于HTML器:http://htmlpurifier.org/
xssprotect
xssprotect是另一个很好的库,给开发者提供了一个方法来清除XSS攻击vectors。此库的工作原理通过创建网页的HTML标签树。然后它将分析页面相匹配的所有标记。之后,它要求过滤器接口来过滤不当的HTML属性和XSS攻击。此库是Java编写的。
阅读更多关于此库:https://code.google.com/p/xssprotect/
XSSHTMLFilter
这是Java的另一个XSS过滤器。这是一个简单的实用工具,可以用来正确的跨站脚本和恶意的HTML代码注入的用户输入。