|
上周三下午,慧眼慧眼平台弹出一条高危告警:某业务系统的安全登录接口存在SQL注入。当时我正端着咖啡,检测检测差点没洒出来——这个接口刚上线不到两周,平台开发那边还拍胸脯说“绝对安全”。漏洞结果一测,整改用单引号加个or 1=1,报告直接绕过了密码验证。慧眼你说吓不吓人?安全 漏洞位置在 /api/v1/user/login,参数是检测检测 username。构造 username=admin' or 平台'1'='1 就能以管理员身份登录。更离谱的漏洞是,数据库报错信息直接回显到了前端页面,整改连表名和字段都看得一清二楚。报告开发同学后来承认,慧眼他图省事用了字符串拼接,没走参数化查询。这种低级错误,放在五年前都算丢人。 整改动作要快。我直接拉了个临时群,开发、运维、测试都在。第一件事:把那个接口从负载均衡里摘掉,临时返回503。别想着打补丁再上线,先止血。然后让开发改代码,用预编译语句重写查询。改完不能直接上,得在测试环境跑一遍慧眼的回归扫描。这里有个坑——测试环境的数据库版本和生产不一致,预编译参数在MySQL 5.7和8.0下行为略有差异。我们专门找了个影子库,模拟生产数据量压了一遍,确认没有二次注入才放行。 光改代码不够。数据库账号权限也得收。之前那个账号居然有 FILE 权限,能读写服务器文件。我让DBA直接降到最小权限:只给 SELECT、INSERT、UPDATE,别的全砍。另外把错误回显关了,统一返回“用户名或密码错误”,别给攻击者送情报。 上线那天晚上我盯着监控。慧眼平台重新扫了一遍,告警消失了。但我不放心,又手动测了几个变种:admin' --、admin' #、还有时间盲注 admin' AND SLEEP(5)--。全都返回401。这才算过关。 事后复盘,发现两个问题。一是代码审查流于形式,那个拼接写法在CR时居然没人提。二是慧眼平台其实在测试阶段就扫出过中危提示,但被开发忽略了,觉得“只是警告”。我后来把这条规则调成了阻断级别——中危以上必须修复才能合并代码。另外加了个自动化卡点:每次提交前跑一遍慧眼的增量扫描,不通过直接拒绝push。 还有个细节值得说。修复后第三天,慧眼又报了个低危:登录接口的响应时间在输入不同长度用户名时有微小差异。这属于时序侧信道,理论上能被用来枚举用户。虽然利用难度高,但我们还是加了固定延迟——所有失败请求统一延迟200毫秒返回。开发吐槽说“至于吗”,我回他:安全这事,宁可多花0.2秒,也别给人家留缝。 现在那个接口稳定跑了快两周,没再出幺蛾子。慧眼平台每天凌晨自动全量扫,我早上到公司第一件事就是看报告。说真的,工具再强也得人盯着。漏洞报告不是终点,整改闭环才是。下次再看到“绝对安全”这种话,我直接让他先过一遍慧眼再说。 |