首先搭建测试环境,测试网站是否成功

首页代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>文件上传章节练习题</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><style type="text/css">.login-box{margin-top: 100px;height: 500px;border: 1px solid #000;}body{background: white;}.btn1{width: 200px;}.d1{display: block;height: 400px;}</style>
</head>
<body><form method="post" action="upload.php" enctype="multipart/form-data"><input type="file" name="file" value=""/><input type="submit" name="submit" value="upload"/></form>
</body>
</html>

第一次漏洞:


<?php
header("Content-Type:text/html; charset=utf-8");
require_once('pclzip.lib.php');function check_dir($dir)
{$handle = opendir($dir);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);}}}
}$file = $_FILES['file'];
if (!$file) {exit("请勿上传空文件");
}
$name = $file['name'];
$dir = 'upload/';//将上传的文件放到upload文件夹下面,后面查找文件的时候可以在upload文件夹下进行查找
$ext = strtolower(substr(strrchr($name, '.'), 1));//截取.后面的后缀名称。$temp_dir = $dir . 'member/1/';
if (!is_dir($dir)) {mkdir($dir);
}$temp_dir = $dir . 'member/1/';//这里是默认了创建目录为member下面,这个1实际上代表的是用户id,也就是每个用户都有一个自己的id
if (!is_dir($temp_dir)) {mkdir($temp_dir);
}if (in_array($ext, array('zip', 'jpg', 'gif', 'png'))) {if ($ext == 'zip') {$archive = new PclZip($file['tmp_name']);//这里就是解压缩if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {check_dir($dir);exit("解压失败");}check_dir($temp_dir);exit('上传成功!');} else {move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']);check_dir($temp_dir);exit('上传成功!');}
} else {exit('仅允许上传zip、jpg、gif、png文件!');
}

但是在这个里面有一个问题,就是它没有进行递归删除,而是直接删除第一个文件夹里面的内容。
好比说:我新创建一个文件夹,里面包含了一张图片和一个包含一句话木马的php文件,但是在上传之后它会将php的文件删除,
这个2的文件夹里放的东西为:

将他进行压缩为zip的压缩包,然后进行上传。

上传成功后,我们在xss_location\upload\member\1的路径下可以看到,它是只有一个图片的,而那个php后缀的文件已经被删除了。

但是我们如果在文件夹中在进行一个嵌套,也就是在文件夹中在创建一个名为aaa的文件夹,将php文件放到aaa的文件夹当中,它就不会将php文件进行删除了。
也就是说当我们上传完文件之后,upload\member\1路径下中是存在aaa的文件夹,并且点进去之后,它是没有将咱们上传的php文件进行删除。

第二次漏洞

因为上面的漏洞被很多人发现,所以它想办法弥补,也就是说,我创建一个递归,即便有在多的文件,我也进去给你删除,所以代码就变成了:


<?php
header("Content-Type:text/html; charset=utf-8");
require_once('pclzip.lib.php');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);}}}}
}$file = $_FILES['file'];
if (!$file) {exit("请勿上传空文件");
}
$name = $file['name'];
$dir = 'upload/';
$ext = strtolower(substr(strrchr($name, '.'), 1));if (!is_dir($dir)) {mkdir($dir);
}$temp_dir = $dir . 'member/1/';
if (!is_dir($temp_dir)) {mkdir($temp_dir);
}if (in_array($ext, array('zip', 'jpg', 'gif', 'png'))) {if ($ext == 'zip') {$archive = new PclZip($file['tmp_name']);if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {check_dir($dir);exit("解压失败");}check_dir($temp_dir);exit('上传成功!');} else {move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']);check_dir($temp_dir);exit('上传成功!');}
} else {exit('仅允许上传zip、jpg、gif、png文件!');
}

跟上一个不同的就是,我将解压后的文件夹放进一个递归里面,如果你文件夹中还有并且里面包含php文件,我也进行一个删除,但是,在它的写法中存在了一个逻辑错误,它是先进行查找,查找到之后就进行删除,那么就可以在它查到但是没有删除的这一个时间里面,我在写入一个php文件,即便它删除了我上传的,但是我新写入的那个是没有删除的,这也就是要采取一个时间竞争的关系来写入文件。
那么,咱么就需要修改一下php文件里面的内容

修改过后后,重新压缩,然后打开burp suite来进行抓包,然后时间竞争。
首先配置代理,


打开burp,在这里配置和刚刚在设置里面一样的ip和端口号。然后选择running,

先将抓包进行关闭,然后我们上传好文件的时候就可以进行开启抓包,抓包成功后,我们右键将他放到intruder里面,然后先清除,然后在随意找到一个数字添加。

之后在在paylods里面设置形式为数字,从1次到1000次,step为1 的访问。并且开始运行。

运行结束后可以在upload\member\1下去找是否成功。

第三次漏洞

因为上一个漏洞使用时间竞争就可以进行绕过,所以它对这个又进行了一次修改,也就是说将名称用一段随机数来替代,这样的话你就没有办法去寻找文件位置。那样的话就没有办法进行时间竞争。
所以将代码改成了:

<?php
header("Content-Type:text/html; charset=utf-8");
require_once('pclzip.lib.php');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);}}}}
}$file = $_FILES['file'];
if (!$file) {exit("请勿上传空文件");
}
$name = $file['name'];
$dir = 'upload/';
$ext = strtolower(substr(strrchr($name, '.'), 1));$temp_dir = $dir.md5(time(). rand(1000,9999)).'/';//以随机数的方式来创建文件名称。
if (!is_dir($dir)) {mkdir($dir);
}if (!is_dir($temp_dir)) {mkdir($temp_dir);
}if (in_array($ext, array('zip', 'jpg', 'gif', 'png'))) {if ($ext == 'zip') {$archive = new PclZip($file['tmp_name']);if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {check_dir($dir);exit("解压失败");}check_dir($temp_dir);exit('上传成功!');} else {move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']);check_dir($temp_dir);exit('上传成功!');}
} else {exit('仅允许上传zip、jpg、gif、png文件!');
}

但是,这里也是存在一个bug,也就是所,如果我们进行解压缩,但是解压到一半的时候,让他解压出错,那么不就可以直接退出了吗,也就是说,解压一个错误的压缩包,那样就可以进行解压,但是因为它解压失败,所以就直接跳过了删除部分,直接结束,文件也就不会被删除。

那么如何让压缩文件解压出错?
首先:在window下的解压软件7zip;
7zip的容忍度很低,只要压缩包中某一个文件的CRC校验码出错,就会报错退出;所以我们就可以通过将校验码改错,它就不能正常解压缩。

这样的话我们在解压缩的时候它就会报错。

在php下使用自带的ZipArchive
以前我们在改文件的名字的时候,它会有一个提示:就是不允许出现一些符号,其中有一个是冒号(

phpcms v9文件上传的四次绕过复现相关推荐

  1. 渗透测试-文件上传之getimagesize函数绕过

    文件上传之getimagesize函数绕过 文章目录 文件上传之getimagesize函数绕过 前言 一.什么是getimagesize函数 二.文件上传之getimagesize函数绕过 1. g ...

  2. 文件上传漏洞的过滤绕过

    这里总结一下文件上传漏洞的各种过滤机制的绕过.我找到的实验环境是upload-labs. 下载地址是GitHub - Tj1ngwe1/upload-labs: 一个帮你总结所有类型的上传漏洞的靶场 ...

  3. WSO2 文件上传 (CVE-2022-29464)漏洞复现

    1.漏洞描述 WSO2是一家成立于 2005 年的开源技术提供商.它提供了一个企业平台,用于在本地和整个 Internet 上 集成应用程序编程接口(API).应用程序和 Web 服务. 某些 WSO ...

  4. 文件上传 黑名单白名单绕过(上)

    前言 文件上传常见验证: 后缀名:类型,文件头 后缀名:黑名单,白名单 文件类型:MIME信息 文件头:内容信息 php与html代码混编 $_FILES[表单上传name]['name'] < ...

  5. 文件上传漏洞 — 前端JS绕过、MIME类型绕过

    文件上传漏洞的相关讲解基于upload-labs靶场,搭建教程见文件上传漏洞靶机搭建教程 前端JS绕过 浏览器访问http://127.0.0.1/Pass-01/index.php进入靶机pass0 ...

  6. Web安全-文件上传漏洞与WAF绕过

    文章目录 概述 Webshell简述 上传漏洞原理 上传漏洞绕过 解析漏洞 IIS 6.0解析漏洞 Apache解析漏洞 Nginx解析漏洞 Windows文件命名 客户端检测绕过 更改前端JS代码 ...

  7. php 绕过扩展名检查,文件上传漏洞---后缀名绕过原理

    0x00 前言 今天来讨论文件上传漏洞之后缀名绕过.通常在实际生产过程中,并不会有直接可以上传.php等明显的可直接执行的文件,所以在这里我记录下后缀名绕过的原理和方法. 0x01 绕过方法 首先准备 ...

  8. nginx 上传文件漏洞_浅谈文件上传漏洞(其他方式绕过总结)

    前言 上一篇文章简单的介绍了绕过客户端检测,现在总结一下其他方式绕过. 正文 1.1 服务端MIME类型检测绕过 检测原理:用户上传文件时,服务器会获取这个文件的MIME值,与事先设置好的进行比对,如 ...

  9. empirecms 文件上传 (CVE-2018-18086)漏洞复现

    1.漏洞详情 EmpireCMS(帝国网站管理系统)是一套内容管理系统(CMS). EmpireCMS 7.5版本中的e/class/moddofun.php文件的'LoadInMod'函数存在安全漏 ...

  10. 文件上传安全狗waf绕过思想

    本内容只做思想,因为这些已经是以前的了 上传参数名解析:明确有哪些东西能修改? Content-Disposition: 一般可更改 name: 表单参数值,不能更改 filename :文件名,可以 ...

最新文章

  1. RHEL6.3 DNS高级技术二 通过DNS主从区域复制实现DNS View负载均衡和冗余备份
  2. iOS UITableView的方法解析
  3. 宋体节点hdoj 1520 Anniversary party(树形dp)
  4. python日记----2017.8.1
  5. 前端学习(1561):ng-class颜色切换
  6. Django基础11(Django中form表单)
  7. 【牛客 - 157F】三轮(dp,分治fft)
  8. microsoftsql新建登录用户登录失败_史上最简单的Spring Security教程(九):自定义用户登录失败页面...
  9. Android开发笔记(七十三)代码混淆与反破解
  10. aria-hidden读屏
  11. 信息机房服务器搬迁,医院信息机房搬迁的实施与经验总结
  12. Axure RP 8的用途和使用
  13. ios 清理缓存功能实现
  14. 黑客帝国主要人物解读
  15. python 马赛克拼图_使用 python 做到马赛克拼图
  16. OA系统集团化共享服务平台,全面协同、全面移动
  17. 微信小程序开发—引用公共js里的方法
  18. php日历排班表,排班表 : 轮班工作者必备的排班神器
  19. 外贸群发软件不好用,邮件群发很苦恼
  20. IP大混战,春节档你最看好谁?

热门文章

  1. php中hexdec,PHP hexdec()函数
  2. intent传递集合数据
  3. Android 判断邮箱格式是否正确
  4. Youtube视频推荐框架解读及若干算法细节
  5. CorelDRAW X8最新版本安装使用教程
  6. 兰大《银行会计学》命题作业离线作业
  7. 数据分析有 AI 帮你,Sugar BI 智能分析全场景介绍
  8. D盘需要管理员权限解决办法
  9. 阿里云 搭建flink 后 web界面可以访问 但是没有task manager节点存活
  10. 聊聊龙芯Java开源