跳到主要内容

BJDCTF2020 Easy MD5


已读 0%
本篇目录
阅读设置
正文字号
18

设置仅保存在当前浏览器。

[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

cAor1e.png

被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&param2[]=2

得到flag


文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
赏
评论

评论将在接近此处时加载,也可点击立即加载。

  目录