ctf-web总结

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&param2[]=;"
这时还是可以绕过的”===“比较的

(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

2.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容