一块只有 4KB 的漏洞 PHP 文件,能让整台服务器变成别人的漏洞肉鸡。这不是漏洞假设——2023 年某电商平台被拖库,溯源结果就是漏洞运维人员图省事,在 /uploads 目录留了一个名叫 `debug.php` 的漏洞 webshell,密码是漏洞 `admin888`。攻击者上传它只用了不到三秒。漏洞
Webshell 的漏洞本质很简单:一段跑在服务器上的代码,接收外部指令并执行。漏洞PHP、漏洞JSP、漏洞ASPX 都能写,漏洞甚至 Node.js 和 Python 环境也有对应的漏洞变种。它和普通后门程序的漏洞区别在于,webshell 寄生在 Web 服务进程里,漏洞流量走 80 或 443 端口,防火墙基本不会拦。你封 IP?换个代理就行。你查进程?它和正常网页请求混在一起,肉眼很难分辨。
常见的植入路径有三条。文件上传漏洞最直接——头像上传、附件上传、编辑器上传,只要过滤不严,传个 `.php` 上去就完事。有些开发者只检查 Content-Type,那更省事,抓包改一下就行。第二条是 SQL 注入后写文件,`SELECT ... INTO OUTFILE` 配合 secure_file_priv 配置不当,直接往 Web 目录扔木马。第三条是远程文件包含,`include($_GET['page'])` 这种写法,攻击者让服务器去加载远程 URL,代码就在本地执行了。
我见过最离谱的案例是一个政府站群。运维图方便,在每台机器上都放了同一个 webshell 做“批量管理”,文件名伪装成 `wp-config.php.bak`。结果其中一台被拿下,攻击者用这个 webshell 当跳板,横向扫了内网 200 多台机器。那个 webshell 的代码只有一行:``。就这一行,权限是 www-data,但服务器上跑着 MySQL,弱口令一猜就中,root 权限到手只是时间问题。
检测 webshell 比想象中难。静态特征匹配?攻击者把代码拆成多个文件,或者用 base64 编码,甚至用 `$_POST['a']($_POST['b'])` 这种动态调用,正则根本抓不住。流量分析?webshell 的请求和正常 API 调用长得太像,除非你专门盯着 POST 请求里那些异常长的参数。行为监控倒是有用——一个 PHP 进程突然去读 /etc/passwd,或者执行 `whoami`,这明显不对劲。但前提是你得部署了 RASP 或者 HIDS,大部分中小站点连日志都没开全。
真正有效的防御得从根上掐。上传目录禁止解析脚本,这是铁律。Nginx 里加一行 `location ^~ /uploads/ { deny all; }` 就能挡掉大部分低级攻击。数据库账户别给 FILE 权限,`secure_file_priv` 设成 NULL。文件包含漏洞?别用用户输入拼路径,白名单校验是最笨也最稳的办法。还有,别在服务器上留任何“测试用”的脚本。我见过一个 webshell 藏了三年,就因为文件名是 `test.php`,管理员每次看到都以为是别人的测试文件,懒得删。
最后说个细节。很多 webshell 会主动清理访问日志,或者把自身时间戳改成和正常文件一样。你查 `ls -la` 看不出问题,但 `stat` 一下 inode 变化时间,或者对比文件哈希,就能发现异常。攻击者往往忽略这一点——他们改得了 mtime,改不了 ctime。这个时间差,就是抓他的机会。
顶: 57643踩: 82514





评论专区