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

[漏洞篇]目录遍历漏洞详解

[漏洞篇]目录遍历漏洞详解

介绍

目录遍历漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露。比如数据库备份文件、配置文件等,攻击者利用该信息可以为进一步入侵网站做准备。

例如:

  • 某web网站页面展示的图片存放在/usr/local/web/1.jpg,前端URL参数为?filename=1.jpg

那么我就可以通过…/访问上一级目录,比如我输入:

  • ?filename=…/…/…/etc/passwd,直接拿到linux服务器的用户密码

有接触过 dirb、御剑、Burpsuite 中等目录爆破工具的同学应该都清楚,如果能扫出一些存在/存活的目录,其实就是目录遍历漏洞的一种。

  • 总而言之,目录遍历这个漏洞是需要经常去摸一摸,探一探的。
  • 存在资源的地方就极有可能存在目录遍历。

实战演示

1. 文件上传中目录遍历攻击

在线靶场地址:

  1. 注册地址:https://webgoat-server.bachang.org/WebGoat/registration
  2. 闯关地址:
    在这里插入图片描述

大家也可以通过docker本地搭建靶场:

# 拉取镜像
docker pull webgoat/webgoat-8.0

docker pull webgoat/webwolf
docker pull webgoat/goatandwolf

# 启动容器
docker run -p 8888:8888 -p 8080:8080 -p 9090:9090 webgoat/goatandwolf

# 访问靶场
http://127.0.0.1:8080/WebGoat

题目要求:本来要上传的目录是:/PathTraversal/user/tests 下,我们能够通过目录遍历的方式,将要上传的图片上传至其他目录。

  1. 我们先尝试传入一个图片地址,观察上传后的图像目标地址
  2. 几次尝试后,发现目标图像地址就是Full Name
    在这里插入图片描述
  3. 我们已经知道目标服务器是linux系统,于是我们就可以通过…/将图片上传到非本用户目录
    在这里插入图片描述
    至此,已成功过关

2. 对网站上存在的资源点进行目录遍历攻击

网站上存在的资源点:比如图片这种资源,在请求图片的同时尝试目录遍历。

例如:

  1. 图片资源所在的目录:127.0.0.1/home/image
  2. 而在 127.0.0.1/home 下存在一个名为password.txt的文件,image 通过 GET 请求获取参数,那么获取图片的 url 就是:127.0.0.1/home/image?filename=1.jpg
  3. 当然,/home 根目录当然不会流出来。此时如果我们将 filename 的请求变成…/1.jpg,请求就变成了:127.0.0.1/home/image?filename=…/1.jpg
  4. 直接就访问到了 /home 这一目录下,所以此时,若我们把请求再构造一下,就不是那么简单的事情了,filename=…/password.txt,请求就变成了:127.0.0.1/home/image?filename=…/password.txt

接下来,我们就来实战一把,靶场地址:https://portswigger.net/web-security/file-path-traversal/lab-simple

  1. 点击进入靶场,根据题目要求,我们需要遍历出:/etc/passwd下的文件内容
    在这里插入图片描述

  2. 进入靶场,发现web网站有访问图片资源(静态资源),此时我们就应该想到,可以通过目录遍历方式进行爆破攻击
    [图片]

  3. 按下f12按钮,打开开发者工具,重新刷新页面,观察静态资源访问链接
    [图片]

  4. 拿到链接后,我们就可以开始目录遍历爆破

方式一:手动爆破(不推荐,效率太低)

对于没有工具的同学而言,如果想要体验爆破过程,也可以通过复制页面请求,然后手动尝试

  • 复制页面请求为curl(有postman或Api fox的同学也可以自己构造请求)
    [图片]

  • 复制到终端,手动修改filename后面参数
    [图片]

  • 成功爆破出结果:
    [图片]

方式二:BurpSuite工具自动化爆破

BurpSuite教程地址:https://blog.csdn.net/weixin_45565886/article/details/144973331

打开BurpSuite工具,开启代理抓包,并发送到Intruder,然后配置载荷,发动攻击:

  • 抓包发送到Intruder
    在这里插入图片描述

  • 配置载荷,将filename添加为变量:
    [图片]

  • 添加攻击载荷字典
    [图片]

  • 发动攻击
    在这里插入图片描述
    在这里插入图片描述

3. 对于 Zip 文件,在文件上传中,可以替代头像上传,并利用目录遍历

该部分属于文件上传目录遍历攻击,但由于比较特殊,因此单拎出来

  • 场景应用于文件上传界面,但同样也是一个非常特殊的点。早在之前人们并不重视这个情况的时候,Zip 文件可以作为文件上传。
  • 攻击者可以利用…/来改变 Zip 包中某个文件的存放位置。

Zip 文件在解压之后,在攻击者的精心设计之下,很有概率会覆盖服务器上原有的文件。举个例子,php 当中的 .htacess 文件就是最著名的文件上传的覆盖,若是覆盖了 .htacess 文件,那可就出大事了 ~

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等

绕过手段

1. 对简单…/的目录遍历防御[双写绕过]

我们发现按照之前的…/已经无法实现对应效果,此时考虑双写绕过:
[图片]

因为服务器后台过滤了…/,例如这段代码:

return super.execute(file, fullName != null ? fullName.replace("../", "") : "");

此时因为输入的…/会被处理,替换成空格。
在这里插入图片描述

绕过手段:

那么我们通过双写绕过,也就是输入…/./,它会被解析成 ==》…/
在这里插入图片描述

2. GET 请求参数中不允许存在…与/[编码绕过]

回顾我们实战演示的第二个例子:对网站上存在的资源点进行目录遍历攻击。
此时我们请求资源是通过 GET 请求中的参数的,若参数中不允许存在…与/,较难进行目录遍历攻击,服务器防御源码:
在这里插入图片描述
人外有人,天外有天,总归还是有绕过方法的 ~

  • 原理: 服务器后台在获取我们的参数值之后,会进行一次 url 编码,若只是单纯的对参数进行这种过滤,则可以通过 url 编码绕过。
  • payload:
# %2e%2e ------> ..
# %2f ------> /
?filename=%2e%2e%2f/etc/passwd

3. 当服务器只允许获取当前格式的资源[空字节绕过]

在实战演示的第二个案例中,我们通过…/…/…/etc/passwd成功获取敏感文件,但有时后端服务器会限制我们当前获取的资源文件,比如,只允许我们获取.jpg的内容

  • 情景:若此时资源为图像,那么服务器只允许的请求是?filename=图片格式的后缀。只有?filename=1.jpg才可以被请求。
  • 绕过手段:空字节绕过
    原本的payload:
?filename=../etc/passwd

因为服务器限制了请求的资源,所以此时必然会报错。
空字节绕过,也就是增添空格,因为空格后的内容都会被自动过滤。而空格对应的 hex 编码为 %20,所以我们构造新的 payload。

?filename=../etc/passwd%201.jpg
<!--转换一下,也就是-->
?filename=../etc/passwd 1.jpg

在空字节存在的情况下,空格后面的内容会直接被注释掉,就变成了这样。

?filename=../etc/passwd

防御手段

上面介绍了常见的后端服务限制手段,下面给大家分享一下目录遍历漏洞应该如何来防御

1. 限制用户输入的路径在某一个范围内

2. 标准化所有字符

当用户请求访问文件/目录时,直接标准化所有字符,将所有字符转换成 url 编码,这样做之后,到了服务器手上不会解析成…/,就不存在目录遍历了。

3. 验证用户的输入是否在白名单那内

也就是限制用户请求资源,对于少量的文件(例如都是图像),写正则表达式批量规范请求资源的白名单,这样可以做到完美防御目录遍历漏洞。

参考文章:
https://www.freebuf.com/articles/web/326213.html
https://blog.csdn.net/weixin_50464560/article/details/119717089


http://www.kler.cn/a/542087.html

相关文章:

  • 【Qt之·类QTextCursor】
  • C++20 新特性解析
  • Flutter PIP 插件 ---- Android
  • 代码随想录day11
  • 网易日常实习一面面经
  • 1.1 单元测试核心原则
  • 活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
  • 说一下 jvm 有哪些垃圾回收器?
  • 在mac中安装Colima使用docker(替代Docker Desktop)
  • Vue 3 嵌套请求与数据重组:挑战与应对
  • ArcGIS Pro SDK (二十七)自定义许可
  • Go语言的内存分配原理
  • 泛型 什么是泛型 泛型的继承和通配符 二叉树
  • hbase快照同步到目标集群出现ERROR Multiple regions have the same startkey问题分析
  • OpenHarmony应用开发学习路线与资源指南
  • 请解释 JavaScript 中的函数式编程,优缺点是什么?
  • 三步本地部署deepseekr1,支持macOs,ubuntu,Windows
  • 基于STM32单片机智能教室管理系统设计与实现
  • 怎么在win10系统批量生成下面目录示例文件?
  • Softhsm储存安全数据性能整理
  • SQLMesh系列教程-2:SQLMesh入门项目实战(下篇)
  • TCP基础知识
  • 【网络安全】服务器安装Docker及拉取镜像教程
  • 【AI时代】Page Assist - 本地 AI 模型的 Web UI (谷歌浏览器) 本地DeepSeek启用联网功能
  • JavaScript 入门指南:从零开始学前端开发
  • linux基于 openEuler 构建 LVS-DR 群集--一、用命令行完成 二、使用脚本完成