PHP magic_quotes_gpc 漏洞

标签 php sql-injection exploit magic-quotes

我被分配到我公司的一个遗留 Web 应用程序,在研究源代码一两天后,我发现了一个类似于以下内容的 SQL 注入(inject)向量:

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

我已经尝试对此执行 SQL 注入(inject)测试,但由于 PHP 的 magic_quotes_gpc 模块被打开而失败了。

我知道 magic_quotes_gpc ,但我们有数百(如果不是数千)行代码与上面的代码类似。我们根本无法关闭 magic_quotes_gpc,因为这会让像这样的代码容易受到攻击。

我想知道上面的代码有多“可利用”,我们是应该立即修复它,还是将修复它的任务与我们的其他重构任务一起进行。

最佳答案

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 插值以使用它。当您获得所有这些后,您可以关闭魔术引号。

关于PHP magic_quotes_gpc 漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127028/

相关文章:

php - 为电子邮件激活链接 PHP 生成唯一字符串

php - Ajax表单多次提交。有时

php - 获取 Controller 内的当前 default_target_path

php - SQL 语法错误?

mysql - 是否可以使用存储过程进行sql注入(inject)?

php - 基本的PHP sql注入(inject)问题

sql - 使用绑定(bind)变量时如何实现 SQL 注入(inject)?

c - Dll劫持计算器C代码

c - 字符串格式漏洞: set negative value = "-1" use %n

谁能给我解释一下这段代码?