OWASP Top 10 每隔几年更新一次,2021 版把“失效的访问控制”推上了第一。这不是拍脑袋决定的——社区提交的数据里,94% 的被测应用都存在某种形式的访问控制缺陷。换句话说,你随便找十个网站,九个半都能被越权。
我印象很深的一个案例:某电商平台的订单查询接口是
/api/order?orderId=10086。把数字改成 10087,就能看到别人的订单,收货地址、手机号、买了什么东西,全在。开发当时觉得“用户又不知道别人的订单号”,但订单号是自增的,从 1 遍历到 100000 也就几分钟的事。这就是典型的 IDOR(不安全的直接对象引用),属于访问控制失效的子类。加密失败排第二,但很多人理解错了
“加密失败”不是说你没上 HTTPS。它指的是敏感数据在存储、传输、处理环节中缺乏有效保护。我见过一个医疗系统,前端登录确实走了 HTTPS,但后端把用户密码用 MD5 存库,而且没加盐。MD5 彩虹表一跑,六位以内的密码秒出。更离谱的是,数据库备份文件直接放在 Web 目录下,路径是
/backup/db_20240301.sql,连目录遍历都不用。第三名是注入。SQL 注入被说了二十年,按理说应该绝迹了。但 2023 年我帮一个朋友看他的小项目,登录逻辑是这样的:
SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'输入
' OR 1=1 --直接进后台。他说“我这项目就内部用,没人攻击”。结果上线三个月,数据库里多了一堆赌博广告。注入没死,只是换了个地方活着。现在 NoSQL 注入、命令注入、LDAP 注入同样在 Top 10 里占位。不安全设计:新面孔,老问题
2021 版新增了“不安全设计”,排第四。它和注入、访问控制不一样——那些是代码写错了,这个是设计阶段就没考虑安全。比如一个投票系统,设计时没限制每个账号只能投一次,代码写得再规范也白搭。再比如密码找回流程,设计成“输入邮箱直接返回新密码”,那攻击者只要知道邮箱就能接管账号。代码层面没有任何漏洞,逻辑本身就是漏洞。
安全配置错误排第五。这个我见得最多。默认口令没改、错误页面暴露堆栈信息、云存储桶权限设为 public、CORS 配成
Access-Control-Allow-Origin: *还带 credentials。有个客户把 Elasticsearch 的 9200 端口直接暴露在公网,没设密码,里面存着全公司的日志。我用浏览器打开就能看到所有索引。后面五个,个个都是老熟人
易受攻击和过时的组件排第六。Log4j2 那个洞出来的时候,多少项目被扒了一层皮。问题在于,很多团队根本不知道自己用了什么组件。npm 装一个包,依赖树能拉出几百个间接依赖,其中任何一个出了 CVE,你都暴露在风险里。我自己的做法是定期跑
npm audit和owasp dependency-check,但说实话,修起来很烦——有时候升一个包,整个项目跑不起来。身份认证和识别失败排第七。撞库、暴力破解、会话固定,都是这个范畴。有个后台管理系统,登录失败不锁定账号,验证码是前端生成的,可以直接绕过。我用 Burp 跑了一万次密码尝试,成功登入管理员账号。密码是
admin123。软件和数据完整性失败排第八。这个主要针对 CI/CD 管道和自动更新机制。如果攻击者能往你的构建流程里塞代码,那后面所有安全措施都是摆设。SolarWinds 事件就是典型案例——攻击者污染了构建过程,把后门塞进了官方更新包,18000 个客户中招。
安全日志和监控失败排第九。没日志、日志不告警、告警没人看,等于没有。我见过一个系统被挖矿了三个月才发现,因为 CPU 占用高被运维注意到了。日志里其实早有异常登录记录,但没人配告警规则。
SSRF 排第十。服务端请求伪造,攻击者让服务器去访问内网资源。云环境里尤其危险——通过 SSRF 可以拿到云厂商的元数据接口,进而获取临时凭证,接管整个云账号。Capital One 那次泄露 1 亿用户数据,入口就是 SSRF。
这十个漏洞,没有一个是新技术带来的新问题。它们反复出现,是因为开发节奏越来越快,安全往往被当成“以后再说”的事。但攻击者不会等你“以后再说”。
顶: 231踩: 57723






评论专区