目录
1.3 第三次进行了文件的随机数命名,使我们无法猜到路径从而访问不了上传的文件木马
- function check_dir($dir)
- {
- $handle = opendir($dir);//opendir() 打开目录
- while (($f = readdir($handle)) !== false) {//打开目录读取内容
- if (!in_array($f, array('.', '..'))) {
- $ext = strtolower(substr(strrchr($f, '.'), 1));//截取最后的文件名
- if (!in_array($ext, array('jpg', 'gif', 'png'))) {//进行判断不符合删除
- unlink($dir . $f);
- }
- }
- }
- }
2.运行结果:
上传的zip文件内容


被删除后的上传文件
分析:源码确实存在时间竞争漏洞,但是我们有一种更简单的方法,从源码可以看出并没有递归删除,我们只需要套一个文件夹就能够实现绕过
报错说没有权限删除,所以我们成功绕过

上传成功:
- function check_dir($dir){
- $handle = opendir($dir);
- while(($f = readdir($handle)) !== false){
- if(!in_array($f, array('.', '..'))){
- if(is_dir($dir.$f)){//判断是否还有文件夹
- check_dir($dir.$f.'/');有就进行删除
- }else{
- $ext = strtolower(substr(strrchr($f, '.'), 1));
- if(!in_array($ext, array('jpg', 'gif', 'png'))){
- unlink($dir.$f);
- }
- }
- }
- }
- }
此漏洞为时间竞争型漏洞,我们可以通过burp软件,在文件已经上传还未删除时我们访问文件
$temp_dir = $dir.md5(time(). rand(1000,9999)).'/';
手动上传结果:

采用时间竞争的方法就失效了,我们无法知道具体路径,访问不了文件了
构造一个错误的压缩包,解压到一半失败了,程序直接退出不会执行后面的删除操作
构造解压到一半出错的数据包:
1.用010 editor 修改deCrc的值保存(PHP自带的ZipArchive库容忍度比较高,不适用)
2.在010editor中将2.txt的deFileName属性的值改成“2.tx:”(本次采用这种)
3.在Linux下也有类似的方法,我们可以将文件名改成5个斜杠(/)
上传文件报错:

结果php文件成功上传:
细节:压缩包中php文件必须排在其他文件前面。
绕过方法:
文件名改为../../../filename.php
当文件解压时解压到了上级目录,递归删除时就不会删除文件了
修改文件名全部在010editor上