
WebGoat代码审计-03-目录遍历漏洞
WebGoat代码审计-03-目录遍历
目录遍历攻击主要分为两块
- 一、利用目录遍历的文件上传
- 二、利用目录遍历的信息泄露
0x01 Path Traversal PageLesson2
靶场部分
靶场界面如图所示

- 题目的要求,让我们讲图片上传至非本目录下。
- 本来要上传的目录是:/PathTraversal/user/tests 下,我们能够通过目录遍历的方式,将要上传的图片上传至其他目录
这种情况我们一般想到的是 ..
,回忆一下在 Linux 中,返回上一级目录时的命令:cd ..
,在目录遍历漏洞中也通用。
利用 Burpsuite 抓包,将 “test” 修改为 “../test”,也就是 /test 目录的上一级目录。

如图,修改成功,将头像上传至 /PathTraversal/user 目录下了。
代码审计部分
查看源代码

很显然,上传点在红框中,获取 POST 表单当中的 UploadedFile 与 fullName,接下来,我们回到之前抓的包,查看一下 uploadedFile 与 fullName 是什么。

uploadedFile 是图片的内容

fullName 是我们文件名,也就是 test,这里就是由于 fullName 没有做好过滤才导致文件上传的目录遍历。换句话说,也就是刚刚我们的操作,将文件上传到了上级文件夹当中。
代码审计继续往下读,发现一行代码
1 | return super.execute(file, fullName); |
选择查看父类 ———— ProfileUploadBase,并关注几行重点语句

先是判断传进来的 file 是否为空。接着下面语句,规定了目录 /PathTraversal/UserName
1 | var uploadDirectory = new File(this.webGoatHomeDirectory, "/PathTraversal/" + webSession.getUserName()); |
继续往下看我们的代码,mkdir,也就是在 /PathTraversal/UserName 目录下创建一个新的文件夹,主要是以 fullname 的名字来命名,就是这里也就是没有对 fullname 传进来的参数进行一个过滤才导致目录穿越。
1 | uploadDirectory.mkdirs(); |
0x02 Path Traversal PageLesson3
靶场部分
靶场界面

- 靶场提示说,../ 的目录遍历方式已经行不通了,但是还是存在目录遍历的漏洞,让我们寻找寻找。
先头铁,试一试上一题 ../ 的目录遍历攻击。

果不其然,失败了。
我们尝试使用 ..././
复写的方式替代 ../
进行目录遍历攻击

没想到直接成功了,本以为还需要其他的方式进行绕过。
代码审计部分

我们看到 WebGoat 对 ../ 的目录遍历攻击进行了防御,但是只是最简单的,将 ../ 替换成了 空白。
1 | return super.execute(file, fullName != null ? fullName.replace("../", "") : ""); |
其余没有进行任何过滤,使用复写绕过,…/./ 中的 ../ 被解析成了’’,那么就变成了 ../,成功目录遍历攻击。
0x03 Path Traversal PageLesson4
靶场部分
靶场界面如图所示

还是同之前的步骤一样,先抓包看看。并进行简单的目录遍历攻击

当使用上一题的复写攻击也失败了,思考新的攻击手段。尝试换一个目录遍历的攻击点,之前我们的攻击点一直是在目录上,也就是源代码里的 “fullName”,现在转到文件名上,也就是源代码里的 “UploadedFile”

我们将原本的 “logo.png”,修改为 “../logo.png”,成功实现了目录遍历攻击。
代码审计部分

这里比较简单,并未对 “uploadedFile” 进行过滤
0x04 Path Traversal PageLesson5
- 题意,让我们用其他方式访问 path-traversal-secret.jpg
那莫非意思是,直接访问 /path-traversal-secret.jpg 不通,只能通过目录遍历的方式访问?
我这里尝试了直接遍历 .jpg 的文件,以及通过带参请求 .jpg 文件,均得到 400 的返回。

感觉没什么思路了,直接看源码吧,根据源码来找思路,前面一段代码是产生随机数,用来调用文件夹里面的静态图片的代码,这里就不贴了。
重点关注后面一段代码

首席按是第 85 行这里,代码是通过传进去的 GET 请求参数 ?id
进行判断。86 行,创建了一个新的文件类型的变量,再返回到上文去看。这里尝试在 /random-picture/ 的接口下对 id 进行目录遍历的设置,即 ?id=../
,可是被过滤了。

第 81 行规定了,参数中不允许存在 .. 或 / ,如果存在就 400

由于后端在获取参数值之后会进行一次 url 编码,所以我们可以利用 url 编码对 ../
进行编码,从而实现绕过。
- 也就是说,我们的 payload
1
?id=%2e%2e%2f

成功的绕过,看到了一丝曙光
但是我们发现,这里并没有我们要找的那个文件 path-traversal-secret.jp,所以继续往上一级目录寻找。

这边成功获取到了对应的文,最后一步的 payload
1 | ?id=%2e%2e%2f%2e%2e%2fpath-traversal-secret |

0x05 Path Traversal PageLesson7
靶场部分
靶场界面如图所示

- 题意:上传一个 Zip 文件,而这一个 Zip 文件能够替换头像;也就是使用 Zip 覆盖当前图像。
直接上传一个 Zip 文件夹即可通过靶场
代码审计部分

这里,由 Zip 结尾的文件可以上传。
因为 Zip 文件当中可以存在 ../ 的文件内容,因此 Zip 的上传也会导致目录遍历漏洞,这种问题一般存在于 Android 开发上。

0x06 目录遍历的防御手段
- 对文件上传方面进行严格限制,不允许存在
../
的上传。 - 限制用户输入的路径在某一个范围内。
- 当用户请求访问文件/目录时,构造文件/目录(若存在)所在的的完整路径,并标准化所有字符(如
%20
转为空格);
- 本文标题:WebGoat代码审计-03-目录遍历漏洞
- 创建时间:2022-03-22 14:36:57
- 本文链接:2022/03/22/WebGoat代码审计-03-目录遍历漏洞/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!