前言:
堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油
注意:
本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各位博主 师傅 大佬 勿喷,还希望大家指出错误
目录穿越漏洞
概念:
目录遍历Directory traversal(也称文件路径遍历、目录穿越、路径遍历、路径穿越)是一种允许攻击者在未授权的状态下读取应用服务上任意文件的安全漏洞。这包括应用代码、数据、凭证以及操作系统的敏感文件。在有些情况下,攻击者还可能对服务器里的文件进行任意写入,更改应用数据甚至完全控制服务器。
原因:
程序系统在实现上没有过滤用户输入的../之类的目录跳转符,允许攻击者通过提交目录跳转符来遍历服务器上的任意文件。 比如:
http://www.test.com/index.php?file=image1.jpg
当服务器处理传送过来的image1.jpg文件名后,Web应用程序会自动添加完整的路径,比如:c://test/static/imgs/image1.jpg
,然后web系统将读取的内容返回给攻击者。 若对文件名称的安全性验证不足,攻击者会使用../../../ect/passwd
的文件名,将会导致访问非授权文件资源。
我们直接进入平台 测试
我们随意上传一张图片 得到文件的当前路径
然后文件的最后一个地址为FUll Name ,
我们直接测试修改为../wenda进行目录穿越试试发现存在漏洞
我们查看源代码进行审计(部分截取)
private void assignment1() throws IOException {
MatcherAssert.assertThat(
RestAssured.given()
.when()
.relaxedHTTPSValidation()
.cookie("JSESSIONID", getWebGoatCookie())
.multiPart("uploadedFile", "test.jpg", Files.readAllBytes(fileToUpload.toPath()))
.param("fullName", "../John Doe")
.post(url("PathTraversal/profile-upload"))
.then()
.statusCode(200)
.extract()
.path("lessonCompleted"),
CoreMatchers.is(true));
}
我们根据下面这几行就可以得知
multiPart("uploadedFile", "test.jpg", Files.readAllBytes(fileToUpload.toPath()))
它将名为
"test.jpg"
的文件作为"uploadedFile"
字段的值进行上传。 这就是文件上传的逻辑
.param("fullName", "../John Doe")
这一部分是提交参数的逻辑。它将名为
"fullName"
的字段设置为"../John Doe"
。也就是上面的Pull Name,这是一个潜在的路径遍历漏洞。使用"../"
这样的相对路径可以尝试绕过文件系统的限制,访问到非预期的目录或文件。
其实就是说传入的文件获得当前路径的时候没有进行任何过滤,而且该当前地址的最后为PullName,所以就直接../目录穿越成功,通过这个就可以获得敏感信息,下载任意文件等重大漏洞危害
漏洞修复
- 关闭远程包含参数开关,彻底切断这个业务相比较
- 设置类似白名单的方法,筛选固定文件名
- 常见目录穿越字符进行过滤,如(./ …/ …\等)