漏洞会有
作者:焦点 来源:知识 浏览: 【大 中 小】 发布时间:2026-10-17 06:06:36 评论数:
去年秋天,漏洞我帮一个做电商的漏洞朋友查后台日志。凌晨两点,漏洞他发现有人用他的漏洞账号下单了三百多台手机,总价过百万。漏洞订单全部指向同一个收货地址,漏洞一个城中村快递代收点。漏洞他懵了,漏洞密码没泄露,漏洞手机没丢,漏洞双重验证也开着。漏洞问题出在哪?漏洞
后来我们翻代码,发现他半年前加过一个“优化登录体验”的漏洞小功能:如果用户在同一设备上连续登录失败三次,系统会发一条短信验证码,漏洞验证通过后自动跳过密码。漏洞逻辑本身不算离谱,但实现的时候,开发图省事,把验证码校验写在了前端。也就是说,只要改一下浏览器里的JS变量,就能伪造“验证通过”的状态。那晚攻击者就是抓到了这个点,绕过了密码和双重验证。
漏洞从来不是“会不会有”的问题,而是“什么时候被找到”的问题。你写一万行代码,可能九千九百行都严丝合缝,但剩下那一百行里藏着什么,自己都未必清楚。更麻烦的是,很多漏洞在功能上线时看起来完全合理,甚至是为了“用户体验”才加的。就像我朋友那个跳过密码的逻辑,产品经理觉得方便,开发觉得简单,测试没覆盖到异常路径,上线后半年没人碰,直到有人碰了。
我见过一个更离谱的。某内部管理系统,管理员可以导出用户数据。导出接口做了权限校验,只有管理员能调。但前端在调用之前,会先请求一个“检查权限”的接口,返回true才显示导出按钮。后端导出接口本身也校验权限,看起来没问题。可那个“检查权限”的接口,参数里带了一个role字段,前端传的是当前用户的角色。有人把role从user改成admin,检查接口就返回true,按钮出现了,然后点导出——后端居然也认了这个role字段,因为它从请求体里读角色,而不是从session里读。两个接口各自都“有校验”,合在一起等于没校验。
这种漏洞叫逻辑漏洞,杀毒软件扫不出来,代码扫描工具也经常漏报。它不依赖缓冲区溢出或者SQL注入那种经典手法,它依赖的是开发者对业务的理解偏差。你以为A和B是两件事,攻击者发现A和B共享了一个可以篡改的变量。
还有个细节挺有意思。我朋友那个电商系统,攻击者下单之后并没有立刻付款,而是把订单截图发到了某个论坛上,配文“这站随便刷”。他不是为了赚钱,是为了炫耀。很多漏洞被发现,最初都不是因为有人要搞破坏,而是因为有人手痒。一个参数改一改,看看会怎样。这种“手痒”在安全圈叫“fuzzing”,在普通人里叫“瞎试试”。
你没法防住所有瞎试试。你只能假设每一个输入都是恶意的,每一个前端传回来的值都是假的,每一个“临时方案”都会活到三年后。我另一个做运维的朋友,他们公司有个内部工具,登录后会在cookie里存一个is_admin=false。他跟我说这事的时候,我问他:“你改成true试试?”他改了,然后看到了全公司的薪资表。那个工具是五年前一个实习生写的,早没人维护了,但一直挂在内网里,谁都能访问。
漏洞会有,而且一直会有。不是因为你不够小心,是因为系统在生长。每加一个功能,每改一行代码,每接一个第三方服务,都在往一个原本就复杂的结构上再叠一层。叠到某个程度,没人能完整说出“这个请求从浏览器到数据库到底经过了哪些判断”。而那些判断之间的缝隙,就是漏洞住的地方。
所以别问“会不会有漏洞”。问“上一个被发现的漏洞是什么时候”。如果答案是“很久没发现了”,那可能不是好事——要么没人看,要么看了没看懂,要么看懂了没说。
