复现环境
https://buuoj.cn/challenges#[BJDCTF2020]Easy%20MD5
考察知识点
- 代码审计
- MD5绕过
- 弱类型比较
解题分析
访问题目是一个查询框,提交查询会传入一个password参数
![](https://img.haomeiwen.com/i6183510/df14d9a37a935f4c.png)
响应头里有提示md5($pass,true)
![](https://img.haomeiwen.com/i6183510/8cf8f371ec15bd65.png)
md5(string,true)函数在指定了true的时候,是返回的原始 16 字符二进制格式。
而MD5绕过就是利用二进制字符串和前面的形成闭合,构成万能密码。
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string: 'or'6]!r,b
我们输入这个ffifdyop字符串以后出现以下的页面
![](https://img.haomeiwen.com/i6183510/aa8f1b16b270d523.png)
提示在源码里面
![](https://img.haomeiwen.com/i6183510/46f9ceb469c6e387.png)
if($a != $b && md5($a) == md5($b))
这个有多种绕过
?a=QNKCDZO&b=240610708
?a=s878926199a&b=s155964671a
?a[]=1&b[]=2
等等
![](https://img.haomeiwen.com/i6183510/a89b8a8a5967f30a.png)
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))
弱类型比较变成了强类型比较了,这里就只能用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。
![](https://img.haomeiwen.com/i6183510/34cd0ec8b6cd7faa.png)
网友评论