Easy MD5——[BJDCTF2020]的解题思路是什么?

摘要:0.总结 这道题一共有三关,第一关是MD5原始值注入(MD5 Raw Injection) ,第二关是一个弱类型比较,第三关是强比较的绕过。 ** **第一个payload password=ffifdyop 第二个payload (0e哈
0.总结 这道题一共有三关,第一关是MD5原始值注入(MD5 Raw Injection) ,第二关是一个弱类型比较,第三关是强比较的绕过。 ** **第一个payload password=ffifdyop 第二个payload (0e哈希绕过/数组绕过) ?a=240610708&b=QNKCDZO 或者是 ?a[]=1b[]=2 第三个paylaod(数组绕过) param1[]=anything&param2[]=something_else 1.第一关 ok,进入第一关,打开靶场之后,可以看到有一个提交表单,f12查看源代码处可以发现一点有关的东西 <section> <form class="upload" action="leveldo4.php" method="GET"> <input type="text" id="name" name='password' class="in"> <input type="submit" class="give"> </form> </section> 这里显示在用get方式向leveldo4.php提交一个password参数名,后续在http响应包里的请求头中发现出题人给的hint提示头 这里可以看到后端语句确实是sql select * from 'admin' where password=md5($pass,true) 他把pass参数进行了md5加密,我们输入的password密码md5要等于存储在数据库的真实密码的md5值,显然其实不太容易,但是这里使用md5($pass, true)这样的方式,这就会造成安全隐患。 md5()是 PHP 里的一个哈希函数,用于:把任意字符串 → 转成一个固定长度的“摘要值”(hash)。 md5(string $str, bool $binary = false) //$str 要加密的字符串 //$binary 是否返回原始二进制 1.默认是flase md5("admin") 返回:21232f297a57a5a743894a0e4a801fc3 特点: 32位 十六进制字符串 可见、可打印 2.开始true md5("admin", true) 返回16字节二进制数据(不可见) 特点: 含乱码(不可打印字符) 可能包含 '、\0、or 等 可以触发sql注入 回到题目,当原始语句是select * from 'admin' where password=md5($pass,true)的时候,如果我们输入的字符串,在md5(raw),前面的字符为'or'...,就会直接触发sql注入。 原本情况 select * from admin where password='正常hash' 构造?password=ffifdyop注入之后变成类似,从而实现绕过 select * from admin where password='' or '1'='1' payload:?password=ffifdyop 注:它md5里包含'or'6... 2.第二关 第二个是弱类型比较绕过(数组绕过/ 利用0e哈希绕过 ) 我们构造了第一个payload之后,执行之后跳转到了levels91.php,并且提示do you like md5?,首先看源码,发现了他给的提示源码部分, <!-- $a = $GET['a']; $b = $_GET['b']; if($a != $b && md5($a) == md5($b)){ // wow, glzjin wants a girl friend. --> 我们可以看到,levels91.php接收get型参数a,接收get型参数b,然后想要进入if循环,需要实现$a!=$b以及md5($a) == md5($b),满足这两个条件就可以实现绕过。
阅读全文