【Portswigger 学院】路径遍历

news2024/10/6 8:26:50

路径遍历(Path traversal)又称目录遍历(Directory traversal),允许攻击者通过应用程序读取或写入服务器上的任意文件,例如读取应用程序源代码和数据、凭证和操作系统文件,或写入应用程序所访问或控制的文件,改变应用程序的行为,甚至接管服务器。

原理

假设一个购物应用程序用下面的标签展示一个图片文件的内容:

<img src="/loadImage?filename=218.png">

通过 filename 参数指定读取 218.png 文件的内容,218.png 是一个文件的名称,既然是文件,那么就必然有一个目录,该文件所在的目录也许在代码中被定义为 /var/www/images/,那么实际读取就是 /var/www/images/218.png 文件的内容。

然而,fiilename 参数是用户可控的,如果这个参数没有做任何路径遍历的防御,那么攻击者可以将其篡改为 ../../../etc/passwd,此时读取的文件是 /var/www/images/../../../etc/passwd,即 /etc/passwd,这是包括一个 Linux 系统所有用户的文件。如此,攻击者便知道了该 Linux 服务器存在哪些用户。

不仅限于 Linux, Windows 可用 ../ 或 ..\ 来实现路径遍历,例如:

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini

实验

实验说明:

 其中说到产品图片展示存在一个路径遍历漏洞,利用它读取 /etc/passwd 就能完成实验。

进入实验场景:

随便点进一个产品,F12 查看网页源代码,发现图片展示的内容是通过操纵一个 filename 参数来实现:

把这个值复制出来访问,并修改 filename 参数值为 ../../../../etc/passwd 就能读取到 /etc/passwd 文件的内容:

常见的路径遍历防御和绕过

根目录开头

应用程序过滤 ../ 或 ..\,并且如果 filename 是相对路径,那么就在前面追加一个目录路径,如果是绝对路径,那么就不追加。此时,可尝试篡改 filename 为 /etc/passwd,也就是直接以根目录 / 开头,或许应用程序就不再在 filename 前面追加已定义好的工作目录,而是直接读取 /etc/passwd。

嵌套路径遍历序列

应用程序可能只过滤一次 ../ 或 ..\ 序列,那么可尝试类似于 ....// 或  ....\/ 的嵌套序列。

在测试的过程中,可以输入一次 ../ 加文件名看看是否读取到不加 ../ 同样的内容,比如 /image?filename=../30.jpg:

读取到的文件内容与 /image?filename=30.jpg 一模一样,那说明应用程序存在对 ../ 的过滤。此时,尝试嵌套 ../ 序列,比如 /image?filename=....//....//....//etc/passwd:

经过 URL 编码的路径遍历序列

有时候,应用程序会过滤 ../ 或 ..\,那么可以尝试先用 URL 编码处理一次或两次,比如 ../ 一次 URL 编码后是 %2e%2e%2f,两次编码是 %252e%252e%252f。

burpsuite 提供了两个路径遍历的 FUZZ 字典:Fuzzing - path traversal  Fuzzing - path traversal(single )

每个路径都有一个 {file} 占位符,可以利用下面的 Payload processing 功能把它替换为空或者想访问的文件,比如 etc/passwd。另外,因为这两个字典的路径已经包含经过 URL 编码的,所以还要取消 burpsuite 对 payload 的 URL 编码默认处理:

下图是字典攻击的效果:

字典中每个路径的 {file} 都被替换成 etc/passwd,有双重编码 / 的,也有不经过编码处理的。利用这两个字典 FUZZ 路径遍历漏洞可以囊括大部分的 payload 了。

基础目录路径匹配

有些应用程序要求用户提供的参数的格式是“目录路径+文件名”,而目录路径必须是符合要求,比如必须是 /var/www/images,这种防御仍然可以用 ../ 或 ..\ 序列绕过。如图:

filename 的值是目录路径 /var/www/images/ 加文件名 20.jpg,如果想直接读取 /etc/passwd,应用程序不允许:

要求 filename 必须以 /var/www/images 开头。

利用 ../ 绕过:

空字节截断

有些应用程序要求 filename 必须以某种后缀名结尾,比如 .png,那么可尝试空字节截断,例如 filename=../../../etc/passwd%00.png。

防御

最安全的防御就是不使用用户提供的 filename 作为文件系统函数的参数,如果无法避免,下面是推荐的处理步骤:

  1. 验证用户输入的 filename 是否在白名单中。如果无法设置一个明确允许访问的文件路径白名单,就设置一个允许出现在 filename 参数值的字符白名单,至少不包括 . / \
  2. 验证完用户输入的 filename,在 filename 前面添加基础目录的路径,然后用函数规范化路径,最后验证规范化后的路径的基础目录是否满足预先的要求。

关于第二点,所谓规范化路径,就是去除 ../ 或 ..\ 序列,比如一个 filename 追加基础目录的路径后其值是 /var/www/images/../../../etc/passwd,规范化处理后得到的路径是 /etc/passwd。

得到规范化路径后,就验证它是否符合预先要求的基础目录,比如 /etc/passwd 就不符合预先要求的 /var/www/images,应当视这次请求为恶意请求,拒绝继续处理。

以下是防御路径遍历漏洞的示例代码:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}

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

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

相关文章

10 Posix API与网络协议栈

POSIX概念 POSIX是由IEEE指定的一系列标准,用于澄清和统一Unix-y操作系统提供的应用程序编程接口(以及辅助问题,如命令行shell实用程序),当您编写程序以依赖POSIX标准时,您可以非常肯定能够轻松地将它们移植到大量的Unix衍生产品系列中(包括Linux,但不限于此!)。 如…

奇瑞被曝强制加班,“896”成常态且没有加班费

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7 月 2 日消息&#xff0c;一位认证为“奇瑞员工”的网友近期发帖引发热议&#xff0c;奇瑞汽车内部存在强制加班行为&#xff0c;每周加班时长需大于 20 小时并且没有加班费&#xff0c;仅补贴 10 元…

人口萎缩,韩国釜山“进入消失阶段”

KlipC报道&#xff1a;调查显示&#xff0c;随着低生育率和人口老化&#xff0c;釜山人口逐渐萎缩&#xff0c;韩国第二大城市釜山显现出“进入消失阶段”的迹象。 据悉&#xff0c;“消失风险指数”是将20岁至39岁女性人口总数除以65岁及以上人口得到的数值。当该指数大于1.5…

第T3周:天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、前期工作 本文将采用CNN实现多云、下雨、晴、日出四种天气状态的识别。较上篇文章&#xff0c;本文为了增加模型的泛化能力&#xff0c;新增了Dropout层并…

【计算机体系结构】缓存的false sharing

在介绍缓存的false sharing之前&#xff0c;本文先介绍一下多核系统中缓存一致性是如何维护的。 目前主流的多核系统中的缓存一致性协议是MESI协议及其衍生协议。 MESI协议 MESI协议的4种状态 MESI协议有4种状态。MESI是4种状态的首字母缩写&#xff0c;缓存行的4种状态分别…

snap和apt的区别简单了解

Linux中没有tree命令的时候提示安装的时候出现了两个命令&#xff0c;简单看了看两者有何区别&#xff08;一般用apt就可以了&#xff09;&#xff1a; sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的&#xff0c;但它们使用的是不…

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战

嗨&#xff0c;大家好&#xff0c;我是爱搞知识的咸虾米。 今天给大家带来的是零基础入门uniapp&#xff0c;课程采用的是最新的Vue3组合式API版本&#xff0c;22年发布的uniappVue2版本获得了官方推荐&#xff0c;有很多同学等着我这个vue3版本的那&#xff0c;如果没有学过vu…

数字信号处理教程(2)——时域离散信号与时域离散系统

上回书说到数字信号处理中基本的一个通用模型框架图。今天咱们继续&#xff0c;可以说今天要讲的东西必须是学习数字信号处理必备的观念——模拟与数字&#xff0c;连续和离散。 时域离散序列 由于数字信号基本都来自模拟信号&#xff0c;所以先来谈谈模拟信号。模拟信号就是…

umi项目中的一些趣事

前言 出于某些安全问题&#xff0c;需要把HTML中框架注入的umi版本信息去掉&#xff0c;那要怎么搞呢~ 方案 查找官方文档&#xff0c;没发现可以去掉注入信息的方法&#xff0c;但在一番折腾后&#x1f609;终究还是解决了~ 发现 版本信息是从这里注入的~ Object.define…

企业短视频-直播运营团队打造课,手把手带你从0-1 搭建运营团队-15节

如何获取精准客户? 一套抖音营销系统打造课 能定位 懂运营 建团队 持续获客 课程目录 1-01、每个老板都应该学习博商团队的打造方法1.mp4 2-02、如何从0-1快速搭建运营团队1.mp4 3-03、怎么才能招聘到运营人才&#xff1f;1.mp4 4-04、怎么才能快速筛选简历招到符合要求…

程序烧录原理

程序烧录原理 ISP(In System Programming)&#xff0c;在系统编程&#xff0c;单片机不须脱离应用系统而直接在产品上烧写/升级程序。 条件&#xff1a;系统须引出单片机的串口引脚&#xff08;TXD、RXD&#xff09;ISP相对于传统的编程方式&#xff0c;在传统的编程方式中我们…

kvm虚拟机启用console登录

kvm虚拟机console登录&#xff0c;就是执行 virsh console 的时候&#xff0c;宿主机可以控制虚拟机。 一、centos7的kvm虚拟机开启console登录&#xff08;在虚拟中操作&#xff09; 1、备份文件 [roothadoop51 ~]# cp /etc/grub2.cfg /etc/grub2.cfg_back 2、用下面命令可…

2024 AIGC 技术创新应用研讨会暨数字造型设计师高级研修班通知

尊敬的老师、领导您好! 为深入响应国家关于教育综合改革的战略部署&#xff0c;深化职业教育、高等教育改革&#xff0c;发挥企业主体重要作用&#xff0c;促进人才培养供给侧和产业需求侧结构要素全方位融合&#xff0c;充分把握人工智能创意式生成(AIGC)技术在教育领域的发展…

强连通分量

强连通分量 强连通定义 有向图 G G G 的强连通是指 G G G 中任意两个节点都可以直接或间接到达。 下方两幅图都是强连通。一个特殊一点&#xff0c;任意两点都可以直接到达&#xff1b;一个则是最常见的强连通图。 特殊强连通图&#xff0c;任意两点都可以直接到达 常见的…

7.7、指针和函数

代码 #include <iostream> using namespace std;//实现两个数字进行交换 void swap01(int a, int b) {int temp a;a b;b temp;cout << "swap01a " << a << endl;cout << "swap01b " << b << endl; }void sw…

Docker精华篇 - 常用命令大全,入门到精通!

大家好,我是CodeQi! 我们都知道 Docker 的重要性,以及 Docker 如何在软件开发生命周期中发挥重要作用 。 说实话,学习 Docker 很有趣,至少在我看来是这样。 一旦掌握了基础知识,这并不难。 困难的是记住所有这些命令。 因此,在这篇文章中,我收集了所有命令,或者更…

一图胜千言|用Python搞定统计结果展示!

分享一份原创Python可视化教程&#xff1a;530张图形8000行代码&#xff0c;轻松搞定统计结果展示&#xff0c;部分如下&#xff0c; 每类图表包含详细代码详细代码注释&#xff0c;多达8000行代码&#xff0c;例如&#xff0c; 如何加入学习&#xff1f; &#x1f447;&#…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…

QStringListModel 绑定到QListView

1.QStringListModel 绑定到listView&#xff0c;从而实现MV模型视图 2.通过QStringListModel的新增、删除、插入、上下移动&#xff0c;listView来展示出来 3.下移动一行&#xff0c;传入curRow2 的个人理解 布局 .h声明 private:QStringList m_strList;QStringListModel *m_m…

Sping源码(九)—— Bean的初始化(非懒加载)—mergeBeanDefinitionPostProcessor

序言 前几篇文章详细介绍了Spring中实例化Bean的各种方式&#xff0c;其中包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor以及构造器方式创建对象。 创建对象 这里再来简单回顾一下对象的创建&#xff0c;不知道大家有没有这样一个疑…