MD5绕过(Hash比较缺陷)

MD5绕过(Hash比较缺陷)

MD5绕过简单介绍:简单来说就是不一样的数据经过MD5计算后可能会出现相同的MD5码。


例子:天融信面试题

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
function gen_secured_random() { // cause random is the way
$a = rand(1337,2600)*42;
$b = rand(1879,1955)*42;

$a < $b ? $a ^= $b ^= $a ^= $b : $a = $b;

return $a+$b;
}

function secured_hash_function($plain) { // cause md5 is the best hash ever
$secured_plain = sanitize_user_input($plain);
return md5($secured_plain);
}

function sanitize_user_input($input) { // cause someone told me to never trust user input
$re = '/[^a-zA-Z0-9]/';
$secured_input = preg_replace($re, "", $input);
return $secured_input;
}

if (isset($_GET['source'])) {
show_source(__FILE__);
die();
}


require_once "secret.php";

if (isset($_POST['s']) && isset($_POST['h'])) {
$s = sanitize_user_input($_POST['s']);
$h = secured_hash_function($_POST['h']);
$r = gen_secured_random();
if($s != false && $h != false) {
if($s.$r == $h) {
print "Well done! Here is your flag: ".$flag;
}
else {
print "Fail...";
}
}
else {
print "<p>Hum ...</p>";
}
}
?>
<p><em><a href="index.php?source">source code</a></em></p>
</body>
</html>
  • 通过代码审计,这题只要做到构造$s.$r==$h就可以拿到flag。有几个注意点:

①$s通过sanitize_user_input方法,限制只能输入数字和字母。

②$h在经过sanitize_user_input方法过滤的前提下,再进行一次md5加密。

③$r是通过gen_secured_random方法产生一组随机数(int型)。

④$s.$r==$h是弱比较。

  • 在php中,由于双等号在判断值上有漏洞,分为以下三种:

​ 1.如果一个字符串为 “合法数字+e+合法数字”类型,将会解释为科学计数法的浮点数(0e开头,后面数字怎么变都是等于0,原理就是0的多少次方都是0。0X开头就是十六进制)
​ 2.如果一个字符串为 “合法数字+ 不可解释为合法数字的字符串”类型,将会被转换为该合法数字的值,后面的字符串将会被丢弃
​ 3.如果一个字符串为“不可解释为合法数字的字符串+任意”类型,则被转换为0,如…==0是成立的

也就是下列三种情况输出都为True:

1
2
3
1e10==1
1'1111==1
'a'==0

$s=0e….时,$s.$r等于0。$h=’240610708’,通过md5加密后,变成”0e462097431906509019562988736854”。==号两边都是0.成功绕过。

payload

1
2
3
4
$s = sanitize_user_input('0e');
$h = secured_hash_function('240610708');
$r = gen_secured_random();
var_dump($s.$r==$h );

image-20201105221050313

以下值在md5加密后以0E开头:

1
2
3
4
5
6
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a