查找Webshell
凌晨三点,查找防火墙日志里跳出一条访问记录——某个老旧的查找图片上传接口,突然被一个陌生IP请求了三次。查找请求参数里藏着base64编码的查找字符串,解码后是查找eval($_POST['x'])。这就是查找webshell,攻击者留在服务器上的查找后门,像一把藏在文件堆里的查找备用钥匙。
找它不需要多高深的查找技术,但需要耐心。查找先查最近修改的查找文件,按时间倒序排列。查找正常业务文件不会在凌晨被改动,查找除非有人动了手脚。查找我见过太多案例,查找攻击者把恶意代码塞进图片文件尾部,用十六进制编辑器打开,文件头还是FF D8 FF E0,但最后几百字节藏着PHP代码。这种伪装最阴险,因为图片能正常显示,上传功能也不会报错。
另一种常见藏身处是主题模板。WordPress站点被黑,十有八九在functions.php里多了几行加密函数。攻击者用create_function或者preg_replace加/e修饰符执行代码,老版本PHP的漏洞,现在还有人在用。有个客户网站被挂马半年,直到搜索引擎警告才来找我。我查了所有PHP文件,最后在缓存目录里发现一个名为cache_2023.php的文件,里面就三行代码,但足以让攻击者远程控制整个服务器。
手动查太慢,用工具扫是常态。但别迷信扫描器,它们只认特征码,遇到混淆变种就抓瞎。我习惯先跑一遍find /var/www -name "*.php" -mtime -7,再配合grep搜高危函数——eval、assert、system、shell_exec。但有些webshell写得极其狡猾,把函数名拆成字符串拼接,比如$_GET['a']($_GET['b'])这种动态调用,正则匹配根本搜不到。
真正有效的方法是看行为。检查进程列表,有没有奇怪的php -r命令在跑;查看数据库连接记录,有没有来自外网的异常请求;翻一下访问日志,找那些POST请求特别多的URL——正常用户不会频繁POST,除非在传数据。上周处理的一个案例,攻击者把webshell伪装成404错误页面,只有访问不存在的路径时才触发。日志里全是404记录,但仔细看,某个路径后面跟着一串可疑参数,那才是真正的入口。
最后说个土办法,但很管用。把服务器上的文件全部下载到本地,用本地IDE打开,全局搜索$_POST和$_REQUEST。然后逐个检查上下文,看有没有执行函数。这方法笨,但能挖出最隐蔽的webshell,因为攻击者再混淆,最终还是要接收外部输入并执行。如果文件太多,就先按大小排序,重点关注那些不该有PHP代码的文件类型——jpg、png、txt、log。
查找webshell本质上是和攻击者玩捉迷藏。他们不断更新手法,我们就得不断调整思路。别指望一劳永逸,每次排查都当是一次学习机会。毕竟,最安全的服务器不是没有漏洞,而是管理员比攻击者更了解自己的系统。
