PHP代码审计之HadSky
字数 1566 2025-08-11 08:36:02

HadSky PHP代码审计与漏洞利用分析

环境搭建

  1. 使用phpstudy进行环境搭建
  2. 创建网站后进入安装过程
  3. 安装完成后使用设置好的密码登录系统

路由分析

前台路由

  • 系统使用puyuetian自研框架开发
  • 功能点调用总是从index.php开始
  • index.php包含框架加载文件puyuetian.php
  • 前台路由主要由load.php控制
  • 通过GET传入c参数控制路由
    • 不传入c参数则默认访问phpscript/main.php
    • 传入c参数则包含phpscript目录下相应文件

后台路由

  • 访问admin.php进入后台
  • 路由格式示例:app/superadmin:index
    • app代表app文件夹
    • superadmin:index表示superadmin文件夹下的index.php
  • 通过参数s控制调用后台的具体功能点

漏洞分析

1. 任意文件写入漏洞

漏洞位置

  • 全局搜索file_put_contents()函数
  • 写入内容可通过POST传参控制

利用条件

  • 传入type=save参数
  • path参数指向一个存在的文件(会被覆盖)
  • 或传入type=mkfilemkname参数创建新文件

漏洞复现

  1. 构造路由请求
  2. 虽然代码提示保存失败,但文件已实际写入
  3. 验证写入的phpinfo文件可访问

2. 任意文件删除漏洞

漏洞位置

  • 全局搜索unlink()函数
  • $path参数可控且无过滤

漏洞复现

  1. 定位安装目录下的目标文件
  2. 使用BurpSuite抓包构造删除请求
  3. 成功删除指定文件

3. 任意文件删除导致RCE漏洞

利用链

  1. 利用任意文件删除漏洞删除锁文件(xx.locked)
  2. 触发系统重装流程

install.php分析

  • 接收安装参数(数据库信息等)
  • 数据库操作不能报错,否则安装失败
  • 成功安装后写入config.php

config.php分析

  • 包含可控参数(如mysql_prefix)
  • 可注入特殊字符
  • 需要定义puyuetian常量才能访问

RCE条件

  1. 成功安装系统
  2. 访问index.php(包含puyuetian.php,进而包含config.php)

漏洞复现

  1. 在安装界面填入payload
  2. 系统成功安装
  3. 触发phpinfo执行

4. 任意文件读取漏洞

漏洞位置

  • 全局搜索file_get_contents()函数
  • 传入type=edit进入特定分支
  • path参数可控且有白名单后缀限制

利用方式

  • GET传入json参数进入ExitJson函数
  • 读取内容以json形式回显

5. 模板上传绕过getshell

漏洞位置

  • app\superadmin\phpscript\app.php
  • 通过t=uploadapp参数控制执行流程

上传机制

  1. 检查文件后缀白名单
  2. 使用ZipArchive类处理上传的zip文件
    • open()方法打开压缩文件
    • extractTo()方法解压到根目录

ZipArchive类关键方法

  • addFile() - 添加文件到压缩包
  • addEmptyDir() - 添加空目录
  • addFromString() - 添加指定内容的文件
  • extractTo() - 解压到指定目录
  • renameIndex()/renameName() - 重命名文件
  • deleteIndex()/deleteName() - 删除文件

getshell方法

  1. 创建包含PHP文件的zip压缩包
  2. 利用上传功能上传zip文件
  3. 系统解压到根目录实现getshell

参考资源

  1. HadSky代码审计 - cri1stur
  2. ZipArchive类使用指南 - CSDN
HadSky PHP代码审计与漏洞利用分析 环境搭建 使用phpstudy进行环境搭建 创建网站后进入安装过程 安装完成后使用设置好的密码登录系统 路由分析 前台路由 系统使用puyuetian自研框架开发 功能点调用总是从index.php开始 index.php包含框架加载文件puyuetian.php 前台路由主要由load.php控制 通过GET传入 c 参数控制路由 不传入 c 参数则默认访问 phpscript/main.php 传入 c 参数则包含 phpscript 目录下相应文件 后台路由 访问 admin.php 进入后台 路由格式示例: app/superadmin:index app 代表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 参考资源 HadSky代码审计 - cri1stur ZipArchive类使用指南 - CSDN