在我的自定义PHP脚本中找到漏洞?

时间:2010-12-04 23:08:40

标签: php

今天我收到了一封非常令人不快的电子邮件,其中有一个人已经获得了我所有的数据库用户记录,并且他附上了部分屏幕截图作为证据,其中包含与数据库相同的确切信息。

我将如何开始查看问题所在? 那是什么类型的黑客攻击?

任何帮助表示感谢。

8 个答案:

答案 0 :(得分:3)

听起来像SQL注入(最有可能是url或表单参数)。

您可以使用工具来测试您的网站,例如sqlmap,可能需要一段时间才能运行。

您最有可能在不清理网址和表单变量的情况下生成查询。通常可以通过为特定url或表单参数添加单引号来找到SQL注入。

编辑:还有一种替代方案,我在很多年前看到,一个网站正在使用fopen,允许用户通过代理图像请求(以防止它被但是在fopen中,他们没有检查传递的URL请求(作为URL变量)实际上是URL。从日志中可以清楚地看出黑客做了什么:

  • 将proxy.php作为url变量传递(例如/proxy.php?url=proxy.php) - 这返回了proxy.php的源代码。找到包含的文件。
  • 将包含文件的相对路径传递给proxy.php以检索其源
  • 找到具有数据库凭据的那个。
  • 使用mysql客户端连接到数据库,并获取对所有数据的访问权。

答案 1 :(得分:1)

要了解如何在不查看源代码的情况下发现SQL注入漏洞,请阅读“SQL Injection Attacks by Example”和“SQL Injection Walkthrough”。要防止SQL注入,请使用PDO驱动程序和prepared statements,其参数无法注入。

只有预准备语句中的标量值才能转换为参数。语法的其他部分(例如,表和列名称,列表,ASC和DESC顺序说明符)不能参数化。对于这些,不要将用户输入直接传递到语句中。相反,请使用白名单:

$orderDirs = array('up' => 'ASC', 'down' => 'DESC', '' => '');
if (isset($orderDirs[$_REQUEST['dir']])) {
    $orderDir = $orderDirs[$_REQUEST['dir']];
} else {
    $orderDir = $orderDirs[''];
}
$query = $db->prepare("SELECT foo, bar FROM blag WHERE baz > ? ORDER BY foo $orderDir");

答案 2 :(得分:1)

我假设您所指的网站是您个人资料中的网站pokerbanda。我看到你正在运行wordpress 3.0.1(由朋友的工具whatweb报告)。

我还注意到,针对低于3.0.2的wordpress版本报告了一个SQL注入漏洞,因此您的应用程序可能容易受到攻击;看看secunia's vulnerability report

作为第一步,我建议您升级到最新版本的wordpress。您还应该加入他们用于宣布发布的任何邮件列表,并尝试保持最新,特别是对于任何安全修复程序。

答案 3 :(得分:0)

他可以通过SQL注入进入。

答案 4 :(得分:0)

听起来像SQL注入。这意味着您在代码中的某个位置将未经过处理的用户输入传递给SQL查询。像这样:

$sql = "SELECT field FROM table WHERE field = '" . $_GET['formfield'] . "'";

在这种情况下,用户可以提交您的表单,以便formfield变量包含以下内容:

' OR 1=1;--

这意味着传递给您的数据库的SQL变为:

SELECT field FROM table WHERE field = '' OR 1=1;--'

使查询匹配该表中的所有内容,返回所有内容,因为1=1始终返回true。 --用于表示SQL注释,以便数据库在注入SQL后忽略任何内容,即结束'

它可能会变得更糟,因为你也可以注入这样的东西:

'; DROP TABLE table; --

';将关闭您的初始查询,然后新的查询DROP TABLE table;将会运行,如果该表存在则会销毁该表。

检查执行SQL查询的任何位置的代码,包括直接从用户收到的数据。你应该使用一种叫做“预备语句”的东西来处理这些注射事件。

答案 5 :(得分:0)

我假设您使用MySQL。您现在可以采取几种措施来防止: 1.更改您的用户名和密码以访问de database 2.使用mysql_real_escape_string()转义您在网站中执行的每个查询。这有助于防止和SQL注入。

为了用户的安全,另一个建议是使用md5()加密他们的密码。请记住,许多人在网络上使用相同的密码,因此请注意这一点。

最后,我建议你学习如何使用框架进行PHP编码(比方说CodeIgniter或PHP)。其中许多工具已经内置了一些功能,可以帮助您与数据库进行安全交易。

希望它有所帮助!祝你好运!

答案 6 :(得分:0)

可能是SQL注入。

避免它们的最简单方法是在SQL语句中使用转义任何用户提供的文本,例如使用mysql_real_escape_string,pg_escape_string等

答案 7 :(得分:0)

使用公共可写文件夹进行SQL注入是最糟糕的组合。

可以很容易地指示MySQL在公共可写文件夹中编写PHP文件。该PHP文件可以简单地下载一个更大的PHP文件,这是一个后门。从那里,他们可以扫描您的文件系统中的密码,并做任何他们想做的事情。

要找到问题:

  • 查看日志文件,特别是SQL语句(insert / select / outfile等)作为get参数。
  • 在公共可写文件夹中查找新的PHP文件

您还需要提醒所有用户他们的信息已被盗用。如果您以纯文本形式存储密码(这是一件可怕的事情),那么黑客可以开始登录他们的PayPal帐户,因为很多人都会重复使用密码。