phpcms v9文件上传的四次绕过复现
首先搭建测试环境,测试网站是否成功
首页代码
<!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文件上传的四次绕过复现相关推荐
- 渗透测试-文件上传之getimagesize函数绕过
文件上传之getimagesize函数绕过 文章目录 文件上传之getimagesize函数绕过 前言 一.什么是getimagesize函数 二.文件上传之getimagesize函数绕过 1. g ...
- 文件上传漏洞的过滤绕过
这里总结一下文件上传漏洞的各种过滤机制的绕过.我找到的实验环境是upload-labs. 下载地址是GitHub - Tj1ngwe1/upload-labs: 一个帮你总结所有类型的上传漏洞的靶场 ...
- WSO2 文件上传 (CVE-2022-29464)漏洞复现
1.漏洞描述 WSO2是一家成立于 2005 年的开源技术提供商.它提供了一个企业平台,用于在本地和整个 Internet 上 集成应用程序编程接口(API).应用程序和 Web 服务. 某些 WSO ...
- 文件上传 黑名单白名单绕过(上)
前言 文件上传常见验证: 后缀名:类型,文件头 后缀名:黑名单,白名单 文件类型:MIME信息 文件头:内容信息 php与html代码混编 $_FILES[表单上传name]['name'] < ...
- 文件上传漏洞 — 前端JS绕过、MIME类型绕过
文件上传漏洞的相关讲解基于upload-labs靶场,搭建教程见文件上传漏洞靶机搭建教程 前端JS绕过 浏览器访问http://127.0.0.1/Pass-01/index.php进入靶机pass0 ...
- Web安全-文件上传漏洞与WAF绕过
文章目录 概述 Webshell简述 上传漏洞原理 上传漏洞绕过 解析漏洞 IIS 6.0解析漏洞 Apache解析漏洞 Nginx解析漏洞 Windows文件命名 客户端检测绕过 更改前端JS代码 ...
- php 绕过扩展名检查,文件上传漏洞---后缀名绕过原理
0x00 前言 今天来讨论文件上传漏洞之后缀名绕过.通常在实际生产过程中,并不会有直接可以上传.php等明显的可直接执行的文件,所以在这里我记录下后缀名绕过的原理和方法. 0x01 绕过方法 首先准备 ...
- nginx 上传文件漏洞_浅谈文件上传漏洞(其他方式绕过总结)
前言 上一篇文章简单的介绍了绕过客户端检测,现在总结一下其他方式绕过. 正文 1.1 服务端MIME类型检测绕过 检测原理:用户上传文件时,服务器会获取这个文件的MIME值,与事先设置好的进行比对,如 ...
- empirecms 文件上传 (CVE-2018-18086)漏洞复现
1.漏洞详情 EmpireCMS(帝国网站管理系统)是一套内容管理系统(CMS). EmpireCMS 7.5版本中的e/class/moddofun.php文件的'LoadInMod'函数存在安全漏 ...
- 文件上传安全狗waf绕过思想
本内容只做思想,因为这些已经是以前的了 上传参数名解析:明确有哪些东西能修改? Content-Disposition: 一般可更改 name: 表单参数值,不能更改 filename :文件名,可以 ...
最新文章
- RHEL6.3 DNS高级技术二 通过DNS主从区域复制实现DNS View负载均衡和冗余备份
- iOS UITableView的方法解析
- 宋体节点hdoj 1520 Anniversary party(树形dp)
- python日记----2017.8.1
- 前端学习(1561):ng-class颜色切换
- Django基础11(Django中form表单)
- 【牛客 - 157F】三轮(dp,分治fft)
- microsoftsql新建登录用户登录失败_史上最简单的Spring Security教程(九):自定义用户登录失败页面...
- Android开发笔记(七十三)代码混淆与反破解
- aria-hidden读屏
- 信息机房服务器搬迁,医院信息机房搬迁的实施与经验总结
- Axure RP 8的用途和使用
- ios 清理缓存功能实现
- 黑客帝国主要人物解读
- python 马赛克拼图_使用 python 做到马赛克拼图
- OA系统集团化共享服务平台,全面协同、全面移动
- 微信小程序开发—引用公共js里的方法
- php日历排班表,排班表 : 轮班工作者必备的排班神器
- 外贸群发软件不好用,邮件群发很苦恼
- IP大混战,春节档你最看好谁?