初识文件包含漏洞
目录
什么是文件包含漏洞?
文件包含的环境要求
常见的文件包含函数
PHP伪协议
file://协议
php://协议
php://filter
php://input
zip://、bzip2://、zlib://协议
zip://
bzip2://
zlib://
data://协议
文件包含漏洞演示
案例1:php://input
案例2:php://input
案例3:php://filter
案例4:zip://
什么是文件包含漏洞?
文件包含(File Include)漏洞也是web安全中很重要的一个漏洞,它主要会出现在PHP与JSP应用中,如果应用在运行过程中会动态加载其他脚本文件,并且加载的文件的文件路径由外部输入变量控制,就有可能产生文件包含漏洞
文件包含漏洞又可以被细分为两类:
- 本地文件包含(Local File Include)
- 远程文件包含(Remote File Include)
本地文件包含漏洞很多时候也是路径穿越漏洞,include()函数,其加载的文件如果是外部输入变量控制的,但是文件包含漏洞特指文件被Web应用载入并执行,比如在PHP中用include()或者require()函数载入文件并执行。在允许上传文件的场景中,攻击者可以上传恶意代码,再通过本地文件包含漏洞来执行该代码
远程文件包含是指应用可以通过一个URL加载并执行远程代码,比如PHP中的include(),就支持指定一个URL作为参数,利用远程文件包含漏洞,攻击者无须上传恶意文件到目标服务器,只需要将其放在远程服务器上即可
文件包含的环境要求
-
allow_url_fopen=On 规定是否允许从远程服务器或者网站检索数据
-
allow_url_include=On 规定是否允许include/require远程文件
常见的文件包含函数
-
include()
-
require()
-
include_once()
-
require()_once()
include与require的区别在错误处理方面:
-
include(),只生成警告(E_WARNING),并且脚本会继续
-
require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
-
include_once()与require()_once(),表示如果文件已包含,则不会包含
PHP伪协议
有的小伙伴就会好奇了,上面还是文件包含漏洞,怎么突然就到PHP伪协议,那当然是可以用得到了,那么下面就先介绍一下常见的php伪协议
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
file://协议
file:// 协议在下面两个配置均是on/off的情况下均可以正常使用:
allow_url_fopen :off/on
allow_url_include:off/on
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的因为它的使用不受allow_url_fopen与allow_url_include的影响
使用格式:file:// [文件的绝对路径和文件名]
可以可以测试一下,在已经本地物理路径的前提下,可以尝试读取一下文件,比如说现在index.html文件目录中有一个web.txt文件,我们尝试使用file://伪协议来进行包含 :
web.txt:
<?php phpinfo();?>
然后尝试使用file://伪协议包含一下该文件:

可以看到,这里我们的txt文件使用了file://伪协议包含后,成功的将php文件解析了。这就说明使用file://伪协议包含的文件会被视为php文件来解析
注:在Linux中也可以使用file://伪协议来读取文件
php://协议
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,
php://filter用于读取源码,php://input用于执行php代码。
条件:
allow_url_fopen:off/on
allow_url_include: 仅php://input php://stdin php://memory php://temp需要on
php://filter
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
php://filter在双off的情况下也可以正常使用;
allow_url_fopen :off/on
allow_url_include:off/on
常见的过滤器:
| 字符串过滤器 | 作用 |
|---|---|
| string.rot13 | 等同于str_rot13(),rot13变换 |
| string.toupper | 等同于strtoupper(),转大写字母 |
| string.tolower | 等同于strtolower(),转小写字母 |
| string.strip_tags | 等同于strip_tags(),去除html、PHP语言标签 |
| 转换过滤器 | 作用 |
|---|---|
| convert.base64-encode & convert.base64-decode | 等同于base64_encode()和base64_decode(),base64编码解码 |
| convert.quoted-printable-encode & convert.quoted-printable-decode | quoted-printable 字符串与 8-bit 字符串编码解码 |
| 压缩过滤器 | 作用 |
|---|---|
| zlib.deflate & zlib.inflate | 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 |
| bzip2.compress & bzip2.decompress | 同上,在本地文件系统中创建 bz2 兼容文件的方法。 |
下面就可以尝试使用php://filter伪协议的过滤器来包含一下文件看看有什么效果:
比如使用转换过滤器读取上面的web.txt文件:

可以看到是一串字符,将其进行base64解码就会发现是文件的内容:
但是并没有对该文件进行解析,说明它是无法解析php的
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。
当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容,然后导致任意代码执行。
条件:
allow_url_fopen :off/on
allow_url_include:on
还是使用上面的web.txt文件,然后换成php://input伪协议包含一下看看
因为这里需要畸形POST提交,因此我使用Burpsuite抓下面的数据包,然后添加phpinfo();来测试,再进行发送,看看是否会解析:
http://127.0.0.1/include/include.php?file=php://input

可以看到,成功的解析了php文件
zip://、bzip2://、zlib://协议
条件:
allow_url_fopen:off/on
allow_url_include:off/on
作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。
zip://
格式:zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
这里还是使用上面的web.txt文件然后将web.txt进行zip压缩,压缩文件名为web.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

bzip2://

这里没有解析成功,不知道是什么原因,按道理是可以解析成功的(╥﹏╥)
zlib://

data://协议
data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件
即:
allow_url_fopen :on
allow_url_include:on
然后可以使用data://伪协议来包含一个txt文件:
格式1:data://text/plain,
格式2:data://text/plain;base64,
文件包含漏洞演示
案例1:php://input
代码:
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit('hacker!');
}
if($file){if ($file!="http://www.baidu.com") echo "tips:flag在当前目录的某个文件中";include($file); //用户传递过来的
}else{echo '<a href="?file=http://www.baidu.com">click go baidu</a>';
}
?>
访问发现是一个链接,点击会跳转到百度页面:


在百度页面可以看到是给file传入了一个www.baidu.com网址,因此跳转到了百度页面,
尝试更换file的网址发现网页提示我们flag在某一个文件中:

那么现在就可以使用上面的PHP伪协议来尝试获取一个页面中的文件,可以使用php://input来进行获取,因为php://input需要使用POST传参,因此我们首先抓一个数据包,然后尝试在后面加上执行的命令,例如执行一个phpinfo()文件:

为了找到flag,可以使用下面的命令查看当前目录,然后发现另一个flag.txt文件:

使用下面的命令打开该文件,就可以拿到flag了:
案例2:php://input
代码:
<?php
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){echo "success\n";echo $flag;
}
flag:
//flag.php
<?php
$flag = ‘flag{flag_is_here}’;
?>
访问页面发现这里说flag就在这样,有本事就来拿吧:

查看了代码后,发现当参数$a不为空,且读取的文件中包含’I want flag’时,即可显示$flag。
所以可以使用php://input得到原始的post数据,访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行来进行绕过。
注:遇到file_get_contents()要想到用php://input绕过。

案例3:php://filter
代码:
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit('hacker!');
}
if($file){include($file);
}else{echo '<a href="?file=flag.php">tips</a>';
}
?>
可以看到种类将php://input、zip://、phar://、data://伪协议都限制了,但是却并没有限制php:filter伪协议,可以使用它可以进行读取文件:

可以看到得到了一串base64的编码,解码后:

案例4:zip://
代码:
//index.php
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if (!$file) echo '<a href="?file=upload">upload?</a>';
if(stristr($file,"input")||stristr($file, "filter")||stristr($file,"data")/*||stristr($file,"phar")*/){echo "hick?";exit();
}else{include($file.".php");
}
?>
<!-- flag在当前目录的某个文件中 -->
//upload.php
<meta charset="utf-8">
<form action="upload.php" method="post" enctype="multipart/form-data" ><input type="file" name="fupload" /><input type="submit" value="upload!" />
</form>
you can upload jpg,png,zip....<br />
<?php
if( isset( $_FILES['fupload'] ) ) {$uploaded_name = $_FILES[ 'fupload' ][ 'name' ]; //文件名$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); //文件后缀$uploaded_size = $_FILES[ 'fupload' ][ 'size' ]; //文件大小$uploaded_tmp = $_FILES[ 'fupload' ][ 'tmp_name' ]; // 存储在服务器的文件的临时副本的名称$target_path = "uploads\\".md5(uniqid(rand())).".".$uploaded_ext;if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" || strtolower( $uploaded_ext ) == "zip" ) &&( $uploaded_size < 100000 ) ) {if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {// Noecho '<pre>upload error</pre>';}else {// Yes!echo "<pre>".dirname(__FILE__)."\\{$target_path} succesfully uploaded!</pre>";}}else {echo '<pre>you can upload jpg,png,zip....</pre>';}
}?>
访问index.php文件看到有一个upload?点击后就来到了upload.php页面:

可以看到这里我们可以传入jpg,png,zip文件,这里就可以使用我们上面的zip://伪协议了:
先上传一个zip文件:

然后使用zip://伪协议包含:

可以看到也是成功的包含并且解析了
相关文章:
初识文件包含漏洞
目录 什么是文件包含漏洞? 文件包含的环境要求 常见的文件包含函数 PHP伪协议 file://协议 php://协议 php://filter php://input zip://、bzip2://、zlib://协议 zip:// bzip2:// zlib:// data://协议 文件包含漏洞演示 案例1:php://inp…...
AR特效自研AI算法技术解决方案
在当今这个高速发展的数字化时代,增强现实(AR)技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累,为企业提供了一套创新的AR特效自研AI算法技术解决方案,旨在满足企业在AR领域的多元化需求。…...
牛客2024年除夕娱乐赛(题解)
比赛地址 : 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A 看题面然后猜!!! #include<bits/stdc.h> using namespace std; int main(){cout << "原神启动" << endl; } B 也是看题面然后猜 : #include<bits/stdc.…...
5 scala的函数式编程简介
与Java一样,Scala 也是使用 Lambda 表达式实现函数式变成的。 1 遍历 除了使用 for 可以对数组、List、Set 进行遍历外,也可以使用 foreach 函数式编程进行遍历,使代码更为简洁。 foreach 的方法签名为: foreach(f: (A) > …...
陪护系统|陪护小程序提升长者护理服务质量的关键
在如今逐渐老龄化的社会中,老年人对更好的护理服务需求不断增加。科技的进步使得陪护小程序系统源码成为提供优质服务的重要途径之一。本文将从运营角度探讨如何优化陪护小程序系统源码,提升长者护理服务的质量。 首先,我们需要对软件的设计和…...
C++算法之双指针、BFS和图论
一、双指针 1.AcWing 1238.日志统计 分析思路 前一区间和后一区间有大部分是存在重复的 我们要做的就是利用这部分 来缩短我们查询的时间 并且在使用双指针时要注意对所有的博客记录按时间从小到大先排好顺序 因为在有序的区间内才能使用双指针记录两个区间相差 相当于把一个…...
【大厂AI课学习笔记】1.5 AI技术领域(3)自然语言处理
今天来梳理自然语言处理的相关内容。 自然语言处理:定义、关键技术、技术发展、应用场景与商业化成功 一、自然语言处理的定义 自然语言处理(NLP)是人工智能(AI)领域的一个重要分支,它研究的是如何让计算…...
【数字电子技术课程设计】多功能数字电子钟的设计
目录 摘要 1 设计任务要求 2 设计方案及论证 2.1 任务分析 2.1.1 晶体振荡器电路 2.1.2 分频器电路 2.1.3 时间计数器电路 2.1.4 译码驱动电路 2.1.5 校时电路 2.1.6 整点报时/闹钟电路 2.2 方案比较 2.3 系统结构设计 2.4 具体电路设计 3 电路仿真测试及结…...
【新书推荐】7.3 for语句
本节必须掌握的知识点: 示例二十四 代码分析 汇编解析 for循环嵌套语句 示例二十五 7.3.1 示例二十四 ■for语句语法形式: for(表达式1;表达式2;表达式3) { 语句块; } ●语法解析: 第一步:执行表达式1,表达式1…...
爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测
目录 背影 极限学习机 爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:爬山算法优化遗传算法优化极限学习机的多分类预测,p-ga-elm多分类预测(代码完整,数据)资源-CSDN文库 https://d…...
挑战杯 opencv 图像识别 指纹识别 - python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器视觉的指纹识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖,适…...
【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…...
PHP、Python、Java 和 Go语言对比
PHP、Python、Java 和 Go 都是流行的编程语言,每种语言都有其独特的优势和适用场景。下面是对这些语言的一些基本对比: 一:PHP 适用场景:主要用于Web开发,特别是服务器端脚本。 特点:语法简单易懂&#…...
算法题目题单+题解——图论
简介 本文为自己做的一部分图论题目,作为题单列出,持续更新。 题单由题目链接和题解两部分组成,题解部分提供简洁题意,代码仓库:Kaiser-Yang/OJProblems。 对于同一个一级标题下的题目,题目难度尽可能做…...
车载测试中:如何处理 bug
一:Jira 提交 bug 包含那些内容 二:如何处理现上 bug 三:车载相关的 bug 如何定位 四:遇到 bug ,复现不出来怎么办 五:bug 的处理流程 一:Jira 提交 bug 包含那些内容二:如何处理现上…...
亲测解决vscode的debug用不了、点了没反应
这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…...
立足智能存取解决方案|HEGERLS智能托盘四向车储存制动能量 实现能源回收
对于商业配送和工业生产的企业而言,如何能高效率、低成本进行低分拣、运输、码垛、入库,用以提升仓库空间的利用效率,是现在大多企业急需要解决的行业痛点。对此,为了解决上述痛点,近年来,物流仓储集成商、…...
2024.2.8日总结(小程序开发5)
对上拉触底事件进行节流处理 在data中定义isloading节流阀 false表示当前没有进行任何数据请求true表示当前正在进行数据请求 在getColors()方法中修改isloading节流阀的值 在刚调用getColors时将节流阀设置true在网络请求的complete回调函数中,将节流阀重置为f…...
Spring Boot配置文件优先级
1、bat文件启动java程序 java -Dmmmqqq -Dfile.encodingUTF-8 -jar ruoyi-admin.jar --mmmiii --llllll 2、配置类型 程序参数Program arguments : --mmmiii 单个属性值,可以从String[] args读取到,放在jar包命令后面 VM参数VM options :一般以-D …...
Rust 初体验1
Rust 初体验 安装 打开官网,下载 rustup-init.exe, 选择缺省模式(1)安装。 国内源设置 在 .Cargo 目录下新建 config 文件,添加如下内容: [source.crates-io] registry "https://github.com/rus…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...


