我发现自己正在为我工作的公司的安全审计员编写测试;通过这样做,我发现了一个我仍然无法解决的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);
将返回所需的数据。