Skip to content

A03:2021 – 注入式攻击

对照因素

可对照 CWEs 数量 最大发生率 平均发生率 最大覆盖范围 平均覆盖范围 平均加权弱点 平均加权影点 出现次数 所有有关 CVEs 数量
33 19.09% 3.37% 94.04% 47.90% 7.25 7.15 274,228 32,078

概述

植入式攻击下滑到了第三名。 94% 被测试的应用程式都有验测到某种类型的注入式攻击问题。值得注意的 CWEs 包括了 CWE-79:跨网站攻击、CWE-89:SQL 注入式攻击以及 CWE-73:在外部控制档案名称或路径

描述

应用程式在以下情况容易遭受攻击:

  • 应用程式未验证、过滤或清理使用者提供的资料。

  • 在直译器中未使用上下文感知转义的动态查询或无参数呼叫。

  • 在物件关系对映 (ORM) 的搜寻参数中,使用恶意的资料来提取额外的敏感纪录。

  • 在动态查询、命令或储存的程序,SQL、指令或储存的程序中,直接使用或连结了恶意资料。

一些常见的注入式攻击是 SQL、NoSQL、OS 指令、物件关系对映 (ORM)、LDAP 以及表达式语言 (EL) 或对象导航图语言 (OGNL) 注入。这个概念在所有的直译器都是相同的。假若应用程式存在注入式攻击的弱点,源码检测是最好的方式。强烈建议对所有输入的参数、标头、URL、cookies、JSON、SOAP 以及 XML 的资料进行自动化测试。组织可以将静态源码测试 (SAST) 以及动态应用程式检测 (DAST) 工具,包含到持续整合与持续部署 (CI/CD)管道中,以达成在上线部署前能识别注入攻击的缺陷。

如何预防

  • 需要将命令与查询资料分开,以防止注入式攻击。

  • 首要的选项是使用安全的应用程式界面 (API),完全避免使用直译器,以提供参数化的界面或整合到物件关系对映 (ORMs) 工具中。

  • 注意:即使已经参数化了,在储存的程序中仍然可以引入 SQL 注入攻击,如果透过 PL/SQL 或 T-SQL 连接查询与资料,并使用 EXECUTE IMMEDIATE 或 exec() 执行恶意资料。

  • 使用正面或白名单在服务器端验证输入的资料。这并不是一个完整的防御机制,因许多应用程序需要使用特殊的字符,例如:应用程式的文本区域或应用程式界面 (API)应用于行动装置上的应用程式。

  • 对于任何剩余的动态查询,在转译中使用特殊符号进行查询将对查询语法带来不同的涵义。

  • 注意:在 SQL 结构中,例如:资料表名称、栏位名称是无法被转译的,因此使用者提供资料结构的名称是危险的,这是一个在编写软体时常见的问题。

  • 在查询中使用 LIMIT 以及其它的 SQL 控制器,可以防止当遭受 SQL 注入式攻击时被大量泄露纪录。

攻击情境范例

情境 #1: 应用程式使用了不被信任的资料在脆弱的 SQL 呼叫中:

String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";

情境 #2: 类似地,应用程式对框架的盲目信任,可能导致仍然在漏洞的查询,(例如:Hibernate 查询语言 (HQL)):

Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");

在这两个情境中,攻击者在他们的浏览器修改了 "id" 参数值,送出 ‘ or ‘1’=’1,例如:

http://example.com/app/accountView?id=' or '1'='1

这两个查询的含义将产生改变,而回应所有帐户资料表中的纪录,更危险的攻击将可能修改或删除资料,以及影点资料的储存过程。

參考

对應的 CWE 列表

CWE-20 Improper Input Validation

CWE-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')

CWE-75 Failure to Sanitize Special Elements into a Different Plane (Special Element Injection)

CWE-77 Improper Neutralization of Special Elements used in a Command ('Command Injection')

CWE-78 Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')

CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

CWE-80 Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)

CWE-83 Improper Neutralization of Script in Attributes in a Web Page

CWE-87 Improper Neutralization of Alternate XSS Syntax

CWE-88 Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')

CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')

CWE-90 Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')

CWE-91 XML Injection (aka Blind XPath Injection)

CWE-93 Improper Neutralization of CRLF Sequences ('CRLF Injection')

CWE-94 Improper Control of Generation of Code ('Code Injection')

CWE-95 Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')

CWE-96 Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')

CWE-97 Improper Neutralization of Server-Side Includes (SSI) Within a Web Page

CWE-98 Improper Control of Filename for Include/Require Statement in PHP Program ('PHP Remote File Inclusion')

CWE-99 Improper Control of Resource Identifiers ('Resource Injection')

CWE-100 Deprecated: Was catch-all for input validation issues

CWE-113 Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Response Splitting')

CWE-116 Improper Encoding or Escaping of Output

CWE-138 Improper Neutralization of Special Elements

CWE-184 Incomplete List of Disallowed Inputs

CWE-470 Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')

CWE-471 Modification of Assumed-Immutable Data (MAID)

CWE-564 SQL Injection: Hibernate

CWE-610 Externally Controlled Reference to a Resource in Another Sphere

CWE-643 Improper Neutralization of Data within XPath Expressions ('XPath Injection')

CWE-644 Improper Neutralization of HTTP Headers for Scripting Syntax

CWE-652 Improper Neutralization of Data within XQuery Expressions ('XQuery Injection')

CWE-917 Improper Neutralization of Special Elements used in an Expression Language Statement ('Expression Language Injection')