PHP代码审计之HadSky
字数 1566 2025-08-11 08:36:02
HadSky PHP代码审计与漏洞利用分析
环境搭建
- 使用phpstudy进行环境搭建
- 创建网站后进入安装过程
- 安装完成后使用设置好的密码登录系统
路由分析
前台路由
- 系统使用puyuetian自研框架开发
- 功能点调用总是从index.php开始
- index.php包含框架加载文件puyuetian.php
- 前台路由主要由load.php控制
- 通过GET传入
c参数控制路由- 不传入
c参数则默认访问phpscript/main.php - 传入
c参数则包含phpscript目录下相应文件
- 不传入
后台路由
- 访问
admin.php进入后台 - 路由格式示例:
app/superadmin:indexapp代表app文件夹superadmin:index表示superadmin文件夹下的index.php
- 通过参数
s控制调用后台的具体功能点
漏洞分析
1. 任意文件写入漏洞
漏洞位置:
- 全局搜索
file_put_contents()函数 - 写入内容可通过POST传参控制
利用条件:
- 传入
type=save参数 path参数指向一个存在的文件(会被覆盖)- 或传入
type=mkfile和mkname参数创建新文件
漏洞复现:
- 构造路由请求
- 虽然代码提示保存失败,但文件已实际写入
- 验证写入的phpinfo文件可访问
2. 任意文件删除漏洞
漏洞位置:
- 全局搜索
unlink()函数 $path参数可控且无过滤
漏洞复现:
- 定位安装目录下的目标文件
- 使用BurpSuite抓包构造删除请求
- 成功删除指定文件
3. 任意文件删除导致RCE漏洞
利用链:
- 利用任意文件删除漏洞删除锁文件(xx.locked)
- 触发系统重装流程
install.php分析:
- 接收安装参数(数据库信息等)
- 数据库操作不能报错,否则安装失败
- 成功安装后写入config.php
config.php分析:
- 包含可控参数(如mysql_prefix)
- 可注入特殊字符
- 需要定义puyuetian常量才能访问
RCE条件:
- 成功安装系统
- 访问index.php(包含puyuetian.php,进而包含config.php)
漏洞复现:
- 在安装界面填入payload
- 系统成功安装
- 触发phpinfo执行
4. 任意文件读取漏洞
漏洞位置:
- 全局搜索
file_get_contents()函数 - 传入
type=edit进入特定分支 path参数可控且有白名单后缀限制
利用方式:
- GET传入
json参数进入ExitJson函数 - 读取内容以json形式回显
5. 模板上传绕过getshell
漏洞位置:
app\superadmin\phpscript\app.php- 通过
t=uploadapp参数控制执行流程
上传机制:
- 检查文件后缀白名单
- 使用ZipArchive类处理上传的zip文件
open()方法打开压缩文件extractTo()方法解压到根目录
ZipArchive类关键方法:
addFile()- 添加文件到压缩包addEmptyDir()- 添加空目录addFromString()- 添加指定内容的文件extractTo()- 解压到指定目录renameIndex()/renameName()- 重命名文件deleteIndex()/deleteName()- 删除文件
getshell方法:
- 创建包含PHP文件的zip压缩包
- 利用上传功能上传zip文件
- 系统解压到根目录实现getshell