Skip to content

Latest commit

 

History

History
59 lines (49 loc) · 4.24 KB

File metadata and controls

59 lines (49 loc) · 4.24 KB

FakeMySQL SSRF(FakeMySQLSSRF)

  • 类别:mysql 别名:— 优先级:—
  • 作者:4ra1n
  • 依赖:无(利用面在受害方 MySQL JDBC 驱动的 LOCAL INFILE 处理逻辑)

作用

「恶意 MySQL 服务端」利用模型中的参数载荷 gadget,与 FakeMySQLReadFile 是同一机制的孪生变体:它把用户配置的一个 URL(而非本地文件路径)作为 String 交给 Fake MySQL Payload。当受害方 JDBC 客户端在处理服务端下发的 LOCAL INFILE 请求时,若把该「路径」当作 URL 去拉取,就会由客户端所在主机发起对该 URL 的请求,从而形成 SSRF。

链接标签

  • 入口 tagsFakeMySQLReadEND
    • FakeMySQLRead —— 与读文件变体共用同一标签,被 FakeMySQLReadPayload@PayloadAnnotation(gadgetTags={"FakeMySQLRead"}))识别为「读取/SSRF」模式的字符串载荷。
    • END —— 链尾 gadget,invoke 直接返回终值。
  • 衔接 nextTags:无。
  • excludes:无。

源码剖析

本类同样极简,invoke 直接返回配置的 URL 字符串,不做任何对象包装:

@GadgetTags(tags={"FakeMySQLRead", "END"})
@GadgetAnnotation(name="FakeMySQL SSRF", authors={"4ra1n"})
public class FakeMySQLSSRF implements Gadget {
    @Param(name="SSRF URL", description="eg: http://www.baidu.com")
    public String url = "http://www.baidu.com";

    @Override
    public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
        return this.url;              // 无 chain.doCreate,纯参数提供者
    }
}

它与 FakeMySQLReadFile 结构完全一致,唯一区别是 @Param 的语义从「文件路径」变成「URL」。二者返回的字符串都进入同一个 ReadFileResolver——该 Resolver 把字符串塞进 LOCAL INFILE 请求包的 0xFB 载荷:

ByteArrayOutputStream bao = new ByteArrayOutputStream();
bao.write(-5);                          // 0xFB LOCAL INFILE 标志
bao.write(this.fileOrUrl.getBytes());    // 此处 fileOrUrl 即本 gadget 的 url
this.outputStream.write(PacketHelper.buildPacket(1, bao.toByteArray()));

当受害方 JDBC 驱动把 LOCAL INFILE 的目标当作 URL 解析并拉取时(部分驱动/配置会以 URL 方式打开 infile 流),就会由客户端主机发起对 url 的出站请求,攻击者据此探测内网、访问元数据接口等。Resolver 随后仍尝试把「响应内容」按包接收并写入 fake-server-files/<时间戳>/<name>shortName 取自 new File(url).getName()),因此 SSRF 的响应体也可能被落盘取回。

说明:读文件与 SSRF 在 java-chains 侧走的是同一段服务端代码,实际能否成功、以及是走「读文件」还是「发 URL 请求」,取决于受害方 MySQL JDBC 驱动版本对 LOCAL INFILE 路径的解析行为。

参数(@Param)

字段 名称 说明 默认 可选值
url SSRF URL 诱导客户端主机发起请求的目标 URL,eg http://www.baidu.com http://www.baidu.com 任意 URL 字符串

适用版本与原理要点

  • 该 gadget 无独立 description,要点承自 FakeMySQLReadPayload:JDBC URL 完全可控时,即使较新驱动开启了 allowUrlInLocalInfile=true 等限制,仍可通过伪造 MySQL 服务端触发。
  • 本质与读文件同源——都是 MySQL 客户端对服务端 LOCAL INFILE 请求的过度信任;SSRF 变体把「本地文件」换成「远端 URL」,由客户端代为发起请求。
  • SSRF 返回内容同样会写入 java-chains 运行目录的 fake-server-files/ 下。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。使用时直接选择「Fake MySQL 读文件/SSRF」Payload(FakeMySQLReadPayload),单独以本 gadget 产出 URL 载荷即可。

关联

  • 同族/同标签:FakeMySQLReadFile(同 FakeMySQLRead 载荷,读本地文件;已入 ReadFile 链
  • 相关但不同利用面:FakeMySQLPipeFile(Fake MySQL 反序列化 RCE 路线)
  • 上层 Payload:FakeMySQLReadPayloadgadgetTags={"FakeMySQLRead"}mode="Fake MySQL"