第31天:文件包含漏洞

文章详细介绍了文件包含漏洞的概念,以PHP为例,包括本地文件包含(LFI)和远程文件包含(RFI)的攻击方式,如利用%00截断、文件长度截断等手段。此外,还提到了PHP伪协议的利用,如file://、php://input等。最后,文章提出了防止文件包含漏洞的一系列措施,如过滤危险字符、设置open_basedir等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
参考文章:https://blog.youkuaiyun.com/m0_46467017/article/details/126380415

一、什么是文件包含漏洞

文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。

以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

以PHP为例,常用的文件包含函数有以下四种
include(),require(),include_once(),require_once()

区别如下:

require():找不到被包含的文件会产生致命错误,并停止脚本运行
include():找不到被包含的文件只会产生警告,脚本继续执行
require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

#文件包含各个脚本代码
ASP,PHP,JSP,ASPX等

<!-—#include file="1.asp " -->

<!--#include file="top.aspx"-->

<c:import url="http://lthief.one/1.jsp">

<jsp:include page="head .jsp" / >

<%@ include file="head.jsp" %>

<?php Include ( 'test.php ' ) ?>

二、本地文件包含漏洞(LFI)

能够打开并包含本地文件的漏洞,称为本地文件包含漏洞(LFI)

1、无限制包含漏洞文件

在本地服务器中创建一个网页test.php和phpinfo.txt,代码如下

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

利用文件包含功能读取一些文件,例如phpinfo.txt

include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来

在这里插入图片描述
我们可以读取一些系统本地的敏感信息
在这里插入图片描述

1.使用绝对路径读取:
2.使用相对路径进行读取

通过./表示当前位置路径,…/表示上一级路径位置,在linux中同样适用。

一些常见的敏感目录信息路径:
Windows系统:

  • C:\boot.ini //查看系统版本
  • C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
  • C:\windows\repair\sam //存储Windows系统初次安装的密码
  • C:\ProgramFiles\mysql\my.ini //Mysql配置
  • C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
  • C:\windows\php.ini //php配置信息

Linux/Unix系统:

  • /etc/password //账户信息
  • /etc/shadow //账户密码信息
  • /usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
  • /usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
  • /usr/local/app/php5/lib/php.ini //PHP相关配置
  • /etc/httpd/conf/httpd.conf //Apache配置文件
  • /etc/my.conf //mysql配置文件

2、有限制包含漏洞文件

将test.php代码改成如下

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

我们再次访问phpinfo.txt文件,发现访问失败

因为我们想要访问的文件为phpinfo.txt,而现在我们访问的文件为phpinfo.txt.html,而这个文件不存在,所有访问失败

在这里插入图片描述

解决方法
  1. %00截断

条件:magic_quotes_gpc = Off
php版本<5.3.4
还有一种截断方法 ?号截断

在这里插入图片描述

2.文件长度截断

windows:256
linux:4096
php版本 < 5.3

在这里插入图片描述

三、远程文件包含(RFI)

如果PHP的配置选项allow_url_include、allow_url_fopen状态=On,则include/require函数可以加载远程文件,这种漏洞被称为远程文件包含(RFI)

在192.168.101.7的服务器中创建phpinfo.php文件,远程包含此服务器上的phpinfo.php文件
在这里插入图片描述
如果test.php是恶意的webshell文件,那么利用该漏洞就可以获取到服务器权限

四、php伪协议

1   file:// — 访问本地文件系统    file:// [文件的绝对路径和文件名]
2   http:// — 访问 HTTP(s) 网址
3   ftp:// — 访问 FTP(s) URLs
4   php:// — 访问各个输入/输出流(I/O streams)
5   zlib:// — 压缩流
6   data:// — 数据(RFC 2397)
7   glob:// — 查找匹配的文件路径模式
8   phar:// — PHP 归档
9   ssh2:// — Secure Shell 2
10  rar:// — RAR
11  ogg:// — 音频流
12  expect:// — 处理交互式的流

参考地址:php伪协议

1. file://协议

file:// 用于访问本地文件系统,通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响

用法:file:// [文件的绝对路径和文件名]
在这里插入图片描述

2. php://协议

php:// 访问各个输入/输出流(I/O streams),经常使用的是php://filter和php://input
php://filter用于读取源码。
php://input用于执行php代码。

在这里插入图片描述

php://filter

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。同样不受allow_url_fopen与allow_url_include的影响

例如有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开当前目录下的phpinfo.php
在这里插入图片描述

可以通过php://filter来读取源码
payload:php://filter/convert.base64-encode/resource=文件路径
得到文件加密后的源码:
在这里插入图片描述
解密,得到文件源码
在这里插入图片描述

php://input

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

利用条件:
allow_url_fopen :off/on
allow_url_include:on

利用该方法,我们可以直接写入php文件,将php://input作为参数值传入参数,然后使用burp抓包,写入php代码:
<?php fwrite(fopen("shell.php","w"),'<?php @eval($_POST[cmd]);?>');?>
在这里插入图片描述
发送报文,可以看到本地生成了含有一句话木马的shell.php文件
在这里插入图片描述

3. ZIP://协议

zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。

zip://中只能传入绝对路径。
要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23(即下述payload中#要用%23替换)
只需要是zip的压缩包即可,后缀名可以任意更改。相同的类型还有zlib://和bzip2://

利用条件:
allow_url_fopen :off/on
allow_url_include:off/on

payload:zip://[压缩包绝对路径]#[压缩包内文件]
例:?filename=zip://D:\1.zip%23phpinfo.txt
在这里插入图片描述

4. data://协议

data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

利用条件:
allow_url_fopen :on
allow_url_include:on

payload

data://text/plain,<?php phpinfo();?>
//如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

在这里插入图片描述

五 、文件包含漏洞防护

1、使用str_replace等方法过滤掉危险字符

2、配置open_basedir,防止目录遍历(open_basedir 将php所能打开的文件限制在指定的目录树中)

3、php版本升级,防止%00截断

4、对上传的文件进行重命名,防止被读取

5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件。

6、做好管理员权限划分,做好文件的权限管理,allow_url_include和allow_url_fopen最小权限化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值