这段代码中是否可以使用SQL注入?

时间:2011-02-13 08:25:12

标签: php sql sql-injection

简介

我已经接管了一个非常凌乱的PHP页面,这是度假公寓的预订平台,但这并不重要。代码最初是由设计师(不是编码员)完成的,而且非常糟糕。通过“true”和“false”字符串传递布尔变量是次要WTF之一。我想说服页面的所有者,给我时间(当然还有钱)清理代码(或重写代码)。

显然原始的“开发人员”从未听说过SQL注入,因为他在他的SQL语句中直接使用POST和GET变量。为了说服主人,我想通过以管理员身份登录而不使用他的密码来震惊他。

tl; dr(或:实际问题)

此语句(其中$ p_username是一个包含“用户名”输入字段内容的POST变量):

"SELECT password FROM user WHERE username = '$p_username'"

然后将返回的字符串(存储在数据库中的密码的未加密的MD5-Hash)与输入“密码”字段的(也是哈希的)字符串进行比较,如果两个字符串都与用户匹配以输入的用户身份登录。是否可以在用户名字段中输入内容以“假”管理员身份登录?

注意:数据库服务器是MySQL,PHP是第5版,magic_quotes已启用。

6 个答案:

答案 0 :(得分:2)

正如Shrapnel上校所指出的,magic_quotes确实无法实现,除非你在某些very special circumstances下运行。

然而,如果你说的是真的,那么最初的开发人员很可能对magic_quotes知之甚少,所以如果他将GET / POST / COOKIE值存储在除SQL语句之外的任何其他地方,他很可能会搞砸。简而言之,查找'"合法的地方,并检查它们是否不合理。

另外 - 他是否了解htmlspecialchars(),还是HTML / Javascript注入仍然可能? :)

答案 1 :(得分:0)

启用魔法引号后,这是不可能的。

答案 2 :(得分:0)

如果这是完整查询并且密码检查是在PHP端完成的,那么您将无法以管理员身份登录(即使关闭了magic_quotes),因为您仍然需要匹配密码哈希。

答案 3 :(得分:0)

修改

有多个addslashes()的攻击媒介。我在下面选择的第一个是基于之前在回答中引用的文章,该文章引用它来支持 相反的 声明。至少另一个是使用不超过UTF-8编码的超长字符串。

http://www.erich-kachel.de/?tag=addslashes

可以构建如下的类似技术。长期和短期是,MySQL团队认为适合退休magic_quotes并强烈建议不要假装addslashes()是一种真正的保护形式。 也许,你知道,MySQL团队会更清楚吗?对于它的价值,mysql_real_escape_string也有一些边缘案例漏洞,但由于它是特定于MySQL而不仅仅是PHP特定的,它确实会更进一步。更好的解决方案是使用查询参数。

原始答案如下

是的,可以以管理员身份登录。不是一次性,但是两次通过就可以了。

参考 - http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string (是的,这是来自另一个答案的相同链接,但相反,我的解释是,除了utf8之外,它通常可用于任何多字节字符集)

你还没有说过你的系统是多字节的,但由于这个问题是开放的,我会假设它是。

$p_username = chr(0xbf) . chr(0x27) . ';' .
    "update user set password='password', '.
    "username='" . chr(0xbf) . "' where username='admin' /*';

"SELECT password FROM user WHERE username = '$p_username'"

我更改了“admin”用户的用户名和密码

  

这种类型的攻击可以使用任何字符编码,其中有一个以0x5c结尾的有效多字节字符

答案 4 :(得分:0)

正如其他人所指出的那样,单引号超过魔术引号是很棘手的,但如果可以做到,那么查询就是吐司。考虑一下我们是否可以注入以下内容:

SELECT password FROM user WHERE username = 'unlikely' 
UNION ALL SELECT CHAR(102,111,111); #'

这会将字符串'foo'作为密码返回给PHP,所以我们需要做的就是确保我们的表单为$ username发送注入,为$ password发送'foo'。

答案 5 :(得分:-2)

我认为验证所有输入变量并转义所有特殊字符非常重要,即使启用了magic_quotes也是如此。

可以肯定的是,您可以使用sqlmap测试代码。