0

有一个(丑陋的)项目我被要求通过执行特定任务来帮助完成。问题是,我无法控制站点中的其他文件,更不用说服务器配置了。我将要使用的一些数据来自这样的查询:

'SELECT * FROM table where value like "'.$unsafe.'"';

$unsafe是来自 $_POST 或 $_GET 的未转义值。我检查了服务器,是 PHP5.1.6 并且打开了 magic_quotes_gpc,因此数据正在自动转义。这个查询是否可以破解?冒号之间的 $unsafe 给我的印象是它不能被破坏,但也许我错过了一些东西。我知道 magic_quotes_gpc 已被弃用,因为它不安全,所以我担心它,不是因为应用程序安全性在任何地方都失败了,而是因为我自己的知识。

编辑:我知道 *magic_quotes_gpc* 的安全隐患,我从不在我自己的项目中使用它。总是使用参数化查询来避免注入,但这次我被要求在朋友/客户项目中添加一段非常具体的代码,所以我无法更改已经完成的内容。我想知道是否有一个特定的值可以用来创建注射,这样我就可以向我的朋友说明为什么他应该改变它。

4

2 回答 2

1

if the DB is mysql use mysqli_real_escape_string() instead, if the PHP version is very old you can use the mysql_real_escape_string (not recommended at the moment).

even if the variable is between colons it can be injected, you just need to close the colons inside the value of the variable and then inject whatever you want afterwards.

于 2012-11-15T11:41:52.300 回答
1

关于您的编辑:您问“我想知道是否有一个特定的值可以用来创建注射,这样我就可以向我的朋友说明为什么他应该更改它。”

根据手册页mysqli_real_escape_string(),它转义的字符如下:

NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.

mysql_real_escape_string()函数也会转义相同的字符。

这为您提供了一个起点,即哪些字符可用于在 MySQL 中进行注入攻击。魔术引号仅转义引号字符和斜杠字符,这显然会留下几个可以利用的漏洞。

在一个简单的世界中,上述信息足以让我们通过对剩余的未转义字符进行字符串替换来修复转义。

然而,这两个real_escape函数还需要一个活动的数据库连接才能工作,这导致我们进一步复杂化:字符集。

如果数据库具有与 PHP 不同的字符集,尤其是可变长度字符集(如 UTF-8 或 UTF-16),则可能会发生进一步的攻击。

知道(或可以猜到)PHP 和 DB 正在使用的字符集的攻击者可以发送精心制作的注入攻击字符串,其中包含 PHP 认为不需要转义的字符,但仍会导致成功入侵 MySQL。这就是为什么real_escape函数需要访问数据库才能知道如何进行转义。

更多资源:

我希望能给你一些建议。

于 2012-11-16T10:11:39.383 回答