哪些漏洞
2021年冬天,漏洞Log4j爆出那个核弹级漏洞时,漏洞我正和朋友吃火锅。漏洞手机震个不停,漏洞运维群里已经炸了——半个互联网的漏洞Java服务都在裸奔。那会儿大家才真切意识到,漏洞代码里埋的漏洞雷,炸起来真不分你是漏洞大厂还是小作坊。
漏洞这东西,漏洞说白了就是漏洞系统该拦住的事没拦住。但有意思的漏洞是,它往往不是漏洞黑客多高明,而是漏洞写代码的人当时觉得"应该没事"。
注入类:把用户当傻子,漏洞用户就把你当筛子
SQL注入是漏洞最老的漏洞之一,老到很多人觉得早绝迹了。去年我帮一个创业公司看后台,登录框输入 ' or 1=1 --,直接进了管理员页面。开发跟我说:"我们前端做了校验啊。" 问题是你前端校验完,请求还能被Burp Suite改啊。这类漏洞的本质是:程序把用户输入当成了代码执行。不光是SQL,命令注入、LDAP注入、XPath注入,全是这个逻辑。防御方法粗暴有效——参数化查询,别拼字符串。但总有人图省事。
越权:你的数据,别人随便看
水平越权比SQL注入更隐蔽。改一下URL里的订单ID,就能看到别人的收货地址和电话。很多API只验证了"你登录了",没验证"这单是不是你的"。我见过一个电商系统,用户ID是自增的,爬虫从1遍历到100万,把全站用户手机号全撸走了。开发还委屈:"我做了登录鉴权啊。" 登录鉴权管的是"你是谁",越权管的是"你能碰什么"。两码事。
反序列化:信任的代价
Java的反序列化漏洞年年有,WebLogic、Fastjson、Shiro,轮着上热搜。原理不复杂:程序把一段二进制数据还原成对象时,如果这段数据能被控制,攻击者就能构造恶意对象链,最终执行任意命令。麻烦在于,很多反序列化点藏在框架底层,业务开发根本不知道。你写个 readObject(),以为只是读个配置,实际上给攻击者开了扇后门。这类漏洞的修复也恶心,经常要升级整个框架,牵一发动全身。
逻辑漏洞:规则写错了,比没写还可怕
前阵子某银行App的漏洞挺典型:转账时把金额改成负数,余额反而增加。这不是技术问题,是业务逻辑没想清楚。还有更离谱的——密码重置用短信验证码,但验证码校验成功后不失效,可以无限次重置任意用户密码。逻辑漏洞没有固定形态,全靠对业务的理解。自动化扫描器基本扫不出来,得靠人蹲在那儿慢慢试。我认识几个做渗透测试的,他们管这叫"手工活",累但值钱。
供应链:你用的轮子,可能是方的
Log4j那次为什么影响那么大?因为几乎所有Java项目都直接或间接依赖它。你代码写得再安全,引入一个带漏洞的第三方库,全白搭。现在npm、Maven、PyPI上的包,有多少是个人维护的?作者跑路了、账号被盗了、包名抢注了,都是风险。更别提那些故意投毒的——2022年npm上有个包叫 node-ipc,作者因为政治立场往代码里埋了删除文件的逻辑,谁用谁中招。供应链安全这事,靠自觉没用,得靠SBOM(软件物料清单)和依赖扫描工具盯着。
人的漏洞:最防不住的
钓鱼邮件、弱口令、把密钥传到GitHub、在Stack Overflow上贴生产环境代码……技术漏洞能打补丁,人的漏洞只能靠培训和制度。但培训往往流于形式,制度经常被绕过。我见过一个运维把数据库密码写在便签上贴显示器边框,理由是"反正办公室就我们几个人"。后来那台机器被入侵,数据全丢。人是最薄弱的环节,这话听了无数遍,但每次出事,根子还在人身上。
漏洞不会消失,只会换地方。今天修了SQL注入,明天冒出个原型链污染。写代码的人多一分敬畏,用系统的人少一分侥幸,大概就能少几个不眠之夜。
