==的绕过
PHP中==是判断值是否相等,若两个变量的类型不相等,则会转化为相同类型后再进行比较。PHP在处理哈希字符串的时候,它把每一个以0e开头并且后面字符均为纯数字的哈希值都解析为0。常见的如下:
在md5加密后以0E开头
QNKCDZO
240610708
s878926199a
s155964671a
以下串在sha1加密后以0E开头,并且后面均为纯数字
aaroZmOk
aaK1STfY
示例
<?php
if($_GET['a'] !== $_GET['b']){
if(md5($_GET['a']) == md5($_GET['b'])){
echo "flag";
}
}
?>
payload
/?a=QNKCDZO&b=240610708
===的绕过
===会比较类型,这个时候可以用到PHP中md5()函数无法处理数组(会返回NULL)来实现绕过。
示例
<?php
if($_GET['a'] !== $_GET['b']){
if(md5($_GET['a']) === md5($_GET['b'])){
echo "flag";
}
}
?>
payload
/?a[]=1&b[]=2 (上面==的例子也可以用数组绕过)
MD5碰撞
示例
<?php
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo "you are a hacker";
} else {
echo "md5 is funny ~";
}
这里和上面不同之处在于有一个强制类型转化,若传入数组转化后的结果都是字符串Array。这里需要用到的是MD5碰撞,也就是不同字符串但是MD5后值相同的情况。
字母数字混合类(MD5值):
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
大写字母类:
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
纯数字类:
240610708
0e462097431906509019562988736854