在PHP应用程序修复CSRF漏洞

CSRF(跨站点请求伪造)是排名前10位的OWASP漏洞之一。它利用了网站在浏览器上的信任。这个漏洞危害用户的,通过使用用户的行动可以修改或删除用户数据。攻击的优势是,作为一个有效的用户执行操作,但用户从不知道他做了什么。如果目标为网站管理员帐户,攻击者可以执行的Web应用程序管理员的操作。不好的编码和错误是造成web应用程序存在安全漏洞的主要原因。

有时,它是被攻击者典型的利用这个漏洞。在这方面的详细的文章中,我们将了解跨站点请求伪造漏洞。我们还将创建一个表单,具有很强的保护从这个漏洞。我们还将看到流行的框架,可以用来修补此漏洞的脚本和方法。

什么是跨站请求伪造攻击?

CSRF(跨站请求伪造攻击)是一个恶意的行为,最终从用户(有效用户)的一个无辜的网站的浏览器,他/她是运行网站的一个有效的会话。。如果用户在网站上进行身份验证,从他的浏览器中执行的每一个动作将是属于他的。该网站还认为该请求是来自用户。

这种攻击是最常见的影响是改变密码,从银行账户的资金转移,一个项目的采购。

这种攻击是产生假的请求在原网站执行。当这些请求被发送到用户浏览器已验证的网站,该网站认为该请求是由用户发出的。在下一节中,我们将看到CSRF是如何工作的。

CSRF是如何工作的:

大部分的时候,攻击者使用一个第三方可信网站完成这种攻击。假链接张贴在论坛和社交网站,可能会导致CSER。这次攻击是一个序列的请求和响应。假设一个受害者是登录在目标网站上。他发现了论坛上的一个链接。执行一个恶意链接的链接在目标网站。他点击了链接和链接发送给目标网站恶意请求。

现在,例如:

1、您登录在一个网站http://targetwebsite.com上。

2、这个网站有一个删除账号的按钮在页面上。这个按钮通过表单提交一个删除请求。

<form action=’http://targetwebsite.com/deleteaccount.php‘ method=’post’>

<input type=’text’ value=’Delete’ name=’delete’>

</form>

3、当单击该按钮时,网站将删除的帐户登录的用户。所以,它依赖于活动的会话来识别用户。

4、攻击者伪造了一个页面,提交该表单载入页面。他已经在论坛发出了这个链接。

5、你发现的有趣的链接点击。

6、一旦你点击了链接,页面提交表单。表单的操作将删除您的帐户,因为你有一个活跃的会话。

7、这样,您的帐户已被删除的攻击者没有你的知识。但是请求都是从你的浏览器。

我相信:这个简单的例子已经明确漏洞如何影响网站的用户。同样,如果您的银行应用程序存在漏洞,我们可以显示它如何影响你的银行帐户。

如果动作是通过一个GET请求,攻击者还可以请求一个图像标记。图像的SRC属性将表单上的操作链接。当页面上的图像加载,它将执行操作。

<img src="http://targetwebsite.com/app/transferFunds?amount=25000&targetAccount=attackersAcctnumber" width="0" height="0" />

CSRF攻击的误解

跨站请求伪造是最危险的Web应用程序的漏洞之一。因此,必须仔细检查和修补。但是有几个误区的修补。一般来说,开发人员使用一些方法来修补漏洞。但这些方法都不足以预防这个漏洞。修补CSRF有一些错误的方法:

使用的关键任务POST请求

1、开发者认为很容易创建一个假的GET请求。但是,创建一个假的POST请求是不容易的。如果你是为web开发安全,您可以轻松地创建一个页面,可以通过JavaScript在页面加载的形式提交。这样永远不会阻止CSRF。所以,如果你要套用这个逻辑,你应该三思而后行。任何隐藏的表单可以通过JavaScript触发。

2、另一个CSRF修补错误的例子是URL重写。开发人员创建URL重写方法具有独特会话ID的URL。这使得的URL不可预知的。但是这种方法也暴露在URL中的用户的凭据。可能防止CSRF,但它是对用户同样有害。

3、有时网站使用多步交易过程,如果我们在以前的帐户中删除的列子,假设要求删除帐户后,网站会对要求进行确认。如果两个请求没有阻止CSRF,攻击者可以预测和执行所有步骤或减少步骤通过某些方面的交易请求。

很少有其他无用预防方法并不重要,讨论在这里。

有效预防CSRF漏洞方法

检查 Referral Header

检查Referral Header可以帮助预防CSRF。如果请求是来自其他域,它一定是假的请求即阻止它。总是允许来自同一个域。如果网站具有已经开放重定向漏洞,这种方法失败。击者可以通过使用开放的重定向执行GET CSRF

如今,大多数应用程序使用HTTPS连接。在这里的引用将被省略。如果网站使用HTTPS,所以这种方法不会的帮助。因此,我们将不得不寻找另一种方式。

在forms验证验证码

这是另一个不错的方式来阻止CSRF攻击方法。验证码验证过程最初是发达国家以防止机器人在forms的垃圾邮件。但它也可以有助于阻止CSRF。为验证码是在客户端生成随机,攻击者无法猜测模式。所以,他将永远无法发送正确的验证码和一个假的请求。所有虚假请求将被一个验证码验证功能受阻。

这个方法不是很人性化。大多数用户不希望在网站上填写的验证码。我们应该试图找到防止CSRF漏洞的方式对用户无需增加任何额外负担。

不可预知的同步令牌模式

这是最安全的方法预防CSRF。与验证码验证,该方法具有与用户无关。因此,用户不知道的东西已经被添加到保护他们。在该方法中,网站在每个表单中生成一个随机的令牌作为一个隐藏的值。这个标记是与用户当前的会话关联的。一旦表单被提交后,网站验证是否随机令牌通过请求。如果是的话,那么验证否是正确的。通过使用这种方法,开发人员可以很容易地确定请求用户是否被攻击。

</pre>

<form action="accountdelete.php" method="post"><input type="hidden" name="CSRFToken" value="OWY4NmQdwODE4hODRjN2DQ2NTJlhMmZlYWEwYzU1KYWQwMTVhM2JmLNGYxYjJiMGI4jTZDE1ZDZjMTViMGYwMGEwOA==" />

...</form>

<pre>

这种方法的强度取决于令牌生成方法。所以,总是试图生成令牌的方式,它始终是不可预知的。

所以,如果你正在考虑实现这项,尽量使用随机。

您可以使用

$randomtoken = md5(uniqid(rand(), true));

或尝试这个

$randomtoken = base64_encode( openssl_random_pseudo_bytes(32));

用base64_encode,它可确保生成的值不会打破你的HTML布局与HTML字符。

生成这randomgtoken,一旦会话后启动登录,并添加到您的会话变量。

$ _SESSION [:'csrfToken'] = $ randomtoken。

将任何用户添加到form表单

<input type=’hidden’ name=’csrfToken’ value=’<?php echo($_SESSION['csrfTOken']) ?>’ />

每个会话的csrftoken是独特的,在每一个新会话,它将再次生成和然后varified表单请求。

您可以使用一个单一的CSRF令牌在单个会话中的所有形式。但使用不同的所有形式可能会更安全。但是,使用这种方法可以创建为产生不同的csrfToken的不同形式的麻烦,当用户打开多个标签,并提交逐一多种形式。

有几个开源的PHP类和库也可。你可以使用这些开源类实现一个强大的抵御CSRF漏洞。

很少有开源的库:

1、Clfsrpm

Clfsrpm是一种流行的PHP类,给人以强烈的措施防止CSRF。它给出了一些公共的功能,你可以使用CSRF令牌生成和验证。复杂的部分已经被开发商完成。

你可以阅读更多链接下载类:http://www.clfsrpm.net/csrf/

2、NoCSRF

NoCSRF是另一种简单的防御CSRF令牌生成和检查类写在PHP5。它还配备了易于理解的例子来学习如何正确地实现这个类在Web应用程序。

可以从这里下载NoCSRF:https://github.com/BKcore/NoCSRF

3. csrf by Skookum

这是另一个PHP实现保护的CSRF PHP。代码是免费。所以你可以复制和在应用程序中使用。

从这里获取代码: https://github.com/Skookum/csrf/blob/master/classes/csrf.php

4. anticsurf

anticsurf是另一个小型PHP库,可用于阻止CSRF在PHP中的web应用程序。

这个库声称给暴力攻击有很强的entropy 。它还实现了一次性使用令牌提供超时限制。

阅读更多关于这个PHP库,并从这里下载:https://code.google.com/p/anticsurf/

5. CSRF-Magic

CSRF-Magic是另一中强大的实现方法,可以防止CSRF攻击的网站。库是免费在线演示。你可以只包含在你的PHP文件的顶部。该库将完成剩下的工作。它重新写脚本在您的网站上,然后拦截POST请求的形式来检查令牌注入,但这意味着它自动添加所有你的传统不安全的形式。你不需要添加额外的代码。只包括库文件的顶部。

其中一个最简单的CSRF保护库可用于PHP应用程序...

下载库,在这里看到的演示:http://csrf.htmlpurifier.org/

6.CSRF Protection

CSRF Protection 也是一个不错的和简单的类。虽然,它没有附带的教程。但它有完整的代码注释,让你理解如何使用这个库。它给你一些函数来生成,然后验证CSRF令牌。在下载页面,它给了几个示例代码显示了如何使用这个类来生成您自己的Web应用程序,然后验证CSRF令牌。

下载从github CSRF保护库,通过此链接:https://github.com/XCMer/csrfprotect

根据您的选择,您可以使用任何上述类或库。但不要忘了通过评论与我们分享。

用户方面防御

CSRF是一种有害的漏洞,因此,用户还应该按照几个步骤,以确保其安全性。这些都是几个重要的点:

始终在不使用时登出重要的Web帐户。

不要使用重要的网络账号(如在线银行)免费上网

不要使用脚本浏览器插件来保护自己免受恶意脚本

结论

在这篇文章中,我们已经看到,跨站请求伪造是一种有害的脆弱性和影响用户的帐户。我们也看到了各种方法来防止这种攻击,并保护用户的帐户。如果网站有一个跨站脚本漏洞,表演CSRF攻击变得更加容易。攻击者可以创建一个的自动蠕虫击败CSRF防御。

在这篇文章中,我们已经讨论了各种开源库和类。这些类可以直接使用基于PHP的Web应用程序内,以防止CSRF漏洞。Web开发人员应该照顾网站的安全,并按照给定的提示。有各种工具和手动的方法可用来测试CSRF。最常用的工具是OWASP CSRF Tester。你可以从这里下载:https://www.owasp.org/index.php/Category:OWASP_CSRFTester_Project

如果你想手动启动,您可以查看代码和看到的形式。如果随机令牌不可用,你应该添加可用的开源类。我敢肯定,现在你知道足够的有关CSRF的修补。如果你有什么话要说,你可以与我们分享它通过评论。

本文有小安攻防研究室翻译,转载请注明版权(www.cnnetsec.com),翻译如有错误请联系管理员更正,谢谢,希望本文对您有所帮助。

作者简介

Pavitra Shandkhdhar是一个工学毕业的研究生和安全研究员。他感兴趣的领域是网络渗透测试。他喜欢找漏洞在网站和玩电脑游戏在空闲时间。他是目前信息安全研究所研究员。

原文地址:http://resources.infosecinstitute.com/fixing-csrf-vulnerability-in-php-application/


发表评论

(必填)

(必填)

(以便回访)