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
标签:GET,&&,0e,POST,绕过,md5 From: https://www.cnblogs.com/Yolololo/p/18161894