知识

漏洞存在

时间:2010-12-5 17:23:32  作者:知识   来源:焦点  查看:  评论:0
内容摘要:2023年秋天,我帮一个做电商的朋友看他的后台日志。凌晨三点,有人用他的账号下单了十七台iPhone,收货地址是境外。他以为密码泄露了,改了三次,没用。我翻了翻代码,发现登录接口有个参数叫`debug

2023年秋天,漏洞存我帮一个做电商的漏洞存朋友看他的后台日志。凌晨三点,漏洞存有人用他的漏洞存账号下单了十七台iPhone,收货地址是漏洞存境外。他以为密码泄露了,漏洞存改了三次,漏洞存没用。漏洞存我翻了翻代码,漏洞存发现登录接口有个参数叫`debug_mode`,漏洞存传`true`进去,漏洞存验证码校验直接跳过。漏洞存这个参数是漏洞存两年前一个实习生留下的,注释写着“临时测试用”。漏洞存没人删。漏洞存

漏洞从来不是“被黑客攻破”那么戏剧化。大多数时候,它就蹲在你眼皮底下,穿着“临时方案”或者“先这样吧”的外衣。你每天路过它,甚至用它。直到某天有人顺手拧了一下。

我见过一个政务系统,上传附件的地方没做文件类型校验。你传个`.jpg`,它当图片存;你传个`.jsp`,它当脚本执行。开发的人说“内网嘛,没事”。结果内网里有人点了钓鱼邮件,一台机器沦陷,攻击者顺着这个上传口子拿到了整个数据库。那个上传功能,原本只是为了让科室的人传传会议纪要。

漏洞的本质是“预期之外”。你写代码的时候脑子里有一条路,用户会这么走,数据会这么流。但总有人不按你的路走。不是恶意,有时候就是手滑,或者好奇。我见过一个查询接口,参数是用户ID,正常传`123`,返回用户信息。有人传了`123' OR '1'='1`,整张表出来了。写这个接口的人后来跟我说,他以为前端会校验。前端确实校验了,但只校验了长度不超过10。

更麻烦的是,漏洞会繁殖。一个地方没校验,别的地方就会依赖这个“没校验”的假设。比如某个内部服务,默认调用方已经过滤了特殊字符,所以自己直接拼SQL。这个服务被另一个服务调用,另一个服务又暴露给外网。一层一层,像叠积木。你抽掉最底下那块,上面全塌。但没人知道最底下那块是空的,因为上面盖得太严实了。

我有时候觉得,写代码的人分两种:一种假设输入是干净的,一种假设输入是脏的。前一种人写的系统,跑得飞快,逻辑清爽,但经不起碰。后一种人写的系统,到处是`if`和`try`,看起来笨重,但活得久。现实是,前一种人往往更受重用,因为交付快,演示效果好。后一种人总被说“想太多”。

有个做安全的朋友跟我讲过一句话:漏洞不是技术问题,是时间问题。你写代码的时候,时间往前流,需求在变,人在换,文档在丢。那个`debug_mode`参数,那个没删的测试账号,那个“先上线再说”的配置,都是时间留下的裂缝。你没法在设计阶段消灭所有裂缝,因为设计的时候你还不知道明天会加什么功能。

所以漏洞存在。它不在某个具体的代码行里,它在“人”和“系统”的缝隙里。你修掉一个,另一个已经在别处长出来。这不是悲观,是事实。你能做的,是别假装它不存在。每次上线前,问一句:如果有人不按我预想的方式用这个功能,会发生什么?这个问题不值钱,但能挡住很多事。

那个电商朋友后来把所有“临时”参数都扫了一遍,又找出三个。其中一个,能让任何人查看他的订单列表。他改完,请我吃了顿烧烤。我说你这系统还得再挖。他笑了笑,说慢慢来。至少现在,他知道裂缝在哪了。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap