什么是代码注入?(工作原理,如何预防)
远程代码执行 (RCE),通常称为代码注入,是一种攻击,攻击者可以在其中将恶意代码注入应用程序并执行。这段外部代码能够破坏数据安全性和完整性。它通常可以绕过身份验证控制,这些攻击通常与依赖用户输入运行的应用程序相关。
代码注入攻击利用了松散的数据管理。这些攻击通常由于缺乏足够的输入/输出数据验证而变得可行,例如:
数据格式
预期数据的数量
允许的字符
SQL 注入、脚本注入、Shell 注入和动态评估是四种主要的代码注入形式。它们都基于相同的原理:代码被注入到程序中并由程序执行。
什么是命令注入?
在命令注入中,攻击者的选择仅受注入语言的功能限制。如果攻击者能够将 PHP 代码注入应用程序并使其执行,则攻击者仅受 PHP 功能的限制。命令注入是指使用现有代码执行命令,通常在 shell 上下文中执行。
代码注入是如何工作的?
当应用程序没有足够的输入验证或没有清理它存储的数据时,它就会面临代码注入的风险。
在了解其工作原理之前,让我们先讨论一下“用户输入”是什么。简单来说,用户输入是指用户输入到应用程序中并随后由程序处理的任何数据。
根据创建者,程序只设计为接受特定类型的输入。代码注入的应用程序预期特定类型的数据。在极少数情况下,开发人员可能会在确保向程序提供正确的数据方面粗心大意。
代码注入攻击可能会影响各种应用程序。代码注入是通过 **eval()** 函数完成的。攻击者通过插入代码作为用户输入来利用程序。攻击成功后,攻击者可以访问系统信息和数据库。
黑客首先在应用程序中寻找可以接收不受信任的数据并利用它执行计算机代码的攻击面。例如直接输入,如文件上传和表单字段,以及其他数据源,如 Cookie 和查询字符串参数。
通常使用字符字符串的直接串联、PHP eval() 函数或其他语言中的等效函数来引入代码。如果漏洞成功利用,攻击者可以访问应用程序的服务器端解释器。攻击者可以使用系统调用在服务器上执行指令并访问更多信息。
如何预防代码注入攻击?
开发人员可以采取以下预防措施来防止代码注入攻击:
对输入验证使用白名单
白名单更容易设置,并允许安全团队更好地控制应用程序可以处理的数据或输入类型,从而降低攻击者执行恶意代码的可能性。
使用上下文输出编码
使用上下文输出编码将有害输入转换为更安全的表示形式,在其中可以显示用户数据,但不能将其作为代码执行。
使用静态类型系统
为了确保语言分离,请使用静态类型系统。使用静态类型系统,团队可以创建声明性控制检查,而无需额外的运行时成本。
避免在源代码中使用不安全的函数
在开发源代码时,避免使用任何易受攻击的代码评估结构至关重要。相反,开发人员应该使用安全的、特定于语言的功能来管理用户提供的输入。
在 Cookie 上使用 HttpOnly 标志
在 Cookie 上使用 HttpOnly 标志以防止客户端脚本交互。服务器创建的每个 Cookie 上的 HttpOnly 标志都表示该 Cookie 不应从客户端访问。因此,即使存在 HTML 注入问题,Cookie 也无法与第三方共享。