Sentinel 与 MySQL 隐式转换机制的叠加利用
字数 1637
更新时间 2026-01-31 12:05:37

Sentinel与MySQL隐式转换机制叠加利用漏洞分析教学文档

漏洞概述

本漏洞是一个身份认证绕过漏洞,由Cartalyst Sentinel库的解析逻辑、MySQL隐式类型转换特性和PHP弱类型判断三个因素叠加形成。攻击者可通过精心构造的Cookie值绕过系统认证机制。

环境背景

  • 目标系统:运行老旧PHP代码的设备
  • 认证组件:Cartalyst Sentinel库(Native版本)
  • 数据库:MySQL
  • 漏洞类型:身份认证绕过

技术原理分析

1. 正常认证流程

if ($user = Sentinel::check()) {
    // 已登录:刷新会话
    renewSession();
} else {
    // 未登录:进行认证
    $user = Sentinel::authenticate($credentials);
}

2. MySQL隐式类型转换机制

  • persistences表的code字段为字符串类型(varchar)
  • 当执行where code=5(整数比较)时,MySQL会将字符串转换为整数
  • 转换规则:取字符串开头的数字部分,遇到非数字字符停止
  • 示例:"5M6o..."会被转换为整数5

3. Sentinel组件漏洞点

3.1 Cookie解析类型失控

文件cartalyst/sentinel/src/Cookies/NativeCookie.php

public function get()
{
    $value = $this->request->cookie($this->key);
    return json_decode($value); // 关键漏洞点
}
  • json_decode('5')返回整数5
  • json_decode('"5"')返回字符串"5"

3.2 数据库查询构造

文件cartalyst/sentinel/src/Persistences/IlluminatePersistenceRepository.php

public function findByPersistenceCode($code)
{
    return $this->createModel()
        ->newQuery()
        ->where('code', $code) // 类型影响查询构造
        ->first();
}

4. 漏洞触发条件对比表

参数类型 生成SQL MySQL转换机制 匹配结果
正常登录(字符串) where code='5abc789' 精确字符串匹配 仅匹配真实code
绕过登录(整数) where code=5 字符串转整数匹配开头数字 匹配所有以5开头的code

完整攻击链

步骤1:信息收集

  • 确认目标使用Cartalyst Sentinel认证组件
  • 获取默认Cookie名称:cartalyst_sentinel

步骤2:寻找可利用会话

  • 查询数据库persistences
  • 寻找以数字开头的code值(如:5M6o...
  • 统计显示约35个有效会话中可能出现1个数字开头的code

步骤3:构造攻击载荷

GET /protected-page HTTP/1.1
Cookie: cartalyst_sentinel=5
  • 直接传入数字值5(非字符串"5"

步骤4:漏洞触发过程

  1. Sentinel读取Cookie:cartalyst_sentinel=5
  2. json_decode('5')返回整数5
  3. 执行查询:where code = 5
  4. MySQL隐式转换匹配到code5开头的记录
  5. Sentinel返回用户对象(非false)
  6. 认证绕过成功

防护方案

1. 组件升级

升级到Cartalyst Sentinel v2.0+版本,主要修复:

  • check()方法添加返回类型约束
  • getUser()方法明确返回用户对象或null

2. 代码层面修复

// 修复前
$code = json_decode($_COOKIE['cartalyst_sentinel']);

// 修复后:强制类型转换
$code = (string) json_decode($_COOKIE['cartalyst_sentinel']);

3. 数据库设计优化

  • 使用纯随机字符串(不含数字开头)
  • 或使用UUID等避免数字开头的标识符

4. 查询优化

// 使用严格类型比较
->where('code', '===', $code)

漏洞利用限制与价值

利用限制

  • 需要数据库中存在以数字开头的有效会话code
  • 成功率较低(约1/35)
  • 依赖特定第三方库版本

研究价值

  • 展示多重漏洞叠加利用的技术思路
  • 强调类型安全在Web安全中的重要性
  • 提供供应链安全研究的典型案例

参考资源

  1. Cartalyst Sentinel GitHub仓库
  2. MySQL 8.0类型转换文档

总结

该漏洞是典型的链式漏洞利用案例,涉及:

  1. 组件层:Cookie解析逻辑缺陷
  2. 语言层:PHP弱类型特性
  3. 数据库层:MySQL隐式类型转换

虽然实际利用条件较为苛刻,但深刻揭示了现代Web应用中类型安全的重要性,以及供应链安全审计的必要性。

 全屏