游客发表
你打开浏览器,类型漏洞访问一个网站,和版服务器返回的本号HTTP响应头里,第一行就写着`Server: nginx/1.18.0`或者`Apache/2.4.41 (Ubuntu)`。类型漏洞绝大多数人扫一眼就过去,和版但对我来说,本号这行字就是类型漏洞服务器在裸奔时不小心露出的内裤边——它直接告诉攻击者:我是什么牌子的服务器,我用的和版哪个版本,甚至我跑在什么系统上。本号这不是类型漏洞危言耸听,而是和版渗透测试里最基础的信息收集步骤。
拿Nginx举例。本号如果响应头暴露`nginx/1.14.0`,类型漏洞老手立刻能想到CVE-2019-9511、和版CVE-2019-9513这些HTTP/2的本号拒绝服务漏洞。Apache更别提了,2.4.49和2.4.50的路径遍历漏洞(CVE-2021-41773)闹得沸沸扬扬,当时只要在URL里加一串`/cgi-bin/.%2e/%2e/%2e/`,就能直接读到服务器上的/etc/passwd。这些漏洞在最新版本里修掉了,但全球还有多少台服务器停在旧版本上?我去年做过一次小范围扫描,随机抽了1000个IPv4地址,结果显示有23%的Apache服务器还在跑2.4.49或更老。这比例足够让人失眠。
更隐蔽的问题在于版本号泄露带来的“定向攻击”便利性。攻击者不需要盲猜,不需要广撒网,直接拿着版本号去漏洞库查,几分钟就能列出所有已知CVE。比如IIS 7.5有个经典的短文件名漏洞,配合`~`符号能枚举服务器上的文件名——你如果看到`Server: Microsoft-IIS/7.5`,基本等于对方告诉你“我这里有这个洞,快来打”。这比打哑谜省事多了。
有人可能会说,那我隐藏版本号不就行了?把`server_tokens off`打开,或者改掉响应头里的Server字段。这确实能挡住一部分脚本小子,但挡不住认真的人。因为漏洞利用不只看响应头——错误页面、默认文件、响应头里的其他字段(比如`X-Powered-By: PHP/7.2`)都可能泄露信息。而且有些服务器即使隐藏了版本,行为特征也藏不住:Nginx处理特定请求的响应方式、Apache的404页面格式、Tomcat的默认错误页,都有指纹。我见过一个运维把版本号全改了,结果响应头里冒出个`Server: cougar`,一看就是Tomcat的默认别名,等于白改。
真正该做的不是单纯隐藏,而是升级。但升级也有讲究。有些管理员嫌麻烦,只打补丁不升大版本,结果老版本里某些漏洞的补丁没打全,或者补丁本身引入新问题。比如Apache 2.2.15在2010年就停止维护了,但直到2017年还有人在用,因为当时CentOS 6默认带的就是这个版本。后来爆出mod_proxy的多个漏洞,官方只修了2.4.x,2.2.x的用户只能自己扛。这种“僵尸服务器”在政企内网里特别多,业务不能停,系统不敢动,最后只能拿防火墙硬挡,但内网横向渗透时防火墙形同虚设。
举个实际案例。2022年我参与一次授权测试,目标是个老旧的OA系统,响应头写着`Server: Apache/2.2.3 (CentOS)`。我连扫描器都没开,直接拿CVE-2012-0053(HTTP头注入)试了试,还真能往响应头里塞内容。接着利用一个mod_negotiation的漏洞,硬生生在服务器上执行了命令。整个过程不到十分钟,全程没碰到任何WAF——因为对方根本不知道这版本有多老。
所以我的建议很直接:要么把服务器升级到厂商还在维护的版本,要么在反向代理层统一改写响应头,把真实版本号彻底抹掉。但别以为这就完了——你还得定期检查后端所有组件的版本,包括PHP、OpenSSL、Tomcat。这些家伙的版本号可能藏在`X-Powered-By`或者cookie里。安全这行当,从来不是藏住一个字段就万事大吉,而是你比攻击者更清楚自己身上哪里在漏风。
友情链接