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编码的绕过。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付