Web安全 - 路径穿越(Path Traversal)

文章目录

  • OWASP 2023 TOP 10
  • 导图
  • 定义
  • 路径穿越的原理
  • 常见攻击目标
  • 防御措施
  • 输入验证和清理
    • 避免直接拼接用户输入
    • 最小化权限
    • 日志监控
  • Example
  • Code
    • 漏洞代码:路径穿越攻击案例
    • 漏洞说明
    • 修复后的安全代码
    • 代码分析
  • 其他
    • 不同文件系统下的路径穿越特性
      • Windows系统
      • 类Unix系统(Linux/Unix)
    • 路径穿越的进阶利用场景
      • 文件写入攻击
      • 目录遍历结合文件上传
      • 日志注入
    • 路径穿越与其他漏洞的组合利用
      • 结合命令注入
      • 结合本地文件包含(LFI)
    • 路径穿越的检测与修复实践工具
      • 检测工具
      • 修复工具和实践

在这里插入图片描述

OWASP 2023 TOP 10

在这里插入图片描述

OWASP Top 10 概述

OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。

2023年OWASP Top 10 列表

在这里插入图片描述

主流防范措施

  1. Broken Access Control

    • 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
    • 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
  2. Cryptographic Failures

    • 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
    • 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
  3. Injection

    • 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
    • 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
  4. Insecure Design

    • 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
    • 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
  5. Security Misconfiguration

    • 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
    • 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
  6. Vulnerable and Outdated Components

    • 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
    • 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
  7. Identification and Authentication Failures

    • 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
    • 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
  8. Software and Data Integrity Failures

    • 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
    • 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
  9. Security Logging and Monitoring Failures

    • 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
    • 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
  10. Server-Side Request Forgery (SSRF)

    • 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
    • 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。

重点风险与防御措施建议

  1. Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。

  2. Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。

  3. Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。

  4. Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。

  5. SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。


导图

在这里插入图片描述


定义

路径穿越(Path Traversal)是一种Web应用漏洞,攻击者通过操控输入文件路径参数,以访问系统上未经授权的文件。通过路径穿越,攻击者可以使用诸如../的相对路径绕过访问限制,读取系统敏感信息或修改配置文件。


路径穿越的原理

在路径穿越攻击中,攻击者通常通过修改应用程序中的文件路径参数,加入目录遍历符号(如../),访问原本受保护的文件。比如,应用预期访问/home/user/documents/report.txt,但攻击者通过构造路径如../../../etc/passwd,尝试读取系统中的/etc/passwd文件。


常见攻击目标

路径穿越通常针对以下目标:

  • 访问配置文件(如/etc/passwd.htaccess
  • 查看应用程序源码
  • 获取用户数据或凭证文件
  • 修改或删除系统重要文件

防御措施

输入验证和清理

  • 严格验证和过滤用户输入的文件路径,阻止包含../或其他路径操作符的非法字符。
  • 使用白名单机制,限制文件访问路径为预定义的安全目录。
  • 使用安全的文件操作API,确保不会意外解析相对路径。

避免直接拼接用户输入

  • 避免通过字符串拼接方式直接将用户输入的路径用于文件系统访问操作。
  • 应使用函数如Path.normalize()realpath()等,将用户输入的路径转换为绝对路径并进行校验。

最小化权限

  • 确保Web应用程序的执行环境有最小的权限,只能访问和修改必要的文件。
  • 使用沙箱机制或强制Web应用程序只能在特定的、安全的目录下操作。

日志监控

  • 配置适当的日志和监控系统,及时发现路径穿越攻击的尝试。
  • 例如,检测访问日志中出现大量的../字符序列可能是攻击的预兆。

Example

假设一个文件下载应用存在如下漏洞:

String filePath = "/var/www/uploads/" + request.getParameter("fileName");
File file = new File(filePath);

攻击者可以通过构造恶意输入fileName=../../../../etc/passwd下载系统文件。为了防止此类攻击,可使用如下防御代码:

String fileName = request.getParameter("fileName");
fileName = fileName.replaceAll("[^a-zA-Z0-9._-]", ""); // 只允许安全字符
File file = new File("/var/www/uploads/", fileName);// 检查文件是否在指定的目录内
if (!file.getCanonicalPath().startsWith("/var/www/uploads/")) {throw new SecurityException("非法路径访问");
}

Code

漏洞代码:路径穿越攻击案例

下面的代码允许用户通过URL参数提供文件名,服务器根据该参数返回文件内容:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class FileDownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String fileName = request.getParameter("fileName"); // 从URL参数获取文件名File file = new File("/var/www/uploads/" + fileName); // 拼接用户输入路径if (file.exists()) {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());Files.copy(file.toPath(), response.getOutputStream()); // 返回文件内容} else {response.getWriter().println("File not found");}}
}

漏洞说明

攻击者可以通过构造恶意输入,例如fileName=../../../../../etc/passwd,试图访问服务器上的敏感文件。这是一个典型的路径穿越漏洞。

修复后的安全代码

在修复代码中,我们通过以下步骤防止路径穿越攻击:

  • 对用户输入的文件名进行严格过滤。
  • 使用文件路径校验,确保文件在合法的目录内。
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class SafeFileDownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String fileName = request.getParameter("fileName");// 1. 对输入进行严格验证,只允许合法的文件名字符if (fileName == null || !fileName.matches("[a-zA-Z0-9._-]+")) {response.getWriter().println("Invalid file name");return;}// 2. 定义安全的基础目录String baseDirectory = "/var/www/uploads/";// 3. 使用File类获取文件的绝对路径File file = new File(baseDirectory, fileName);String canonicalPath = file.getCanonicalPath();// 4. 确保文件在指定的合法目录内,避免路径穿越if (!canonicalPath.startsWith(baseDirectory)) {response.getWriter().println("Unauthorized access attempt detected");return;}// 5. 检查文件是否存在if (file.exists() && !file.isDirectory()) {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());Files.copy(file.toPath(), response.getOutputStream());} else {response.getWriter().println("File not found");}}
}

代码分析

  1. 输入验证:使用正则表达式[a-zA-Z0-9._-]+只允许字母、数字、点、下划线和破折号,过滤掉可能的非法字符(如../)。
  2. 路径规范化getCanonicalPath()方法会将相对路径转换为绝对路径,并去除目录遍历符号,从而避免路径穿越攻击。
  3. 目录限制:通过确保canonicalPath.startsWith(baseDirectory),保证文件只能在指定的安全目录下访问,防止访问外部文件。

其他

不同文件系统下的路径穿越特性

路径穿越攻击的表现可能因操作系统和文件系统的不同而有所差异。理解这些差异有助于更好地防御路径穿越漏洞。

Windows系统

  • 在Windows系统上,目录路径通常使用反斜杠(\),而非类Unix系统的正斜杠(/)。
  • 由于历史原因,Windows的文件系统对大小写不敏感,所以文件名如file.txtFile.txt指向同一文件。这可能会导致攻击者通过混淆大小写绕过某些路径验证机制。
  • Windows也支持一些特殊的设备文件,如CONAUX等,这些设备文件名不能作为文件存储。这可能被滥用为特殊攻击路径。

类Unix系统(Linux/Unix)

  • 类Unix系统严格区分大小写。攻击者可以利用路径名大小写的差异尝试绕过路径验证逻辑。
  • /符号是路径的根,因此../../攻击在类Unix系统上非常有效。
  • /etc/passwd这样的配置文件在类Unix系统上非常有价值,通常是攻击者的目标。

路径穿越的进阶利用场景

除了简单的读取文件外,路径穿越攻击可以通过复杂的方式进一步利用:

文件写入攻击

  • 如果应用程序允许写入文件且路径参数可控,攻击者可以通过路径穿越漏洞覆盖关键文件。例如,攻击者可以覆盖配置文件、脚本或日志文件,执行远程代码执行(RCE)攻击。
  • 示例:攻击者可能通过构造路径覆盖/var/www/html/config.php,从而修改配置参数。

目录遍历结合文件上传

  • 当路径穿越与文件上传漏洞结合时,攻击者可以通过目录遍历将恶意文件上传到Web服务器的可执行目录(如/var/www/html),然后通过URL直接访问该文件以执行代码。

日志注入

  • 如果路径穿越漏洞允许访问日志文件,攻击者可以注入恶意日志内容,使之被后续的日志解析过程错误处理,导致代码执行或服务中断。

路径穿越与其他漏洞的组合利用

路径穿越漏洞常与其他Web漏洞结合使用,以实现更强大的攻击效果:

结合命令注入

  • 如果路径穿越漏洞允许访问系统的敏感文件,攻击者可以利用这些文件的内容进一步进行命令注入或其他攻击。
  • 例如,读取服务器配置文件(如/etc/ssh/sshd_config)后,攻击者可能会利用暴露的SSH端口或用户信息尝试其他方式的入侵。

结合本地文件包含(LFI)

  • LFI漏洞允许攻击者通过URL包含服务器上的文件。如果LFI漏洞与路径穿越结合,攻击者可以控制所包含的文件路径,甚至可能导致远程代码执行。
  • 示例:结合PHP的文件包含漏洞,攻击者可能尝试访问../../../../var/www/html/uploads/shell.php,从而执行恶意代码。

路径穿越的检测与修复实践工具

以下是一些路径穿越漏洞的检测工具和修复实践建议:

检测工具

  • Burp Suite:Burp Suite是一个强大的渗透测试工具,包含对路径穿越漏洞的自动扫描和检测功能。
  • OWASP ZAP:这是另一款流行的开源Web应用安全扫描工具,可以帮助检测路径穿越等常见漏洞。
  • Nikto:Nikto是一个开源的Web服务器扫描工具,它可以检查服务器配置和漏洞,包括路径穿越攻击的可能性。

修复工具和实践

  • 静态代码分析工具:工具如SonarQube和Checkmarx可以扫描代码中不安全的路径操作,帮助开发者及早发现潜在的路径穿越漏洞。
  • 代码审计和渗透测试:定期进行代码审计和渗透测试,模拟攻击路径穿越漏洞,确保防护机制有效。
  • CI/CD集成测试:在持续集成和部署流程中引入安全测试步骤,防止路径穿越漏洞被引入生产环境。

在这里插入图片描述

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

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

相关文章

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

介绍几个电池充电管理芯片(TP4056、SGM40561)

TP4056 上一篇我们介绍了个TP4055&#xff0c;那么跟TP4055相比&#xff0c;TP4056肯定是做了升级的。 首先是有最高1000mA的充电电流&#xff0c;而TP4055是500mA。 一般来说我们尽可能的让充电电流接近电池容量的一半&#xff0c;这样对电池比较好。 充电电压都是4.2V。 …

vite学习教程06、vite.config.js配置

前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1a;Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。 博主所有博客文件…

五款专业三维数据处理工具:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣深度解析

随着三维数据处理技术的广泛应用&#xff0c;尤其是在城市规划、地理信息系统&#xff08;GIS&#xff09;、工程监测等领域&#xff0c;处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OS…

Vue3入门学习

Vue3入门学习 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

YOLO11改进|注意力机制篇|引入NAM注意力机制

目录 一、【NAM】注意力机制1.1【NAM】注意力介绍1.2【NAM】核心代码 二、添加【NAM】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【NAM】注意力机制 1.1【NAM】注意力介绍 下图是【NAM】的结构图&#xff0c;让我们简单分…

C++ day04(友元 friend、运算符重载、String字符串)

目录 【1】友元 friend 1》概念 2》友元函数 3》友元类 4》友元成员函数 【2】运算符重载 1》概念 2》友元函数运算符重载 ​编辑 3》成员函数运算符重载 4》赋值运算符与类型转换运算符重载 5》注意事项 【3】String 字符串类 【1】友元 friend 1》概念 定义&#x…

YOLOv5改进——添加SimAM注意力机制

目录 一、SimAM注意力机制核心代码 二、修改common.py 三、修改yolo.py ​三、建立yaml文件 四、验证 一、SimAM注意力机制核心代码 在models文件夹下新建modules文件夹&#xff0c;在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。 import…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.7 Inception 网络&#xff08;Inception network&#xff09;2.8 使 用 开 源 …

75. 颜色分类

思路 先排最小的数&#xff0c;将最小的数都放至列表前面 则0~r-1都是最小值 从r到len(nums)-1继续进行排序&#xff0c;从尾部开始&#xff0c;将最大值放置尾部 class Solution(object):def sortColors(self, nums):""":type nums: List[int]:rtype: None …

Python | Leetcode Python题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution:def validIPAddress(self, queryIP: str) -> str:if queryIP.find(".") ! -1:# IPv4last -1for i in range(4):cur (len(queryIP) if i 3 else queryIP.find(".", last 1))if cur -1:return &q…

Window系统编程 - 文件操作

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天主要介绍使用windows系统编程操作读写文件 文件 CreateFile()函数讲解 介绍:该函数用于打开文件或者I/O流设备&#xff0c;文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和…

Jenkins Pipline流水线

提到 CI 工具&#xff0c;首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…

看门狗电路设计

看门狗电路设计 看门狗是什么应用架构图TPV6823芯片功能硬件时序图为什么要一般是要保持200个毫秒左右的这种低电平的时间看门狗电路实际应用与条件 看门狗是什么 硬件看门狗芯片&#xff0c;Watch DogTimer&#xff0c;可用于受到电气噪音、电源故障、静电放电等影响(造成软件…

LSTM(长短时记忆网络)

一、引言 在处理序列数据时&#xff0c;循环神经网络&#xff08;RNN&#xff09;虽然能够处理序列数据并保留历史信息&#xff0c;但在实践中发现它对于捕捉长时间依赖关系的能力有限&#xff0c;尤其是在训练过程中容易遇到梯度消失或梯度爆炸的问题。为了解决这些问题&…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4&#xff08;location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖&#xff09;-CSDN博客 目录 14.nginx集群&#xff08;前传&#xff09; 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结

Qt游戏设计&#xff1a;贪吃蛇 游戏简介 贪吃蛇是一款经典的休闲益智类游戏&#xff0c;玩家通过控制蛇的移动来吃掉地图上的食物&#xff0c;使蛇的身体变长。随着游戏的进行&#xff0c;蛇的移动速度会逐渐加快&#xff0c;难度也随之增加。当蛇撞到墙壁或自己的身体时&…

Laravel Filament 如何配置多语言支持

演示 一、安装拓展包outerweb/filament-translatable-fields composer require outerweb/filament-translatable-fields配置模型 该套件包含一个名为 HasTranslations 的特性&#xff0c;用于使 Eloquent 模型具备多语言功能。翻译值以 JSON 格式存储&#xff0c;并不需要额外…

Run the FPGA VI 选项的作用

Run the FPGA VI 选项的作用是决定当主机 VI 运行时&#xff0c;FPGA VI 是否会自动运行。 具体作用&#xff1a; 勾选 “Run the FPGA VI”&#xff1a; 当主机 VI 执行时&#xff0c;如果 FPGA VI 没有正在运行&#xff0c;系统将自动启动并运行该 FPGA VI。 这可以确保 FPG…