DVWA靶场通关笔记-文件包含(High级别 2种渗透方法)

发布于:2025-07-06 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

一、文件包含

1、原因

2、危害

3、防范措施

二、代码审计(High级别)

1、渗透准备

(1)配置php.ini

(2)file1.php

(3)file2.php

(4)file3.php

2、源码分析

(1)index.php

(2)include.php

(3)High.php

(4)渗透思路

三、渗透实战

1、访问file4.php(成功)

2、file伪协议(成功)


本系列为通过《DVWA靶场通关笔记》的文件包含关卡(low,medium,high,impossible共4关)渗透集合,通过对相应关卡源码的代码审计找到讲解渗透原理并进行渗透实践,本文为文件包含High关卡的渗透部分。

一、文件包含

文件包含是一种严重的安全威胁,攻击者可以通过构造恶意文件路径,诱导服务器包含并执行恶意文件。

1、原因

文件包含安全风险的本质是程序在动态包含文件时,由于直接信任并使用了未经验证的用户输入作为文件路径参数,使得攻击者能够通过构造恶意路径(如../../../etc/passwd或远程URL)突破预期的文件访问范围,非法读取敏感文件或执行任意代码,常见于PHP的include、require、include_once 和 require_once 等文件包含函数中,其根本原因是程序缺乏对用户输入的有效过滤和访问控制机制。

2、危害

文件包含安全风险危害极大。攻击者利用它可通过包含恶意文件执行任意代码,如篡改网站内容、窃取用户信息、控制服务器等。还能读取敏感文件,像数据库配置文件、用户密码文件等,导致数据泄露。甚至可借助文件包含风险上传木马,使服务器完全被攻击者掌控,进而发起进一步攻击,如 DDoS 攻击等,严重影响网站的正常运行和安全性,给用户和网站所有者带来巨大损失。

3、防范措施

文件包含是一种严重的安全威胁,开发人员应高度重视并采取有效措施进行防范。要有效防御文件包含风险,核心原则是严格限制文件加载路径,具体措施包括:

  • 1) 禁用动态包含用户输入,改用白名单机制仅允许加载预定义文件;
  • 2) 固定包含目录,使用basename()或realpath()过滤../等路径遍历字符,并校验绝对路径是否在允许范围内;
  • 3) 关闭危险PHP配置(allow_url_include=Off);
  • 4) 强制文件扩展名(如.php)避免包含非程序文件;
  • 5) 最小权限原则,确保Web目录不可访问敏感文件。此外,应结合日志监控和WAF增强防护,通过多层级校验确保文件包含操作始终受控,从根源上阻断恶意路径注入的可能性。

二、代码审计(High级别)

1、渗透准备

配置security为高等High级别。

进入到文件包含关卡High页面,发现页面有三个链接,分别对应file1.php, file2.php, file3.php,具体如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=include.php

(1)配置php.ini

因为源码include.php会检查 PHP 配置中的 allow_url_includeallow_url_fopen,代码确保了必要的功能已经启用,否则举例如果allow_url_include配置为off,会有如下报错。

修改php.ini文件,开启allow_url_include和allow_url_fopen,切记修改后需要重启小皮的Apache服务,配置效果如下所示。

(2)file1.php

点击file1.php效果如下,显示当前登陆账号和ip地址。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php

(3)file2.php

点击file2.php效果如下,传入参数为page=file2.php。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file2.php

(4)file3.php

点击file3.php效果如下,传入参数为page=file3.php。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php

2、源码分析

打开靶场的文件包含Medium关,完整URL地址如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=include.php

(1)index.php

这段代码的主要目的是展示不同安全级别下的文件包含风险。通过设置不同的安全级别,用户可以观察到不同防护措施下的文件包含行为。代码的核心逻辑是根据用户输入动态包含文件,这在低安全级别下可能导致恶意文件的包含,从而引发安全问题。例如,攻击者可以通过控制 $file 参数(指定不同级别的文件也就是low、medium、high和impossible对应的php文件),诱导服务器包含恶意脚本文件。

这段 PHP 代码是一个用于演示文件包含安全风险的示例,主要功能是根据用户设置的安全级别,包含并执行不同的 PHP 文件,同时处理用户请求的文件包含操作。以下是代码功能的详细描述:

  • 初始化和配置
    • 定义了一个常量 DVWA_WEB_PAGE_TO_ROOT,用于指定网站根目录的相对路径。
    • 使用 require_once 引入了 dvwaPage.inc.php 文件,该文件包含了 DVWA 的页面初始化和配置功能。
    • 调用 dvwaPageStartup 函数,初始化页面,确保用户已认证,并根据配置加载 PHPIDS
  • 页面设置
    • 创建了一个 $page 数组,用于存储页面的标题、页面 ID、帮助按钮和源代码按钮等信息。
    • 设置了页面的标题为“Vulnerability: File Inclusion”,并根据 DVWA 的页面结构添加了分隔符和主标题。
  • 数据库连接
    • 调用 dvwaDatabaseConnect 函数,连接到数据库,为后续操作提供数据库支持。
  • 选择不同级别的文件
    • 根据 $_COOKIE['security'] 的值,选择不同安全级别的文件:
      • low:包含 low.php 文件。
      • medium:包含 medium.php 文件。
      • high:包含 high.php 文件。
      • 默认:包含 impossible.php 文件。
    • 这些文件分别实现了不同安全级别下的文件包含逻辑。
  • 文件包含逻辑
    • 如果 $_GET 中存在 $file 参数(代码中注释掉了 $_GET 的检查,实际使用中应检查 $_GET['file']),则包含用户指定的文件。
    • 如果没有指定文件,则重定向到 include.php 页面。
  • 页面渲染
    • 调用 dvwaHtmlEcho 函数,渲染并输出页面内容。

(2)include.php

这段 PHP 代码是一个用于演示文件包含安全风险的示例页面,属于 DVWA(Damn Vulnerable Web Application)项目的一部分。其主要功能是检查 PHP 配置中的相关功能是否启用,并提供一个简单的用户界面,允许用户通过 URL 参数动态包含文件。以下是代码功能的详细描述:

  • 检查 PHP 配置
    • 检查 allow_url_include 是否启用:该配置项允许 PHP 的 include 和 require 函数包含远程文件。如果未启用,会生成一个警告信息。
    • 检查 allow_url_fopen 是否启用:该配置项允许 PHP 打开远程文件。如果未启用,也会生成一个警告信息。
  • 生成警告信息
    • 如果上述任何一个配置项未启用,会生成相应的警告信息,并将其存储在 $WarningHtml 变量中。
  • 页面内容构建
    • 构建页面的 HTML 内容,包括:
      • 一个标题,显示“Vulnerability: File Inclusion”。
      • 显示警告信息(如果有的话)。
      • 提供三个可点击的链接,分别指向 file1.php、file2.php 和 file3.php,允许用户通过 URL 参数动态包含这些文件。
      • 提供一些关于文件包含的额外信息链接,包括维基百科的远程文件包含页面和 OWASP Top 10 2007 的相关页面。

这段代码的主要目的是展示文件包含安全风险的基本原理和潜在风险。通过检查 PHP 配置中的 allow_url_include 和 allow_url_fopen,代码确保了必要的功能已经启用,从而可以进行文件包含操作。如果这些配置项未启用,用户将看到警告信息,提示他们需要启用这些功能才能正常运行代码。

(3)High.php

进入DVWA靶场源目录,找到High.php源码。

打开源码High.php,分析可知这段代码实现了仅有简单验证的不安全的文件包含功能,参数为page,如下所示。

这段PHP代码实现了一个基于白名单验证的文件包含功能,通过$_GET['page']获取用户输入,使用fnmatch()函数严格限制只允许包含以"file"开头的文件或名为"include.php"的文件,不符合条件的请求将返回错误信息并终止程序。相比黑名单过滤方式,这种白名单验证策略显著提高了安全性。以下是代码功能的详细描述:

  •  通过GET参数获取要包含的文件名
  • 使用fnmatch()函数进行文件名模式验证:
    • 只允许文件名以"file"开头(如file1.phpfile2.txt等)
    • 或文件名严格等于"include.php"
  • 对于不符合条件的文件名请求,返回错误信息并终止程序
  • 相比前一个版本,这个验证方式更严格,采用了白名单式的验证策略 

这段代码的主要功能是对用户输入的文件路径进行简单的清理,以减少文件包含攻击的风险。然而,这种清理方式并不足以完全防止文件包含风险。攻击者仍然可以通过其他方式绕过这些简单的过滤措施。例如,攻击者可以使用其他协议(如 file://)或编码方式来绕过过滤。详细注释后的源码如下所示。

<?php
// 从GET参数获取用户请求的页面文件名
$file = $_GET[ 'page' ];
// 输入验证:使用fnmatch函数检查文件名是否符合模式
// 要求文件名必须以"file"开头,或者精确匹配"include.php"
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // 如果文件名不符合条件,输出错误信息并终止脚本
    echo "ERROR: File not found!";
    exit;
}
// 验证通过,$file变量将被用于后续文件包含操作
?>

(4)渗透思路

使用file开头的字符串进行渗透,这只能使用file协议来进行渗透。

三、渗透实战

1、访问file4.php(成功)

进入DVWA靶场的文件包含关卡low级别,基于渗透准备中测试了page为file1.php, file2.php, file3.php, 我们尝试将关卡首页,将page参数改为file4.php,如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file2.php
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php

完整的URL地址如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file4.php

如下所示,显示了隐藏内容,提示用户名为admin,安全级别为High。

2、file伪协议(成功)

通过file伪协议获取C:\Windows\System32\drivers\etc\hosts,需要使用文件绝对路径,如下所示。

file:///C:\Windows\System32\drivers\etc\hosts

完整URL地址如下所示,参数为page。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///C:\Windows\System32\drivers\etc\hosts

 如下所示,成功通过file伪协议获取到C:\Windows\System32\drivers\etc\hosts文件的内容。