API安全入门:注入攻击 - ShiftLeft博客

作者:API传播员 · 2025-12-31 · 阅读时间:5分钟
本文深入解析API安全中的注入攻击,包括SQL注入和操作系统命令注入等常见类型,探讨其难以防范的原因,并提供验证用户输入、参数化查询和转义特殊字符等防范措施,帮助开发者通过多层次安全策略降低注入攻击风险,提升API整体安全性。

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 命令,执行以下操作:

  1. 检索博客文章:

    SELECT * FROM posts WHERE post_id = 12358;
  2. 删除用户表:

    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. 数据传播的不可控性:恶意数据可能在程序中传播到多个组件,最终触发危险操作。
  2. 安全性判断的多样性:某些数据在一个组件中可能是安全的,但在另一个组件中却可能导致漏洞。
  3. 动态解析的复杂性:不同的解析器对数据的处理方式不同,增加了防护的难度。

因此,防范注入攻击需要全面的安全策略,确保每个组件都能正确处理不受信任的数据。


如何防范注入攻击?

1. 验证用户输入

验证用户输入是防范注入攻击的第一步。可以通过以下两种方式实现:

  • 黑名单(Blocklist):拒绝包含危险字符的输入。例如,禁止 SQL 查询中的单引号。
  • 白名单(Allowlist):仅允许包含已知安全字符的输入。例如,只允许字母和数字。

然而,这两种方法都有局限性。黑名单可能遗漏某些危险字符,而白名单可能限制过于严格,影响用户体验。

2. 参数化查询

参数化查询是一种有效的防注入方法。它的核心思想是将命令的逻辑部分与用户输入分离。例如:

  • 在编译 SQL 查询时,先定义查询逻辑,再插入用户输入。
  • 数据库将用户输入视为纯数据,而非代码。

这种方法可以有效防止 SQL 注入,但在某些上下文中可能无法使用。

3. 转义特殊字符

通过转义,将用户输入中的特殊字符标记为数据而非代码。例如,在 SQL 查询中,单引号可以被转义为 '。然而,转义方法也存在以下问题:

  • 不同解析器需要不同的转义规则。
  • 如果遗漏某些字符,攻击者可能绕过防护。

因此,转义需要结合对解析器的深入理解,确保所有潜在风险都被覆盖。


总结

注入攻击是 数据泄露、系统崩溃甚至更严重的后果。为了有效防范注入漏洞,开发者需要:

  1. 验证和清理用户输入。
  2. 使用参数化查询分离数据与代码。
  3. 根据解析器的特性正确转义特殊字符。

通过多层次的安全措施,可以显著降低注入攻击的风险,提升 API 的整体安全性。

原文链接: https://blog.shiftleft.io/api-security-101-injection-a7feea1d4fd