WebGoat代码审计-03-目录遍历漏洞
Drunkbaby Lv6

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
2
3
4
5
6
uploadDirectory.mkdirs();
// 创建一个文件夹 文件夹名字为fullname,这里应该对fullname进行一个过滤
var uploadedFile = new File(uploadDirectory, fullName);
// 直接进行文件夹的创建
uploadedFile.createNewFile();
FileCopyUtils.copy(file.getBytes(), uploadedFile);

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 目录遍历的防御手段

  1. 对文件上传方面进行严格限制,不允许存在 ../ 的上传。
  2. 限制用户输入的路径在某一个范围内。
  3. 当用户请求访问文件/目录时,构造文件/目录(若存在)所在的的完整路径,并标准化所有字符(如%20转为空格);
 评论