路径(目录)遍历是一个漏洞,攻击者可以访问或存储应用程序运行位置之外的文件和目录。这可能导致从其他目录读取文件,并且在文件上传的情况下覆盖关键系统文件。
例如,假设我们有一个托管一些文件的应用程序,可以按以下格式请求它们:http://example.com/file=report.pdf现在,作为一名攻击者,您当然对其他文件感兴趣,所以您可以尝试http://example.com/file=../../../../../etc/passwd.在本例中,您尝试走到文件系统的根目录,然后进入/etc/passwd以访问该文件。../被称为点对点斜杠,这是该攻击的另一个名称。
当然,这是一个非常简单的示例,在大多数情况下,框架实现的控件不适用于此,因此我们需要更具创造性,在请求发送到服务器之前开始编码。例如,如果我们对../进行URL编码,您将得到%2e%2e%2f,接收此请求的web服务器将再次将其解码为../。
还请注意,避免应用程序过滤这些编码,双重编码也可能起作用。在系统a调用系统B的情况下,可能需要双重编码。系统a将仅解码一次,并使用仍然编码的URL调用B。
抓包,得到URI是PathTraversal/profile-upload
,查看源码。
进入到父类的execute
方法中,发现没有对用户上传的文件名进行检测,造成了目录遍历漏洞。
题目要求我们把图片上传到C:\Users\chang/.webgoat-@project.version@/PathTraversal/chang123
里,但是直接上传的时候发现上传到的位置是C:\Users\chang/.webgoat-@project.version@/PathTraversal/chang123/test
。
提交图片的时候进行抓包,然后在fullname里修改上传图片后的名字为../test.jpeg
再进行发送即可。
发现在上一关的基础上进行了对../的
静态过滤处理,因此我们可以使用双写进行绕过。
本关基于上一关,对文件名中的../
进行了过滤。因此我们需要考虑绕过。既然提示了对../
的过滤,那么我们可以使用双写进行绕过。
抓包,URI是PathTraversal/profile-upload-remove-user-input
,查看源码,发现对文件的名字进行了处理,因此需要进入里面看是怎么处理的。这里需要注意下,他这里是读取文件名不是像前两关的一样直接使用fullName
的。
发现有多个实现了getOriginalFilename
接口的方法,一个个看,发现只有CommonsMultipartFile
类是进行处理的,因此下面就分析该类,因为另外两个没有做然后处理就不分析了。
发现对文件名进行了正反斜杠的检测,如果文件名字存在正反斜杆就需要对上传后的文件名进行重命名;如果没有正方斜杆就还是原来的文件名。
但是我还是无法确定实际上用的是那个类,因为不能根据是否做了处理就来判断的,还是不严谨。
由于不是对fullName
来进行上传后文件的命名的,因此我们只能从filename
来进行处理。把filename
的值添加../
在进行提交,就能够绕过成功了。
路径遍历不限于文件上传。在检索文件时,也可能存在路径遍历可以从系统检索其他文件的情况。本关要求查找名为path-traversal-secret.jpg的文件。
实现点击Show random cat picture
抓包,可以发现请求的时候是没有任何参数的,但是响应的时候发现Location
里居然出现了一个id
参数。
于是就尝试在random-picture
添加参数id
。发现能够正常显示了一张图片。
/WebGoat/PathTraversal/random-picture?id=1
于是使用../
来组合path-traversal-secret
来遍历查找。需要注意的是,由于是使用GET
方式请求的,所以需要对../
进行编码处理,即为%2e%2e%2f
%2e%2e%2f%2e%2e%2fpath-traversal-secret
===
../../path-traversal-secret
根据返回的提示说明用户的SHA-512就是答案,因此去加密。
讲了个zip文件的漏洞,可以在提取zip文件时覆盖ls命令。一旦该命令被替换为一些额外的恶意操作,每次用户在ls中键入时,您可以在向用户显示真正的命令之前向服务器发送列表结果。因此,您最终会执行远程命令。
File destinationDir = new File("/tmp/zip");
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry e = entries.nextElement();
File f = new File(destinationDir, e.getName());
InputStream is = zip.getInputStream(e);
IOUtils.copy(is, write(f));
}
但如果上传了包含orders.csv
的zip文件,orders.csv
内容是:
../../../../../../../tmp/evil.sh
一旦使用上面的代码提取zip文件,该文件将保存在/tmp/evil.sh
中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。