某通用系统0day审计过程
字数 1166 2025-08-23 18:31:18

通用系统0day审计过程教学文档

1. 系统路由分析

路由结构解析

  • 示例路由:/setting.php/index/login
    • setting:对应Application下的文件
    • index:对应Setting下的Controller文件名
    • login:对应Controller中的方法名

2. 文件上传漏洞审计

漏洞位置

Application\Admin\Controller\UploadController.class.php

漏洞分析

  1. 控制器继承了一个upload控制器父类

  2. 实例化UploadFile()对象并设置属性:

    $upload->exts = array('jpg', 'gif', 'png', 'jpeg');
    
  3. 魔术方法__set存在问题:

    public function __set($name,$value){
        if(isset($this->config[$name])) {
            $this->config[$name] = $value;
        }
    }
    
  4. 配置数组$config中不存在exts项,导致后缀检查失效:

    private $config = array(
        'maxSize' => -1,
        'supportMulti' => true,
        'allowExts' => array(), // 实际控制上传后缀的配置项
        // 其他配置...
    );
    
  5. 实际检查函数checkExt是有效的,但由于配置未被正确设置导致绕过:

    private function checkExt($ext) {
        if(!empty($this->allowExts))
            return in_array(strtolower($ext),$this->allowExts,true);
        return true;
    }
    

漏洞利用

  • 只要存在$upload->exts = 这种形式的上传接口,就可能存在任意文件上传漏洞
  • 因为exts不会被实际设置到allowExts中,导致后缀检查被绕过

3. SQL注入漏洞审计(绕过Redis缓存)

漏洞位置

前台控制器中的特定路由

漏洞分析

  1. 关键变量:

    • $count:用于避免频繁查询
    • $listJson:决定是否执行SQL查询
  2. 绕过条件:

    if (!$listJson) {
        // 执行SQL查询
    }
    
  3. 绕过方法:

    • 设置随机伪造的PHPSESSID绕过$count检查
    • 使用不存在的随机phone号码绕过Redis缓存
    • 因为系统会将查询过的phone存入Redis,必须每次使用不同的随机号码

漏洞利用

  • 通过随机化phone参数绕过Redis缓存
  • 使系统每次都会执行SQL查询,从而进行注入

4. SSRF漏洞审计

漏洞位置

Application\Course\Controller\DocumentController.class.php

漏洞分析

  1. 关键检查:

    if (!isset($_SERVER['HTTP_AUTHORIZATION']) || !isset($_SERVER['HTTP_X_OSS_PUB_KEY_URL'])) {
        // 403跳转
    }
    
  2. 漏洞触发:

    • 当上述两个header都存在时,系统会将HTTP_X_OSS_PUB_KEY_URL的值进行base64解码
    • 然后直接通过curl_exec()执行

漏洞利用

构造包含以下header的请求:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
X-Oss-Pub-Key-Url: [base64编码的恶意URL]

示例:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
X-Oss-Pub-Key-Url: aHR0cDovL2V4YW1wbGUuY29t

5. 总结

发现的安全问题

  1. 任意文件上传漏洞

    • 原因:文件后缀检查配置未被正确设置
    • 影响:可上传任意文件
  2. SQL注入漏洞

    • 原因:Redis缓存机制可被绕过
    • 影响:可进行SQL注入攻击
  3. SSRF漏洞

    • 原因:未验证的header直接用于curl请求
    • 影响:可发起内部网络请求

修复建议

  1. 文件上传:

    • 修正extsallowExts的配置映射
    • 加强文件类型检查
  2. SQL注入:

    • 添加参数过滤
    • 改进缓存机制
  3. SSRF:

    • 验证X-Oss-Pub-Key-Url的URL是否合法
    • 限制curl可访问的网络范围
通用系统0day审计过程教学文档 1. 系统路由分析 路由结构解析 示例路由: /setting.php/index/login setting :对应 Application 下的文件 index :对应 Setting 下的 Controller 文件名 login :对应 Controller 中的方法名 2. 文件上传漏洞审计 漏洞位置 Application\Admin\Controller\UploadController.class.php 漏洞分析 控制器继承了一个 upload 控制器父类 实例化 UploadFile() 对象并设置属性: 魔术方法 __set 存在问题: 配置数组 $config 中不存在 exts 项,导致后缀检查失效: 实际检查函数 checkExt 是有效的,但由于配置未被正确设置导致绕过: 漏洞利用 只要存在 $upload->exts = 这种形式的上传接口,就可能存在任意文件上传漏洞 因为 exts 不会被实际设置到 allowExts 中,导致后缀检查被绕过 3. SQL注入漏洞审计(绕过Redis缓存) 漏洞位置 前台控制器中的特定路由 漏洞分析 关键变量: $count :用于避免频繁查询 $listJson :决定是否执行SQL查询 绕过条件: 绕过方法: 设置随机伪造的 PHPSESSID 绕过 $count 检查 使用不存在的随机 phone 号码绕过Redis缓存 因为系统会将查询过的 phone 存入Redis,必须每次使用不同的随机号码 漏洞利用 通过随机化 phone 参数绕过Redis缓存 使系统每次都会执行SQL查询,从而进行注入 4. SSRF漏洞审计 漏洞位置 Application\Course\Controller\DocumentController.class.php 漏洞分析 关键检查: 漏洞触发: 当上述两个header都存在时,系统会将 HTTP_X_OSS_PUB_KEY_URL 的值进行base64解码 然后直接通过 curl_exec() 执行 漏洞利用 构造包含以下header的请求: 示例: 5. 总结 发现的安全问题 任意文件上传漏洞 原因:文件后缀检查配置未被正确设置 影响:可上传任意文件 SQL注入漏洞 原因:Redis缓存机制可被绕过 影响:可进行SQL注入攻击 SSRF漏洞 原因:未验证的header直接用于curl请求 影响:可发起内部网络请求 修复建议 文件上传: 修正 exts 到 allowExts 的配置映射 加强文件类型检查 SQL注入: 添加参数过滤 改进缓存机制 SSRF: 验证 X-Oss-Pub-Key-Url 的URL是否合法 限制curl可访问的网络范围