API安全入门:注入攻击 - ShiftLeft博客
API安全入门:注入攻击
在现代网络安全领域,您可能听说过威胁 Web 应用程序的 OWASP 十大漏洞。除了这些常见的漏洞外,OWASP 还定期发布针对 API 的十大安全威胁列表,称为 OWASP API 前十。当前的 API 安全威胁排名包括以下内容:
- 对象级别授权不健全
- 用户身份验证不健全
- 数据暴露过度
- 资源不足与速率限制
- 功能级别授权不完善
- 批量分配
- 安全配置错误
- 注入
- 资产管理不当
- 日志记录与监控不足
这些威胁对 应用程序和 API 系统的常见漏洞。
什么是注入攻击?
注入攻击是许多漏洞的根源,例如 XML 注入。在实际应用程序和 API 中,注入漏洞占据了很大比例。
简而言之,当应用程序无法正确区分不受信任的用户数据和代码时,就可能发生注入攻击。不受信任的用户数据可能来自以下来源:
- HTTP 请求参数
- HTTP 头信息
- Cookie
- 数据库或用户可修改的存储文件
如果应用程序在将这些数据插入命令或查询之前未正确处理,程序的解释器可能会将用户输入误认为是命令或查询的一部分,从而导致攻击者可以操纵应用程序的行为。
注入攻击的常见场景
示例 1:SQL 注入攻击
假设一个 API 允许用户通过以下 GET 请求获取博客文章:
GET /api/v1.1/posts?id=12358
服务器会通过以下 SQL 查询从数据库中检索对应的博客文章:
SELECT * FROM posts WHERE post_id = 12358
然而,如果攻击者发送以下请求:
GET /api/v1.1/posts?id=12358; DROP TABLE users
SQL 服务器会将分号后的部分解释为单独的 SQL 命令,执行以下操作:
-
检索博客文章:
SELECT * FROM posts WHERE post_id = 12358; -
删除用户表:
DROP TABLE users;
这种攻击被称为 SQL 注入攻击。攻击者通过操纵用户输入,破坏了数据库的完整性。
示例 2:操作系统命令注入
假设一个网站允许用户通过 API 端点读取上传的文件:
GET /api/v1.1/files?id=1123581321
服务器会通过以下命令检索文件:
cat /var/www/html/users/tmp/1123581321
如果攻击者发送以下请求:
GET /api/v1.1/files?id=1123581321; rm -rf /var/www/html/users
服务器会执行以下命令,删除用户文件夹:
rm -rf /var/www/html/users
这种攻击利用了操作系统命令注入,直接破坏了服务器上的文件系统。
为什么注入漏洞难以防范?
注入漏洞的复杂性在于:
- 数据传播的不可控性:恶意数据可能在程序中传播到多个组件,最终触发危险操作。
- 安全性判断的多样性:某些数据在一个组件中可能是安全的,但在另一个组件中却可能导致漏洞。
- 动态解析的复杂性:不同的解析器对数据的处理方式不同,增加了防护的难度。
因此,防范注入攻击需要全面的安全策略,确保每个组件都能正确处理不受信任的数据。
如何防范注入攻击?
1. 验证用户输入
验证用户输入是防范注入攻击的第一步。可以通过以下两种方式实现:
- 黑名单(Blocklist):拒绝包含危险字符的输入。例如,禁止 SQL 查询中的单引号。
- 白名单(Allowlist):仅允许包含已知安全字符的输入。例如,只允许字母和数字。
然而,这两种方法都有局限性。黑名单可能遗漏某些危险字符,而白名单可能限制过于严格,影响用户体验。
2. 参数化查询
参数化查询是一种有效的防注入方法。它的核心思想是将命令的逻辑部分与用户输入分离。例如:
- 在编译 SQL 查询时,先定义查询逻辑,再插入用户输入。
- 数据库将用户输入视为纯数据,而非代码。
这种方法可以有效防止 SQL 注入,但在某些上下文中可能无法使用。
3. 转义特殊字符
通过转义,将用户输入中的特殊字符标记为数据而非代码。例如,在 SQL 查询中,单引号可以被转义为 '。然而,转义方法也存在以下问题:
- 不同解析器需要不同的转义规则。
- 如果遗漏某些字符,攻击者可能绕过防护。
因此,转义需要结合对解析器的深入理解,确保所有潜在风险都被覆盖。
总结
注入攻击是 数据泄露、系统崩溃甚至更严重的后果。为了有效防范注入漏洞,开发者需要:
- 验证和清理用户输入。
- 使用参数化查询分离数据与代码。
- 根据解析器的特性正确转义特殊字符。
通过多层次的安全措施,可以显著降低注入攻击的风险,提升 API 的整体安全性。
原文链接: https://blog.shiftleft.io/api-security-101-injection-a7feea1d4fd