当前位置:首页 > 综合

漏洞发现

2023年秋天,漏洞发现我在一个客户的漏洞发现内网里翻出一台没人管的旧服务器。IP段是漏洞发现10.0.12.0/24,扫了一遍,漏洞发现只有这台机器开着22和8080。漏洞发现8080端口跑着一个叫“数据同步助手”的漏洞发现Web应用,登录页面丑得离谱,漏洞发现输入框连居中都没做。漏洞发现我试了admin/admin,漏洞发现进去了。漏洞发现

这不是漏洞发现运气。很多漏洞就长这样——不是漏洞发现精心设计的攻击链,不是漏洞发现零日,就是漏洞发现一个开发图省事留下的后门。那台服务器上跑的漏洞发现是三年前某个外包团队交付的代码,项目验收完人就撤了,没人维护,没人更新,甚至没人记得它还在运行。

进去之后我点了几下,发现一个“导出日志”的功能。URL是/export?file=app.log。我把app.log换成../../../../etc/passwd,页面直接吐出了系统的用户列表。目录穿越,老掉牙的东西,但在这台机器上活得很好。

真正让我停下来的是另一个细节。那个导出接口的响应头里带着X-Powered-By: Java/1.8.0_181。这个版本号对应的JDK发布于2018年,里面有好几个已知的反序列化漏洞。我顺手测了一下,果然,ysoserial生成的payload打过去,服务器直接弹了一个shell回来。整个过程不到二十分钟。

事后我跟客户的安全负责人聊,他说这台机器“不在资产清单里”。外包团队交付时只给了个压缩包,运维解压跑起来就忘了。资产管理系统没录入,漏洞扫描器没覆盖,连防火墙策略都是临时加的。一个被遗忘的角落,堆着三层漏洞:弱口令、目录穿越、 outdated 组件。每一层单拎出来都不算致命,叠在一起就是一扇敞开的门。

我后来养成了一个习惯:每次做渗透测试,先不急着上工具。花半小时翻目标单位的GitLab、Confluence和共享文件服务器。找什么?找那些名字里带“test”“demo”“old”“backup”的仓库和文档。漏洞往往不在代码本身,而在代码被遗忘的过程里。一个开发在README里写了数据库密码,两年后这个仓库还在,密码也没改。一个运维把生产环境的SSH密钥传到了内网Wiki上,权限设成了“所有人可见”。这些东西扫描器扫不出来,但人能找到。

还有一次,我在一个客户的OA系统里发现了一个“记住密码”的功能,实现方式是直接把Base64编码的密码存进cookie。我解了一下,明文。更离谱的是,这个cookie的有效期是十年。开发大概觉得“反正用户自己电脑上存着,无所谓”。但那个OA系统是公网可访问的,cookie没设HttpOnly,一个XSS就能把所有人的密码捞走。

漏洞发现这件事,工具能帮你覆盖已知的pattern,但真正有意思的漏洞往往藏在“人觉得没问题”的地方。开发觉得内网安全,运维觉得老系统没人看,产品觉得这个功能先上线再说。每一个“觉得”背后,都是一个洞。

我现在看一个系统,会先问三个问题:这东西谁在维护?上次更新是什么时候?如果它明天挂了,有人会发现吗?答案往往指向同一个方向——那个没人管的角落,就是漏洞最多的地方。

分享到: