[漏洞篇]目录遍历漏洞详解
[漏洞篇]目录遍历漏洞详解
介绍
目录遍历漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露。比如数据库备份文件、配置文件等,攻击者利用该信息可以为进一步入侵网站做准备。
例如:
- 某web网站页面展示的图片存放在/usr/local/web/1.jpg,前端URL参数为?filename=1.jpg
那么我就可以通过…/访问上一级目录,比如我输入:
- ?filename=…/…/…/etc/passwd,直接拿到linux服务器的用户密码
有接触过 dirb、御剑、Burpsuite 中等目录爆破工具的同学应该都清楚,如果能扫出一些存在/存活的目录,其实就是目录遍历漏洞的一种。
- 总而言之,目录遍历这个漏洞是需要经常去摸一摸,探一探的。
- 存在资源的地方就极有可能存在目录遍历。
实战演示
1. 文件上传中目录遍历攻击
在线靶场地址:
- 注册地址:https://webgoat-server.bachang.org/WebGoat/registration
- 闯关地址:
大家也可以通过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 下,我们能够通过目录遍历的方式,将要上传的图片上传至其他目录。
- 我们先尝试传入一个图片地址,观察上传后的图像目标地址
- 几次尝试后,发现目标图像地址就是Full Name
- 我们已经知道目标服务器是linux系统,于是我们就可以通过…/将图片上传到非本用户目录
至此,已成功过关
2. 对网站上存在的资源点进行目录遍历攻击
网站上存在的资源点:比如图片这种资源,在请求图片的同时尝试目录遍历。
例如:
- 图片资源所在的目录:127.0.0.1/home/image
- 而在 127.0.0.1/home 下存在一个名为password.txt的文件,image 通过 GET 请求获取参数,那么获取图片的 url 就是:127.0.0.1/home/image?filename=1.jpg
- 当然,/home 根目录当然不会流出来。此时如果我们将 filename 的请求变成…/1.jpg,请求就变成了:127.0.0.1/home/image?filename=…/1.jpg
- 直接就访问到了 /home 这一目录下,所以此时,若我们把请求再构造一下,就不是那么简单的事情了,filename=…/password.txt,请求就变成了:127.0.0.1/home/image?filename=…/password.txt
接下来,我们就来实战一把,靶场地址:https://portswigger.net/web-security/file-path-traversal/lab-simple
-
点击进入靶场,根据题目要求,我们需要遍历出:/etc/passwd下的文件内容
-
进入靶场,发现web网站有访问图片资源(静态资源),此时我们就应该想到,可以通过目录遍历方式进行爆破攻击
-
按下f12按钮,打开开发者工具,重新刷新页面,观察静态资源访问链接
-
拿到链接后,我们就可以开始目录遍历爆破
方式一:手动爆破(不推荐,效率太低)
对于没有工具的同学而言,如果想要体验爆破过程,也可以通过复制页面请求,然后手动尝试
-
复制页面请求为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