一次巧妙获取shell的代码审计
字数 1143 2025-08-29 08:30:30
一次巧妙获取shell的代码审计分析
环境搭建
- 源码下载地址: https://github.com/rainrocka/xinhu
- 下载后解压到本地网站根目录下
- 配置好数据库并安装系统
- 默认管理员账号密码: admin/123456 (登录后需更改密码)
路由分析
路由定义位于include/View.php中,主要参数:
m: 模块名,对应webadmin下的子目录d: 目录名a: 动作名,对应php文件名(不含Action)ajaxbool: 布尔值,决定访问xxxAction.php还是xxxAjax.php
示例路由:
index.php?a=deluser&m=imgroup&ajaxbool=true&gid=38&sid=1
m=imgroup: 请求webadmin/imgroup目录a=deluser: 请求deluser方法ajaxbool=true: 这是一个AJAX请求
漏洞分析
1. 文件上传功能分析
关键文件: webmain/public/upload/uploadAction.php中的upfileAjax方法
- 调用
c()方法获取上传类实例 - 主要包含
upfileChajian.php文件 - 分析
upfileChajian.php中的up()方法:- 使用
issavefile()方法进行后缀白名单检查 - 上传PHP文件时
$bo返回false $file['up']为false时会调用filesave()方法
- 使用
2. 文件保存机制
filesave()方法将文件内容base64编码- 写入到
.uptemp临时文件 - 原始文件后缀被替换,无法直接利用
3. 文件后缀还原漏洞
关键文件: webmain/task/runt/qcloudCosAction.php中的runAction方法
- 可通过控制
id参数将.uptemp后缀还原为原始上传后缀 - 构造路由:
task.php?m=qcloudCos|runt&a=run&fileid=10
漏洞利用步骤
- 上传一个PHP文件,会被保存为
.uptemp格式 - 记录上传文件的ID
- 构造特殊路由访问
qcloudCosAction.php的runAction方法 - 通过
fileid参数指定要还原的文件 - 系统将
.uptemp文件还原为原始PHP后缀 - 访问还原后的PHP文件获取webshell
防御建议
- 对文件上传功能进行严格的白名单校验
- 不要信任客户端提供的文件ID参数
- 对文件还原操作增加权限检查
- 限制上传文件的存储目录不可执行
- 对上传文件进行内容检查,防止PHP代码上传