如何防御跨站脚本攻击

 

跨站脚本攻击(XSS)是web应用程序中最危险和最常见的安全漏洞之一。安全研究人员发现这个漏洞在最受欢迎的网站,包括谷歌、Facebook、亚马逊、PayPal,和许多其他网站。如果你看看bug赏金计划,大多数报告的问题属于 XSS。为了防止跨站脚本攻击,浏览器也有自己的过滤器,但安全研究人员总是想方设法绕过这些过滤器。这个漏洞是通常用于执行cookie窃取、恶意软件传播,会话劫持,恶意重定向。在这种攻击中,攻击者将恶意JavaScript代码到网站,这样由攻击者在脚本中执行的操作。该漏洞是容易找到但很难修补。这就是为什么它可以发现在任何网站如果你尝试。

在这篇文章,我们会看到什么跨站脚本攻击是和如何创建一个筛选器来防止它。我们还将看到几个开放源码库,将帮助您在您的 web 应用程序中的跨站点脚本漏洞修补。

 

什么是跨站脚本攻击?

 

跨站点脚本攻击是攻击者尝试注入恶意的脚本在受信任的网站上执行恶意操作的一种攻击方法。在跨站脚本攻击中,恶意代码在浏览器端上执行对用户影响。跨站点脚本也称为是 XSS 攻击。第一个问题是记住的是为什么我们称之为“XSS”而不是“CSS。答案很简单,知道谁在web开发工作的人。在网页设计中,我们有级联样式表CSS。所以跨站点脚本被称为 XSS,所以它不会不混乱CSS。

现在,回到 XSS。当 web 应用程序中执行一个脚本,攻击者提供给用户,就会发生跨站脚本攻击。这个缺陷可以在一个应用程序任何地方发现,用户输入了不正确的编码。。如果输入不正确编码并过滤,这种注入恶意脚本将发送给用户。一个浏览器没办法知道它不应该相信一个脚本。当浏览器执行的脚本时,在客户端上执行恶意操作。大多数时间,XSS 用来窃取 cookie 和执行会话劫持偷取有效用户会话令牌。

 

XSS 的几个例子:

示例 1

你几乎在所有的网站上看到了一个搜索框。在此搜索框中,您可以搜索到网站上任何可用的东西。这个搜索表单看起来这样

<form action="search.php" method="get">

<input type="text" name="q" value="" />

<input type="submit" value="send" />

</form>

在php网页上显示的搜索结果,同时它也列出了在“关键字”的搜索结果。

web页面上,它通常编码如下:

<h3>You Searched for: <!--?php echo($_GET['q']) ?-->

 

不管一个人搜索什么,它将显示搜索结果在网页上。现在想想如果一个攻击者尝试注入恶意脚本,这边会发生什么。

 

搜索

 

“><script>alert(‘XSS injection’)</script>

 

如果 web 应用程序中没有对输入编码和过滤恶意脚本,它将会输入,当被访问时,它将被调用输出到网页上。所以,在关键字的地方,它类似于:

 

<h3> You Searched for: “><script>alert(‘XSS injection’)</script>

 

它将由浏览器执行,将显示一个警告框,提示"XSS 注入"。

 

示例 2

 

假设有一个网站有消息传递功能。在这个网站上,用户可以发送邮件到他们的联系人。基本表单将会看起来像这样:

 

<form action="sendmessage.php" method="post'">

<textarea name="message"> </textarea>

<input type="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-0 XSS"。它发生时, XSS 变量执行由 DOM 修改用户的浏览器网页的结果。在客户端的 HTTP 响应不会更改,但以恶意的方式执行的脚本。这这是最先进和最知名的type-0 XSS。大多数情况下,这个漏洞之所以存在是因为开发商不了解它是如何工作。

 

跨站脚本攻击出现的原因

 

跨站脚本攻击的主要原因是用户对开发商的信任。开发者很容易认为用户将不会执行什么错误,所以他们创建应用程序而无需使用任何额外的努力,阻止用户输入任何恶意活动。另一个原因是,这种攻击有许多变种。有时,正确地尝试过滤任何恶意脚本的应用程序获取混淆,并允许脚本。在过去的几个月里,我们已经看到了许多种不同的XSS的变体,可以绕过大部分可用的XSS过滤器。

 

所以我们不能说一个网站是完全保护。但我们可以尽力过滤大部分的事情,因为特别的变量主要来自负责安全的人员,他们也会帮助你,修补并使你的过滤器更智能。

 

 

如何创造一个良好的XSS过滤器阻止大部分XSS Vectors

 

在我们开始创建一个XSS过滤之前,我想说一件重要的事情:我们不要求有一个完善的XSS过滤器。研究人员一直觉得奇怪的方法来绕过过滤器。但我们可以努力使一个过滤器,可以过滤容易和著名的XSS vectors。至少你将成为安全的脚本小子。

如果你没有理解你不能修补的XSS。你应该有一个想法,攻击者注入脚本。你应该有XSS vectors知识。

 

让我们从基本的过滤器:

 

有一个简单的规则您需要遵循:编码用户指定的每个数据。如果数据不是用户指定的但通过 GET 参数提供,编码这些数据。即使表单可以包含xss vectors。所以,每次你要在网站上使用一个变量的值,请尝试清除XSS。

 

这些都是在您的网站在使用之前必须被正确过滤的主要数据。

 

URL

HTTP引用对象

从表单中获取参数

表单 POST 的参数

window.location

document.referrer

document.location

document.url

document.urlunencoded

cookie数据

标题数据

数据库中的数据,如果没有正确地验证用户的输入

 

首先,对所有的 <>,进行编码。这应该是您的 XSS 过滤的第一步。请参见编码如下:

& –> &amp;

< –> &lt;

> –> &gt;

” –> &quot;

‘ –> &#x27;

/ –> &#x2F;

 

为此,您可以在 PHP 中使用htmlspecialchars()函数。所有 HTML 标记和特殊字符,然后对它进行都编码。

$input = htmlspecialchars($input, ENT_QUOTES);

 

如果 $input was= “><script>alert(1)</script>

 

此函数将转换它&quot;&gt;&lt;script&gt;prompt(1)&lt;/script&gt;

 

通过解码它在某个地方使用的编码值时,还可以帮助这行:

 

$input = str_replace(array(‘&amp;’,'&lt;’,'&gt;’), array(‘&amp;amp;’,'&amp;lt;’,'&amp;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 攻击

 

PHP AntiXSS

 

这是一个不错的 PHP 库,可以帮助开发人员从跨站脚本漏洞添加额外的一层保护。它会自动检测编码,必须经过过滤的数据编码。库的使用是很容易的。你可以阅读更多关于它在这里: https://code.google.com/p/php-antixss/

 

xss_clean.php filter

 

这是一个强的XSS过滤器,清除各种URF编码和嵌套的利用。开发人员在分析了各种来源之后建功能。这种编码的功能是可以免费从GitHub。请看这里:https://gist.github.com/mbijon/1098477

 

HTML Purifier

 

这是一个标准的HTML过滤库编写的PHP。这将删除所有恶意代码的输入和防止XSS攻击网站。它也是作为大多数 PHP 框架的插件用。

在这里阅读更多关于HTML器:http://htmlpurifier.org/

 

xssprotect

 

xssprotect 是另一个很好的库,给开发者提供了一个方法来清除XSS攻击  vectors。此库的工作原理通过创建网页的 HTML 标签树。然后它将分析页面相匹配的所有标记。之后,它要求过滤器接口来过滤不当的 HTML 属性和 XSS 攻击。此库是 Java 编写的。

阅读更多关于此库:https://code.google.com/p/xssprotect/

 

XSS HTML Filter

 

这是Java的另一个XSS过滤器。这是一个简单的实用工具,可以用来正确的跨站脚本和恶意的 HTML 代码注入的用户输入。

阅读更多关于此库:http://finn-no.github.io/xss-html-filter/

 

结论

 

xss是最危险的网站安全漏洞之一。它以各种方式破坏用户使用网站。主要是它用于执行会话劫持攻击。我们也道修补 XSS 是可能的但我们不能 100%肯定没有人能打破我们的过滤规则。黑客总是找到办法,打破过滤规则安全。如果你真的想要制作一个难XSS 过滤规则,研究大多数可用的 XSS vectors。然后进行的不同种类的攻击模式的列表。分析列表和代码的功能识别攻击模式和阻止攻击。我也增添了几个开放源代码可用库,如果你不知道如何修补该漏洞,以及如何保护您的网站。您可以使用。

 

作为网站所有者或 web 开发人员,它是你的责任,创造一个安全的应用程序,保护用户的数据,所以你必须找到并修补危险 web 应用程序漏洞。

 

如果您创建了一个函数,可以筛过滤XSS vectors函数,您可以共享您通过下面的注释框中的函数。发表评论,表达你的意见。

 
本文由小安攻防研究室翻译,如有翻译错误,请联系管理员,谢谢,希望此文对你有所帮助

原文:tp://resources.infosecinstitute.com/how-to-prevent-cross-site-scripting-attacks/

 

关于作者

 

Pavitra Shandkhdhar 是一个工程研究生和安全研究员。他感兴趣的领域是 web 渗透测试。他喜欢在他的空闲时间在网站和玩计算机游戏中找到的漏洞。他目前是与信息安全研究所研究员。


发表评论

(必填)

(必填)

(以便回访)