WebGoat代码审计其3-路径穿越

Posted by Mr.Be1ieVe on Thursday, June 17, 2021

Path traversal 2

请求 URL: http://localhost:8080/WebGoat/PathTraversal/profile-upload 请求方法: POST

全局搜索后找到

跳入 ProfileUploadBase类,看里面的execute函数

先检查file和fullName是否为空,然后检查上传路径是否存在。最后开始新建上传路径,创建file对象并将上传图片内容复制到这个对象里。

跟随fullName找到下面的new File(uploadDiectory, fullName)

resolve会直接拼接parent和child。如果路径为空就使用默认路径,否则使用parent传入的路径,parent为空则直接使用child为路径。

最后会使用attemptWasMade函数来检测是否尝试了路径穿越

关于getCanonicalPath()这个函数,

public static void main(String[] args) throws IOException { 
        File file = new File("../test.txt");
        System.out.println(file.getPath());
        System.out.println(file.getAbsolutePath());
        System.out.println(file.getCanonicalPath());
    }

输出

..\test.txt
C:\Users\holysheep\Desktop\java\main\src\..\test.txt
C:\Users\holysheep\Desktop\java\main\test.txt

可以看到,getAbsolutePath()不会处理../,而getCanonicalPath()会返回规范的绝对路径。

所以最终是使用绝对路径来判断是否进行了路径穿越。

Path traversal 3

说是修复了../,跳过去一看

只是进行了替换,用....//test即可绕过

Path traversal 4

Post到/WebGoat/PathTraversal/profile-upload-remove-user-input

改为获取Content-Disposition中的fileName,所以修改

Path traversal 5

抓包后发现,在请求加上?id=0可以获取到路径和图片名,然后添加../会提示Illegal characters are not allowed in the query params

按照提示请求path-traversal-secret提示

审计代码后发现

会先进行判断是否存在../然后再获取id的内容

request.getParameter()里会对获取到的数据进行urldecode

所以可以通过这种办法进行绕过前面的检测,然后测试得到最终的结果。

顺便一提,查找不存在的文件最终会返回父路径下的所有文件,是因为catPicture.getParentFile().listFiles()

小结解决方案

从最后一段的代码中可以看到,如果使用getParameter再用黑名单,可以避免url编码的绕过。

「真诚赞赏,手留余香」

Mr.Be1ieVe's Treasure

真诚赞赏,手留余香

使用微信扫描二维码完成支付