软件安全领域 5 大注入攻击
注入攻击指的是针对注入漏洞的任何类型的攻击——注入漏洞是一大类网络安全漏洞,其中包括几个严重的应用程序安全风险。尽管攻击向量种类繁多,但注入攻击的共同点是攻击者能够通过未经验证的用户输入将有效负载插入已执行的应用程序代码中。根据具体的漏洞和攻击目标,注入可能涉及数据库查询、JavaScript代码、本机应用程序代码、操作系统命令等。一旦成功,注入攻击可能会产生各种各样的后果,从泄露不太敏感的信息到更严重的数据泄露、拒绝服务、特权提升、身份验证绕过,甚至远程代码执行,甚至可能完全危及目标系统。
SQL 注入 (SQLi)
大多数 Web 应用程序都由某种数据库提供支持,其中许多应用程序依赖于使用 SQL 作为其数据访问和查询语言的标准关系数据库管理系统。SQL 注入攻击是通过在 Web 表单、注释字段、查询字符串、参数或外部用户可访问的其他输入通道发送的数据中包含 SQL 语句来执行的。恶意代码可以是旨在提取敏感数据的 SQL 查询,也可以是旨在通过添加或删除记录甚至整个数据库表来修改数据库内容的 SQL 语句。恶意攻击者通常以用户记录为目标,以添加特权用户或提升现有账户的权限。
跨站点脚本 (XSS)
虽然名称中没有“注入”,但跨站点脚本 (XSS) 就是利用脚本注入漏洞。如果 Web 应用程序无法清理用户提供的包含脚本代码(通常是 JavaScript)的输入,则容易受到 XSS 的攻击。为了利用 XSS 漏洞,攻击者通常会提供包含恶意代码的字符串,将其作为请求参数值包含在内。易受攻击的应用程序不会按照应用程序逻辑的预期处理该值,而是在受害者的浏览器中执行提供的脚本有效负载。
虽然 XSS 攻击有时被认为风险低且仅限于单个用户会话,但它可能会产生严重后果,尤其是在较长的攻击链中使用时。此外,随着全栈 JavaScript 应用程序现在也通过 Node.js 在服务器端运行,XSS 的影响不再局限于浏览器。仅靠用户输入过滤不足以阻止 XSS,因为有很多方法可以规避 XSS 过滤器,因此建议遵循安全编码实践并使用内容安全策略限制脚本源来防止 XSS。
OS 命令注入
Web 应用程序有时可能需要执行操作系统命令,例如在 Web 服务器上读取或写入文件。对于存在操作系统命令注入漏洞的应用程序,攻击者可以在用户输入中隐藏恶意系统命令,并让应用程序在服务器上执行这些命令。成功的命令注入(也称为 shell 注入)可能非常危险,允许攻击者获取有关系统和服务器配置的信息、提升用户权限或执行任意系统命令完全影响系统。
由于后果可能非常严重,因此最好避免在 Web 应用程序中调用包含用户可控数据的系统命令。当需要执行系统命令时,请务必仔细验证其所有输入并将其限制为特定的允许值。
代码注入(远程代码执行RCE)
代码注入允许攻击者将恶意代码直接插入到系统的执行环境中,使得该代码如同在受害主机上运行一样。这种攻击通常是由于软件存在的漏洞,使得攻击者能够操纵系统的输入处理机制,使原本预期的输入转变为包含执行指令的形式。一般情况下,攻击者找到程序中存在的输入验证不足或者权限管理缺陷,通过输入一些构造中包含预设代码片段的特殊输入数据,当这些输入被应用到系统的某些功能时,恶意代码被执行,进而访问和窃取敏感信息。代码注入可以造成的影响如密码、私密数据,另外攻击者可以安装后门、更改配置或完全接管服务器,一旦获得控制,攻击者可能进一步利用此权限去攻击其他系统。虽然具体的严重性等级取决于利用的难易程度,但 RCE 漏洞几乎总是很严重的。
XXE 注入
XML 外部实体 (XXE) 注入。XML文档用于各种web应用程序请求,如果将接受XML输入的应用程序配置为支持具有弱XML解析器安全性的遗留文档类型定义(dtd),攻击者可以使用特制的XML文档来执行XXE注入。这会破坏XML解析器,并可用于进一步的网络攻击,从目录遍历到服务器端请求伪造(SSRF),甚至远程代码执行。
防止注入漏洞和攻击
除了XXE之外,以上注入攻击都依赖于Web应用程序接受和执行未经处理的用户输入。通过对应用中所有用户控制的输入进行适当的控制,可以防止绝大多数注入漏洞。设置正确的HTTP安全表头和CSP规则也将阻止许多外部攻击的途径。以下是一些通用的防范措施:
对用户输入和输出数据进行过滤和编码:对用户输入的数据进行过滤和编码,以防止恶意脚本的注入和执行。对输出数据进行适当的编码,以防止跨站点脚本攻击。
实现严格的访问控制:对系统中的资源进行严格的访问控制,确保只有授权的用户才能访问敏感数据和执行关键操作。
验证代码的来源:在执行远程代码时,验证代码的来源和完整性,以防止恶意代码的注入和执行。
使用安全的编程实践:采用安全的编程实践,如避免使用不安全的函数和方法、定期审查代码以发现潜在的安全漏洞等。在开发周期中持续检测可利用的安全漏洞,通过检测能力优异的静态应用程序安全测试工具进行代码检测,可以帮助开发人员提高编码安全性的同时保持工作效率。