web代码审计
这里参照大佬的文章
https://www.cnblogs.com/Hg-Yyq/p/8641992.html
1.md5
常见形式:
(1)
if($_POST['param1']!=$_['param2'] && md5($_POST['param1'])==md5($_POST['param2'])){
die("success");
}
看上去是不可能的,但是这里利用了一个php哈希比较缺陷,就是在处理0e开头的md5哈希字符串时,会将它看成0
,所以两个以0e开头的哈希值会被php认为是相同的。
常见payload
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
(2)
if($_POST['param1']!=$_['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success");
}
”==“变成了“===”
在php中md5(string,raw)函数是这样定义的md5(string,raw),当我们输入的不是string的时候会发生什么呢?
假如我们输入的是"param1[]=1¶m2[]=;"
这时还是可以绕过的”===“比较的
(3)
如果限定了是string类型怎么办呢?
例如:
if((string)$_POST['param1']!=(string)$_['param2'] )
md5($_POST['param1'])===md5($_POST['param2'])){
die("success");
}
那么上面的方法就不能用了
因为md5算法是一种摘要算法,也就是说它会把输入的数据压缩,那么就有可能存在两个不同的字符串经过md5加密后,会有两个MD5值相同。
这里用到了一个工具fastcoll_v1.0.0.5
先创建1.txt 和 2.txt
然后用fastcoll_v1.0.0.5 -i 1.txt 2.txt -o 3.txt 4.txt这条命令就可产生两个md5值相同的文件了。
上传用url编码。也就将文件以二进制的方式读入,然后编码成url编码。再提交param1=...,和param2=...
工具链接https://pan.baidu.com/s/1_bDnTy8_jMXGzpzJvl1g0A