我发现自己正在为我工作的公司的安保审计员编写测试;通过这样做,我发现了一个我仍然无法解决的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')"));
md5()
结尾为true意味着md5将返回原始表示而不是字符串表示:
如果可选的raw_output设置为TRUE,则md5摘要为 而是以原始二进制格式返回,长度为16。
考虑到这一点,您对通过此测试的程序有什么了解吗?
我想这与MySQL将字符串与二进制表示形式进行比较的方式有关,即类似于Why md5('240610708') is equal to md5('QNKCDZO')?并且与http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html中描述的浮点数比较相关
mysql> SELECT '18015376320243458' = 18015376320243458;
-> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
-> 0
你能帮我理解这个挑战吗?
答案 0 :(得分:0)
这是一个简单的SQL注入,请尝试使用此用户名:
admin') #
#
将忽略查询的其余部分(使其评论)
答案 1 :(得分:0)
mysql> SELECT user from php3 where (user='admin') and (pw=0e55555555555555);
将返回所需的数据。