md5常见问题及绕过
2023-1-20 23:14:8 Author: www.freebuf.com(查看原文) 阅读量:15 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

在CTF中经常碰见md5相关题目,有的是单独一道,更多的是作为其他题目的一个点。这里整理一下md5相关知识,并给出涉及相关点的题目。
我见到的有以下类型,请师傅们多加补充
1、 md5爆破
2、md5弱比较
3、md5强比较
4、md5强碰撞
5、加密后弱相等
6、解密后的md5字符串有特殊字符
若有遗漏的,欢迎师傅们补充。

md5爆破

substr(md5(captcha), -6, 6) == "5bcba3"
给出md5加密后的几位,可以进行爆破

<?php
    for($i=0;$i<10000;$i++){
        if(substr(md5($i),-6,6)=="5bcba3"){
            echo $i;
            break;
        }
    }
?>

功防世界-SSRF Me
这是涉及到该知识点的题目

md5弱比较

md5弱比较形式:
if($a != $b && md5($a) == md5($b))
这里有两种方法

  • 0e绕过

  • 数组绕过

0e绕过:是md5加密后是0exxxxx的形式,在==弱比较时,会被当做科学技术法,众所周知,0的任何次方都是0,自然判断为true
大佬整理的md5加密后0e开头

数组绕过:a[]=a&b[]=b,传入参数为数组则MD5返回NULL,null=null,判断为true,成功绕过

md5强比较

md5强比较形式:
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))
0e绕过不能用了,因为强比较时,0exxx不再被当做科学计数法,而是被当做字符串。
数组绕过仍然可以。

md5强碰撞

md5强碰撞形式:
if((string)$_POST['a']!==(string)$_POST['b'] && md5($_POST['a'])===md5($_POST['b']))
强碰撞用string强行转换成字符串,从而限制了数组绕过这方法,只能输入字符串。
将a.txt拖到fastcoll_v1.0.0.5.exe上,然后读a_msg1.txt和a_msg2.txt
image.png

<?php

$a = file_get_contents("D:\a_msg1.txt");
$b = file_get_contents("D:\a_msg2.txt");

print_r($a . "<br>");
print_r($b . "<br>");
print_r(var_dump($a === $b) . "<br>"); // bool(false)
print_r(var_dump(md5($a) === md5($b)) . "<br>"); // bool(true)

md5强碰撞
buu-easy_web

加密后弱相等

形式如下:
if ($md5==md5($md5))
可以找0e开头并且md5后仍然0e开头的字符串,这样0==0,就可以绕过了。
这里可以用0e215962017。
buu-朴实无华
师傅们可以尝试一下

md5后含有特殊字符

PHP的md5()函数我们一般指使用一个参数,但它是有两个参数的,第二个参数默认为false
看一下PHP手册

比较一下两种方式的不同

介绍完后,我们来看题目
buu上的一道题
有md5弱比较,强比较和特殊字符3个点
Easy MD5
select * from 'admin' where password=md5($pass,true)


文章来源: https://www.freebuf.com/articles/web/347145.html
如有侵权请联系:admin#unsafe.sh