webshell检测工具

webshell检测工具

凌晨两点,检测某金融公司安全工程师老周收到告警邮件——他部署的工具检测工具在一台内网测试服务器上标记了一个可疑PHP文件。文件名叫upload.php,检测大小只有2KB,工具创建时间显示是检测当天下午三点。老周打开文件,工具里面是检测一段经过编码的字符串,解码后是工具一行eval($_POST['x'])。这就是检测典型的webshell,攻击者通过文件上传漏洞塞进去的工具。

webshell这东西,检测本质上就是工具攻击者留在服务器上的后门。它可能是检测个ASP、PHP、工具JSP文件,检测甚至藏在图片的EXIF信息里。检测工具的任务,就是在这堆浩如烟海的文件里把这种“幽灵”揪出来。但问题在于——webshell的变种太多了。有的用加密函数包裹,有的把危险函数拆成字符串拼接,有的干脆伪装成正常业务代码,混在几千行项目文件里。

市面上的检测工具大致分三类。基于特征的,就是拿已知的恶意代码签名去比对文件,简单粗暴,但对零日变种基本无效。基于行为的,监控文件执行时的系统调用、网络连接,比如某个PHP文件突然向外发起TCP连接,那就很可疑,这种能抓未知的,但误报率也高,正常业务偶尔也会连个外部API。还有基于机器学习的,把文件转成向量,训练模型判断恶意概率,听起来高大上,但训练数据一旦过时,照样失灵。

我见过一个真实案例。某电商公司用某款开源工具扫描,所有文件都显示“干净”。后来请人做渗透测试,发现攻击者早在半年前就植入了一个用create_function构造的webshell,这函数本身已经被PHP 7.2废弃,但老代码还在跑。检测工具的特征库根本没收录这种写法。后来换了个商业工具,才查出来。工具不是万能的,关键看维护的人。

再说个细节。好用的工具会给你看“上下文”——这个文件什么时候被创建?最近有没有被修改?它的父进程是谁?如果文件是三个月前通过FTP上传的,而那个FTP账号早就停用了,那基本可以断定有问题。单纯报一个“发现恶意代码”的结论,没有这些线索,安全人员还得自己翻日志,效率低一半。

我自己常用的一款工具,它的启发式扫描会计算每个文件的“危险指数”,根据文件位置(比如在/tmp目录)、文件大小(小于5KB的PHP文件很可疑)、以及是否包含加密字符串来综合打分。有一次它把一个正常的日志处理脚本标成高风险,我点开一看,那脚本里确实用了shell_exec来调用系统命令,但人家是正经的运维脚本。误报这东西,你得学会看门道。

说实话,没有哪个工具能一劳永逸。攻击者也在用工具生成免杀的webshell,两边是猫鼠游戏。但好的检测工具至少能做到——在攻击者拿走数据之前,给你一个明确的方向。就像老周那次,他顺着告警查下去,发现攻击者是通过一个旧版ThinkPHP的RCE漏洞进来的,漏洞补丁三个月前就发布了,但服务器没重启,补丁没生效。工具帮他找到了洞,但补不补,还是人的事。

所以,选工具别只看检测率数字。你得看它能不能告诉你“为什么”,能不能跟你的SIEM联动,能不能在你睡觉的时候把告警推到你手机上。工具是死的,用工具的人是活的。