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¶m2[]=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),满足这两个条件就可以实现绕过。
