Python中的代码注入

2025 年 3 月 7 日 | 阅读 9 分钟

代码注入简介

代码注入是安全风险的另一种变体,其表现形式是将编码后的病毒注入程序。然后,该代码会被应用程序以不受欢迎的方式运行,从而使攻击者能够执行他们不应该执行的操作,例如查看他人数据、运行系统命令或更改应用程序的功能。应用程序的开发使用了不同的语言,并且在 Python 等语言中已发现代码注入漏洞,因此对开发者来说,讨论这个问题至关重要。

Python 以其易用性和多功能性而闻名,但它的一些特性可能不符合开发者的偏好。然而,Python 是一种动态语言,因此如果处理不当,很容易受到代码注入的攻击。代码注入可能极具破坏性,因为它允许攻击者潜入系统或数据库、执行代码并未经授权地控制系统。代码注入的主要原因之一是未能验证输入,或者有时未能对输入进行 SQL 转义就直接执行。

代码注入攻击的类型

Python 存在多种类型的代码注入攻击,它们具有不同于其他类型攻击的特征和方法。下面,我们将研究我们在研究中在医院中发现的最常见的植入体。

  1. Eval 注入
  2. 命令注入
  3. SQL 注入
  4. XML 注入
  5. 文件注入

Eval 注入

Python 语言中的内置函数 eval() 用于评估以字符串形式传递的表达式。尽管此函数在某些情况下可能很有用,但如果用户输入直接插入到 eval() 中,则会存在严重的Hola 安全隐患。如果攻击者可以控制传递给 eval() 的参数,那么攻击者就可以执行他们想要的任何 Python 代码,从而导致系统完全被攻陷。

Eval 注入为何有害?

Eval 注入之所以危险,是因为攻击者获得了能够让他们在受控系统上自由使用 Python 的命令。eval() 函数接收一个包含 Python 代码的字符串,该字符串将在 Python 代码的上下文中进行分析,因此任何有效的 Python 表达式都可以应用。

攻击者可以利用此漏洞来

  • 在服务器上执行任意代码。
  • 操纵数据。
  • 访问他人的文件。
  • 此系统中执行的规律和序列实际上是开发人员操作的结果,但与他们预期的完全不同。

如果恶意用户输入类似以下内容:

这将导致执行一个删除根目录的系统命令,对系统造成灾难性损害。

Eval 注入 - 威胁与缓解措施

为防止 eval 注入,建议不要在与用户输入关联的情况下使用 eval 函数。在必要的情况下,需要采取措施严格验证输入字符串,以确保要评估的表达式仅为安全表达式。

比 eval() 更好的方法是 ast.literal_eval()。此函数仅允许评估基本的 Python 常量,包括字符串、数字、元组、列表和字典,从而限制了代码实现的可能。

在这种情况下,攻击者试图引入一个系统命令,例如 __import__('os')。表达式 system('rm -rf /') 将导致 ValueError,并能保护应用程序免受代码执行的侵害。

命令注入

与参数化查询注入类似的是命令注入,其中应用程序向用户提供接口,将输入传递给系统命令。这通常在使用 os.system()、os.popen() 或 subprocess.Popen() 等函数时发生,因为它们不进行输入清理或输入控制。如果攻击者能够设置要运行的命令,那么就可以在底层系统上执行各种操作。

在此示例中,如果用户输入了像 rm -rf / 这样的恶意字符串,它将被接受并作为输入传递,这可能会损坏系统或删除有价值的文件。

命令注入为何危险?

另一种注入类型与 SQL 注入一样危险,因为它允许使用应用程序的权限级别执行命令。这可能导致

  • 系统被攻陷。
  • 数据丢失。
  • 敏感文件(本应只有某些人才能访问)被任何人访问。
  • 远程代码执行。

命令注入的缓解策略

为缓解命令注入攻击的风险,开发人员应停止将用户输入直接用于系统命令。在这种情况下,应使用参数化命令或更好的外部进程调用方法来执行,而不是使用 system() 方法。

通过使用带有参数列表的 subprocess.run(),输入不会被解释为要传递给 shell 的单个字符串,从而最小化了命令注入的危险。

SQL 注入

SQL 注入是一种 Web 应用程序弱点,其中用户输入在数据库级别进行处理,而未进行过滤。这允许攻击者操纵 SQL 查询,他们可以未经授权访问数据库,根据自己的意愿创建或修改记录,甚至检索他们本不应获取的信息。

如果用户输入的恶意输入为 ' OR 1=1 --,则生成的查询将如下所示:

此查询将选择“users”表的所有列,其中可能包含 SSN 或其他需要保护的数据。

SQL 注入为何有害?

SQL 注入可能导致整个数据库被攻陷,允许攻击者

  • 访问、修改或删除敏感信息。
  • 调用数据库中未经数据库所有者授权的函数。
  • 绕过身份验证机制。
  • 如果数据库支持,则可能执行系统命令。

SQL 注入的缓解策略

为应对此问题,开发人员应依赖参数化查询或预编译语句。这些方法允许将用户输入视为数据,而不是 SQL 查询的组成部分。

使用参数化查询时,用户字符串将包含在查询中,而不会有 SQL 注入的危险。

XML 注入

XML 注入是一种注入形式,当用户输入的数据将被插入到 XML 文档或 XML 查询中时发生,这会允许攻击者更改 XML 的结构或内容。这可能导致敏感数据泄露给未经授权的用户、数据被修改,或者在极端情况下,攻击者通过一种称为拒绝服务攻击的技术删除数据。

例如,攻击者可能在 XML 文档中嵌入一个新的评估点,而不是引用 XML 文档中数据的 <data />。

XML 注入的缓解策略

为应对 XML 注入,应确保用户不向 XML 文档输入任何标签,并且用户输入要么经过清理,要么经过验证。同样重要的是要注意,如果使用 XML 解析库来访问和打开 XML 文档中的数据,代码在执行时由于所述风险而崩溃的可能性很大。

Defusedxml 用于 XML 解析和处理,因此正在使用的应用程序不必面临 XML 注入的威胁。

文件注入

文件注入是指应用程序允许用户设置文件路径和/或文件名的情况。这可能导致攻击者获得对他们本来不应该获得的信息的直接访问或修改,或者为此目的损坏某些详细信息。

应用程序的一个例子是,如果恶意用户输入了像 ./. . 这样的文件路径。通过这种方式,他们可以访问像 <source lang='bash'>/etc/passwd 这样的文件,并可能从服务器读取一些敏感文件。

文件注入的缓解策略

为防止文件注入,开发人员应始终检查正确的输入并从用户输入的字符串中转义,只允许正确的文件路径或文件名。一些减少或防止文件注入攻击的方法是:不建议使用绝对文件路径,避免访问所有目录中的文件或只允许访问某些目录中的文件,以及避免在文件名中使用技巧。

应用

  1. 恶意攻击
    1. 远程代码执行 (RCE):远程代码执行 (RCE) 是一种最糟糕的攻击类型,在这种攻击中,入侵者能够执行恶意操作并在服务器上执行他/她选择的命令或代码。这种漏洞发生在使用户未经过滤的输入直接运行,并授予攻击者远程代码执行能力。
    2. 权限提升:权限提升是指攻击者设法获得超出系统内允许操作级别的权限的攻击。这可以通过代码注入或其他方式实现,从而将攻击者从低权限用户转换为管理员或 root 用户。
  2. 道德应用
    1. 渗透测试:渗透测试或更常用的说法是道德黑客,是一种安全专业人员积极参与代码注入攻击以评估被测试应用程序或系统的安全性。主要目标是识别网络罪犯可能利用的任何弱点。渗透测试可以发现的一些安全风险包括代码注入缺陷,专业人员将就如何处理该问题提出建议。这种方法使组织能够改进其安全结构并防止可能的入侵。
    2. 模糊测试:模糊测试,也称为模糊化,是一种测试方法,涉及向应用程序输入随机、错误或不寻常的输入,以识别代码注入缺陷等漏洞。模糊测试是在非正常、功能性使用中不常见以及可能被攻击者利用的各种条件下测试系统的过程。尽早识别这些风险可以使其在开发阶段得到修复,以增强应用程序的安全性。

防止代码注入的最佳实践

总而言之,防止代码注入需要结合安全编码实践和防御性编程技术。

  1. 输入验证和清理:始终检查和过滤应用程序用户输入的输入,以确保它们根据预期数据类型是有效的。
  2. 使用更安全的替代方案:例如 eval()、exec()、os.system() 和纯 SQL 查询等函数。但如果你是用于推广你的网站,那么你可以尝试更安全的形式,如 ast.literal_eval()、subprocess.run() 和参数化查询。
  3. 遵循最小权限原则:这意味着你应该使用最少的必要权限来运行你的应用程序。这样可以确保即使攻击者设法利用了某个漏洞,也无法造成很大的损害。
  4. 使用安全库:使用现有的安全库和框架,它们包含防止某些漏洞的安全功能。例如,可以使用 defusedxml 包进行 XML 解析,使用 SQLAlchemy 包进行数据库访问。

结论

代码注入可能被视为最严重的威胁之一;如果得不到解决,它有能力造成巨大的危害。然而,在 Python 中,由于语言的动态特性,这个问题甚至更大,如果开发人员不给予足够的重视,代码注入攻击是可能发生的。因此,开发人员应该更多地了解各种代码注入的类型,以便他们能够学习适当的安全实现并避免应用程序中的漏洞。这包括用户输入验证、避免危险函数以及使用安全选项以减少代码注入的风险。