Webshell 特征扫描是什么
特征扫描是用一组高危函数名与危险组合在 Web 目录里做全文检索,快速圈出需要人工审阅的文件。它的定位是缩小范围,而不是下结论:命中多、误报高是正常现象,因为框架、模板引擎与图片处理库也会合法使用这些函数。判断需要两步走——先看内容特征是否与请求参数形成「可控输入直达执行」的组合,再结合文件来源与落地时间确认。
基本信息
| 高危函数 | eval、assert、system、shell_exec、passthru、popen、proc_open |
|---|---|
| 编码类特征 | base64_decode、gzinflate、str_rot13、字符拼接后动态调用 |
| 组合特征 | 请求参数直接进入执行函数,如 $_POST、$_GET、$_REQUEST |
| 高置信形态 | 文件体积极小、单行混淆、把代码塞在注释或图片注释段里 |
| 覆盖范围 | php、jsp、jspx、aspx、ashx、phtml 以及被改名的可解析文件 |
| 配套动作 | 命中列表复制到隔离目录,先留样本再决定删除 |
典型使用场景
- 安全设备告警后快速确认 Web 目录里有哪些疑似后门
- 按时间线索排查之后,用内容特征做第二轮收敛
- 站点被挂马或跳转时定位投放脚本
- 清理后复扫,确认没有同类文件残留
- 为人工审阅排出优先级:超短与混淆文件排在最前
扫描高危函数与混淆迹象
扫描高危函数与混淆迹象
grep -rEn 'eval\(|assert\(|base64_decode\(|shell_exec\(|passthru\(|system\(' /www --include='*.php' 2>/dev/null | head -n 40
grep -rEln '\$_(POST|GET|REQUEST|COOKIE)\[[^]]+\].*(eval|system|exec|assert|passthru)' /www --include='*.php' 2>/dev/null | head -n 20
grep -rEln 'preg_replace\(' /e' /www --include='*.php' 2>/dev/null | head -n 10
for e in jsp jspx aspx ashx phtml; do grep -rEln 'Runtime\.getRuntime|ProcessBuilder|eval\(' /www --include="*.$e" 2>/dev/null | head -n 5; done
awk 'length($0) < 120 && /eval|assert|base64/' /www/wwwroot/suspect.php 2>/dev/null | head特征与含义
| 特征 | 含义 | 误报可能 |
|---|---|---|
| eval 与 assert | 把字符串当代码执行 | 模板引擎、旧框架的正常用法 |
| base64_decode 配合 eval | 解码后执行,常见混淆手法 | 加密配置解密逻辑也有类似写法 |
| system、shell_exec、passthru | 直接调用系统命令 | 运维脚本、导出工具会合法调用 |
| preg_replace 加 /e 修饰符 | 替换结果被当作代码执行 | 老版本框架的已知用法,需按版本判断 |
| 参数直达执行函数 | 外部输入可控,构成完整利用链 | 极少数框架的受控封装 |
| 超短文件与单行混淆 | 一句话后门或投放器 | 占位文件、临时调试脚本 |
命中不等于恶意:直接按关键字批量删文件可能删掉业务组件。正确顺序是复制到隔离目录留样、人工读内容确认利用链、再删除,最后复扫确认没有残留。
扫描要覆盖别名扩展名与可写目录:.phtml、.php5、.inc 等同样可能被解析,图片与缓存目录也常是投放落点。只扫 .php 会漏掉相当一部分样本。