PHP / MySQL / hash:安全相关的类型比较CTF挑战


PHP / MySQL / hash: security related type-comparison CTF challenge

我发现自己正在为我工作的公司的安全审计员编写测试;通过这样做,我发现了一个我仍然无法解决的CTF挑战。

如果我想明白了,最好能问问你们的想法。

链接为https://2013.picoctf.com/problems/php3/

测试说明说要注意md5函数是如何使用的,特别是最后一个参数设置为true。

代码片段如下:

$pass = md5($_POST[pass], True);
$query = @mysql_fetch_array(mysql_query("select user from php3 where (user='$user') and (pw='$pass')"));

结尾为true的md5()表示md5将返回原始表示而不是字符串表示:

如果可选的raw_output设置为TRUE,则md5摘要为而是以原始二进制格式返回,长度为16。

考虑到这一点,你知道通过考试的程序是什么吗?

我猜这与MySQL将字符串与二进制表示进行比较的方式有关,即类似于为什么md5('240610708')等于md5('QNKCDZO')?与http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

中描述的浮点数比较相关
mysql> SELECT '18015376320243458' = 18015376320243458;
-> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
-> 0

你能帮我理解这个挑战吗?

这是一个简单的SQL注入,试试这个用户名:

admin') #

#将忽略查询的其余部分(使其成为注释)

mysql> SELECT user from php3 where (user='admin') and (pw=0e55555555555555);

将返回所需的数据。