Webshell的流量特征与文件级检测清除方法
摘要:# Webshell那点事儿:流量里的“鬼”和文件里的“雷” 说真的,干安全这行久了,最怕的不是那种正面硬刚的DDoS,而是那种悄无声息摸进来的后门。Webshell,就是这种让你后背发凉的玩意儿。它不搞大动静,就安安静静地躺在你的服务器上,像个幽灵,随…
Webshell那点事儿:流量里的“鬼”和文件里的“雷”
说真的,干安全这行久了,最怕的不是那种正面硬刚的DDoS,而是那种悄无声息摸进来的后门。Webshell,就是这种让你后背发凉的玩意儿。它不搞大动静,就安安静静地躺在你的服务器上,像个幽灵,随时等着别人来“串门”。
我自己处理过的应急响应里,十次有八次都能揪出这玩意儿。很多管理员直到被拖了库、挂了马,才发现自家网站早就“门户大开”了。问题往往不是没上防火墙,而是这“鬼”藏得太深,常规扫描根本扫不出来。
今天,咱们就抛开那些复杂的术语,聊点实在的:怎么从网络流量里嗅出它的味儿,又怎么在服务器文件里把它连根刨了。这感觉你懂吧?就像家里进了老鼠,光堵洞没用,你得知道它从哪儿溜进来,平时爱在哪儿活动,然后一锅端。
一、流量里的“鬼影”:Webshell通信那点不寻常
Webshell一旦植入,攻击者总得和它联系吧?这个“联系”的过程,就会在流量里留下痕迹。当然,现在的Webshell越来越“聪明”,但再聪明,也免不了露出些马脚。
首先,你得知道它在“聊”什么。 正常的网站访问,流量模式是有规律的:用户请求一个页面(比如/news/123.html),服务器返回HTML、图片、CSS这些资源。请求的URL、参数、频率,都符合业务逻辑。
但Webshell的通信,目的完全不同。它是为了执行命令、上传下载文件、探测内网。所以,它的流量特征,就像一群正常聊天的人里,混进了一个不停发摩斯密码的间谍,怎么看怎么别扭。
几个非常具体的“鬼影”特征,你可以对照着看看:
-
“低频高交互”的诡异会话:一个平时几乎没人访问的、稀奇古怪的页面(比如
/images/old.php,或者藏在/include/、/upload/目录下的莫名文件),突然开始有规律的、间隔性的访问。每次访问的时长可能很短,但前后会有一连串的、关联的请求。这很可能就是在进行命令执行和结果回传。 -
参数里的“乾坤”:这是最经典的标志。看看你的访问日志,有没有URL参数长得像天书?比如:
cmd.php?c=whoamiadmin.jsp?p=Y21kIC9jIGRpcg==(这是cmd /c dir的base64编码) 或者POST一大段明显是PHP/ASP/JSP代码的数据。 说白了,正常用户谁会在参数里传系统命令或者一大串编码?这种“把意图写在脸上”的请求,虽然原始,但依然常见于一些自动化攻击或低级别Webshell。 -
User-Agent的“cosplay”失败:有些Webshell客户端为了伪装,会使用一些过时的、或者极其常见的浏览器UA(比如某个版本的IE)。但在一个现代网站的后台日志里,如果某个IP一直用一个老掉牙的UA,在非正常时间(比如凌晨三点)访问管理后台路径或可疑文件,这就很值得拉响警报了。我自己就见过用“Googlebot”当UA,却疯狂请求
.php文件的——真当管理员不看日志啊? -
流量大小的“脉冲”:正常下载一个图片或页面,流量大小是相对稳定的。但通过Webshell下载一个数据库备份文件,或者上传一个木马,会产生一个非常突兀的、与周围请求格格不入的流量峰值。比如,一连串几KB的请求中,突然冒出一个几MB的POST请求,目标还是一个上传接口。这种“脉冲”,在流量监控图里就像平地起高楼,扎眼得很。
这里有个大实话要说: 很多中小公司,压根没有细粒度的流量分析设备。光靠看Nginx或Apache的访问日志,眼睛都得看花。我的建议是,至少配置一些简单的日志告警规则。比如,对包含特定关键词(eval(、system(、base64_decode)的请求,或者对非常规文件后缀(.php、.jsp、.asp出现在静态目录)的访问,进行实时告警。这能帮你抓住不少“懒”的Webshell。
二、服务器上的“扫雷”:怎么把Webshell挖出来清干净
流量监测是“预警系统”,但真正解决问题,还得落到服务器文件系统上。Webshell说到底,就是一个不该存在的脚本文件。找它,是一场耐心和细心的较量。
千万别只信杀毒软件! 很多Webshell经过混淆、加密,或者用了冷门的小马拉法,特征库根本跟不上。别问我怎么知道的,说多了都是泪。
第一步:先确定“雷区”范围
Webshell爱藏在哪儿?无非几个地方:
- 上传目录:
/uploads/,/images/,/static/这些允许用户传文件的地方,是重灾区。攻击者可能利用上传漏洞,直接把Webshell放进来。 - 临时目录:
/tmp/,/var/tmp/。有些Webshell执行时,会在这里生成临时文件。 - 网站程序目录:特别是那些CMS、论坛程序的插件、模板目录。比如
/wp-content/plugins/里混进一个奇怪的.php文件。 - “意想不到”的角落:
.git/目录下、配置文件旁边、甚至伪装成图片后缀(shell.php.jpg,如果服务器解析配置不当,它就能当php执行)。这类低配的藏匿方式真扛不住,但偏偏有人中招。
第二部:用“组合拳”检测
单一方法容易漏,得像过筛子一样,多过几遍。
-
时间戳筛查(最简单粗暴,也最有效):在业务低峰期(比如深夜),用
find命令查找最近几天被修改过的脚本文件。比如:find /var/www/html -name "*.php" -mtime -3(查找html目录下,3天内修改过的php文件) 突然出现的、你不认识的新文件,或者在不该被修改的时间被改动的文件,嫌疑极大。我前两天刚翻过一个服务器,就在一堆2019年的老文件里,揪出一个上周刚创建的cache.php,一打开,好家伙,满满的都是eval($_POST[‘x’])。 -
静态特征码扫描(但别完全依赖):可以用一些开源工具(如河马、D盾的扫描器)做全盘扫描。它们内置了大量Webshell的特征码,能快速发现已知的、未加密的Webshell。但是! 对于新型的、高度自定义的Webshell,这招可能失灵。所以,它适合做第一轮快速筛查,而不是最终判决。
-
语法/语义分析(高级玩法):这是对付加密Webshell的利器。原理是分析文件的代码逻辑。一个正常的业务脚本,和Webshell的代码“意图”完全不同。
- 看函数:大量使用
eval,assert,system,shell_exec,popen,base64_decode等危险函数,尤其是eval里面套一个解码或来自请求参数的变量,八九不离十。 - 看逻辑:正常的PHP文件,总归要干点显示内容、处理数据的事。如果一个文件里,几乎全是接收参数、解码、执行命令、回传结果的流程,没有任何其他业务逻辑,那它存在的意义是什么?答案不言而喻。
- 看连接:文件里有没有硬编码的外连IP或域名?有没有尝试连接数据库、读取敏感配置文件(如
config.inc.php)的操作?这些都是高危信号。
- 看函数:大量使用
-
“行为沙箱”检测(终极手段):对于可疑到极点的文件,可以把它丢到一个隔离的沙箱环境里跑一下,监控它实际会发起什么网络连接、读写什么文件、执行什么系统命令。这种方法最准,但门槛也高,一般用于深度分析。
第三步:清除与善后(最关键!)
找到Webshell文件,直接删除就完事了吗?—— 大错特错!
-
别急着删:先备份那个可疑文件(可以压缩加密码存起来),用于事后分析和留证。然后,立刻检查文件的上传时间、修改者权限。用
stat命令能看到详细信息。这能帮你判断入侵途径:是程序漏洞?还是服务器被弱口令爆破?或者是供应链污染? -
清除不是删除一个文件那么简单:Webshell往往是入侵的“结果”,而不是“原因”。你必须找到它怎么进来的。
- 检查同一目录、同一时间戳附近的其他文件。
- 彻底扫描整个服务器,看有没有其他隐藏的后门。
- 检查网站程序是否有未修补的漏洞(特别是上传功能、编辑器插件、SQL注入点)。
- 检查服务器和数据库的密码是否太弱。
- 查看
~/.bash_history、Web日志,尝试还原攻击路径。
-
修复漏洞,改密码:这是治本。把进来的洞堵上,修改所有涉及权限的密码(服务器root、数据库用户、后台管理员),强度给我往高了设。
-
加监控,防再犯:在关键目录(如上传目录)设置文件完整性监控(比如用
aide),一旦有文件被增删改,立即告警。给服务器装上靠谱的HIDS(主机入侵检测系统),它能监控更底层的异常行为。
写在最后:心里得有点数
说实话,没有一种方法能保证100%找出所有Webshell。攻击和防护,永远是一场道高一尺魔高一丈的博弈。
但只要你理解了Webshell“要通信、要执行命令” 这个核心目的,就能在流量和文件两个层面建立起有效的监控思路。别把安全想得太玄乎,很多时候就是细心查看日志、定期检查文件、及时更新补丁这些基本功。
如果你的服务器还只靠一个防火墙就觉得高枕无忧,你心里其实已经有答案了。真正的安全,是一种持续的状态,而不是一个买来就一劳永逸的产品。
行了,方法就是这些,具体怎么部署,还得看你自家的业务情况。多上心,勤查看,Webshell这东西,也没那么可怕。

