当前位置: 首页 > 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;。 要创建一个…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...