我已经接管了一个非常凌乱的PHP页面,这是度假公寓的预订平台,但这并不重要。代码最初是由设计师(不是编码员)完成的,而且非常糟糕。通过“true”和“false”字符串传递布尔变量是次要WTF之一。我想说服页面的所有者,给我时间(当然还有钱)清理代码(或重写代码)。
显然原始的“开发人员”从未听说过SQL注入,因为他在他的SQL语句中直接使用POST和GET变量。为了说服主人,我想通过以管理员身份登录而不使用他的密码来震惊他。
此语句(其中$ p_username是一个包含“用户名”输入字段内容的POST变量):
"SELECT password FROM user WHERE username = '$p_username'"
然后将返回的字符串(存储在数据库中的密码的未加密的MD5-Hash)与输入“密码”字段的(也是哈希的)字符串进行比较,如果两个字符串都与用户匹配以输入的用户身份登录。是否可以在用户名字段中输入内容以“假”管理员身份登录?
注意:数据库服务器是MySQL,PHP是第5版,magic_quotes
已启用。
答案 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测试代码。