MD5绕过题型
password=ffifdyop
在 PHP5 和 PHP7 中,当两个 md5 进行比较时,若参数是不同的数组,那么 == 和 === 比较的结果均为 True
1.“0E”绕过
常见规则,
1 | $_GET['name'] != $_GET['password'] |
满足上述规则时,可以使用以0E开头的hash值绕过,因为处理hash字符串时,PHP会将每一个以 0E开头的哈希值解释为0,那么只要传入的不同字符串经过哈希以后是以 0E开头的,那么PHP会认为它们相同
下面是一些哈希后0E开头的字符
1 | s878926199a |
2.数组绕过
$_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])
当满足上面的条件时,由于PHP中MD5函数的特性,可以使用数组绕过
md5([1,2]) == md5([3,4]) == NULL
故只要GET方法传入a[]=1&b[]=2即可绕过
3.MD5碰撞
`(string)$_POST[‘param1’]!==(string)$_POST[‘param2’] && md5($_POST[‘param1’])===md5($_POST[‘param2’])
使用MD5碰撞生成 工具 得到hash值相同的不同字符串
先建立两个空文件,然后在终端中输入
.\fastcoll_v1.0.0.5.exe -i .\a.txt .\b.txt -o c.txt d.txt
生成的c.txt 和 d.txt中的字符串就是hash值相等的字符串
== :只比较值
=== :比较值和类型
一.弱比较(MD5函数)==
1 | if ($_GET['name'] != $_GET['password'] && MD5($_GET['name']) == MD5($_GET['password'])){ echo "flag"; } |
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同。
这种方式只有在弱比较的时候才能使用。
以下值在md5加密后以0E开头:
1 |
|
以下值在sha1加密后以0E开头:
1 | - aaroZmOk |
双重MD5加密后0E开头:
1 |
|
还有的时候会限制字符串为纯数字或字母,这些特殊条件的字符串可以自行搜索。
二. 强比较(MD5函数)===
不相等的两个字符串md5后仍然相等
payload:
1 | array1=%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 |
上面是不相等的两个字符串md5后仍然相等
1 | array1=%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 |