主要API漏洞列表 2023年7月,漏洞列表某电商平台因为一个未授权访问漏洞,漏洞列表导致2100万条用户订单数据被爬取。漏洞列表问题出在哪?漏洞列表一个本该校验用户身份的API接口,开发人员为了方便测试,漏洞列表把鉴权中间件注释掉了,漏洞列表上线时忘了恢复。漏洞列表这种事听起来离谱,漏洞列表但每年都在发生。漏洞列表 API漏洞的漏洞列表类型其实不算多,但每一种都能造成实打实的漏洞列表损失。下面这份列表不是漏洞列表教科书式的分类,是漏洞列表我在实际渗透测试和代码审计中反复遇到的几类问题。 BOLA(失效的漏洞列表对象级授权) 这大概是API漏洞里出现频率最高的一类。简单说,漏洞列表接口没有检查当前用户是否有权访问目标资源。比如GET /api/users/12345/orders,你把12345改成12346,如果系统照样返回数据,那就是BOLA。 2021年,某社交平台的一个BOLA漏洞允许攻击者通过遍历用户ID读取任意人的私信内容。修复方式并不复杂——在每次数据查询时加上WHERE user_id = current_user的条件。但问题在于,很多团队在快速迭代时会把这类校验遗漏掉,尤其是接口数量膨胀到几百个之后。 批量赋值 用户注册接口通常只期望接收username和password。但如果后端直接把请求体映射到数据库模型上,攻击者可以多传一个"role": "admin",瞬间完成提权。 我见过一个真实案例:某SaaS产品的用户更新接口支持修改昵称和头像,但请求体里多传"plan": "enterprise"就能免费升级到企业版。开发团队用的是ORM的批量赋值功能,图省事,结果省出了事。 速率限制缺失 登录接口没有速率限制,等于把暴力破解的大门敞开。短信验证码接口没有限制,攻击者能在一晚上刷掉你几万条短信费用。 有个细节很多人忽略:速率限制不能只按IP做。攻击者用代理池轮换IP,你的IP维度限流就形同虚设。得结合用户维度、设备指纹、行为特征一起判断。某金融App的OTP验证接口就是只做了IP限流,结果被攻击者用200个代理IP轮番请求,成功爆破了一批弱验证码。 注入类漏洞 API场景下的注入不只是SQL注入。NoSQL注入在MongoDB驱动的接口里很常见——传一个{ "username": { "$gt": ""}}就可能绕过登录验证。还有命令注入,某个图片处理API把用户传的文件名直接拼接到ImageMagick的命令行里,传个; rm -rf /就能执行任意命令。 GraphQL的注入更隐蔽。如果查询深度没有限制,一个嵌套查询就能把服务器打挂。如果字段级授权没做好,普通用户可以通过构造查询语句读取管理员才能看到的字段。 信息泄露 API的错误响应经常比预期多说了很多。比如返回"error": "Column 'password_hash' not found in table 'users'",这直接把数据库结构暴露了。还有Swagger文档在生产环境没关,攻击者直接拿到完整的接口清单和参数说明,省去了大量枚举工作。 一个容易被忽视的点:API版本迭代时,旧版本接口往往忘了下线。/api/v1/users修了授权漏洞,但/api/v1/users还活着,而且没有任何鉴权。 JWT相关 算法混淆攻击(把RS256改成HS256,用公钥当HMAC密钥签名)、none算法攻击、密钥硬编码在客户端代码里——这些JWT的经典问题至今仍然有效。更常见的是JWT没有设置合理的过期时间,或者注销后token仍然有效。 我个人的判断是:JWT本身没问题,问题在于很多团队把它当session用,却没有实现服务端的吊销机制。 上面这些漏洞有一个共同点——它们都不是什么高深的技术问题。修复方案通常只需要几行代码。真正难的是在快速迭代中保持对每一个接口的警惕,以及在代码审查时把安全校验当作和业务逻辑同等重要的东西来对待。 |