一次巧妙获取shell的代码审计
字数 1143 2025-08-29 08:30:30

一次巧妙获取shell的代码审计分析

环境搭建

  1. 源码下载地址: https://github.com/rainrocka/xinhu
  2. 下载后解压到本地网站根目录下
  3. 配置好数据库并安装系统
  4. 默认管理员账号密码: 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方法

  1. 调用c()方法获取上传类实例
  2. 主要包含upfileChajian.php文件
  3. 分析upfileChajian.php中的up()方法:
    • 使用issavefile()方法进行后缀白名单检查
    • 上传PHP文件时$bo返回false
    • $file['up']为false时会调用filesave()方法

2. 文件保存机制

  1. filesave()方法将文件内容base64编码
  2. 写入到.uptemp临时文件
  3. 原始文件后缀被替换,无法直接利用

3. 文件后缀还原漏洞

关键文件: webmain/task/runt/qcloudCosAction.php中的runAction方法

  1. 可通过控制id参数将.uptemp后缀还原为原始上传后缀
  2. 构造路由: task.php?m=qcloudCos|runt&a=run&fileid=10

漏洞利用步骤

  1. 上传一个PHP文件,会被保存为.uptemp格式
  2. 记录上传文件的ID
  3. 构造特殊路由访问qcloudCosAction.phprunAction方法
  4. 通过fileid参数指定要还原的文件
  5. 系统将.uptemp文件还原为原始PHP后缀
  6. 访问还原后的PHP文件获取webshell

防御建议

  1. 对文件上传功能进行严格的白名单校验
  2. 不要信任客户端提供的文件ID参数
  3. 对文件还原操作增加权限检查
  4. 限制上传文件的存储目录不可执行
  5. 对上传文件进行内容检查,防止PHP代码上传
一次巧妙获取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代码上传