PHP magic_quotes_gpc漏洞

时间:2010-01-24 12:34:06

标签: php sql-injection exploit magic-quotes

我已被分配到我公司的一个遗留Web应用程序中,经过一两天的搜索,我发现了一个类似于以下内容的SQL注入向量:

mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");

我尝试对此执行SQL注入测试,但由于PHP的magic_quotes_gpc模块已打开,因此失败了。

我知道magic_quotes_gpc ,但我们有数百个 - 如果不是数千个 - 与上面类似的代码行。我们根本无法将magic_quotes_gpc关闭,因为这样会使这样的代码对攻击开放。

我想知道上面的代码是如何'可利用的',以及我们是否应该立即修复它,或者包括将其修复到我们的其他重构任务中的任务。

3 个答案:

答案 0 :(得分:8)

将网站转移到magic_quotes_gpc以外的常用方法是添加包装函数:

function m($s) {
    if (get_magic_quotes_gpc())
        $s= stripslashes($s);
    return mysql_real_escape_string($s);
}

mysql_query("SELECT * FROM foo WHERE bar='".m($_GET['baz'])."'");

这将解决addslashes无法识别字符集的问题,在某些情况下可能导致其易受攻击,并且通常会使代码继续像以前那样“正常工作”。

然而,从长远来看,依赖于输入转义是不可持续的,因为它会将斜杠乘以您没有插入数据库的输入字符串,并且无法转义您从其他来源插入数据库的字符串。这是magic_quotes_gpc错误的真正原因:它将输出阶段编码应用于输入阶段。

因此添加包装函数,然后慢慢更新所有SQL插值以使用它。当你得到它们时,你可以关闭魔法引号。

答案 1 :(得分:0)

只要魔术引号打开,并且你没有使用一些特殊的字符编码,它可以通过它来解决问题,你应该没问题 - 可以这么说。问题是,无论出于什么原因,魔术引号都不活跃(服务器更改,配置更改),您将需要修复很多漏洞。

答案 2 :(得分:-2)

我会在开头添加一行,以确保启用magic_quotes,如果在服务器配置中禁用了它们。然后你或多或少会安全。