SDLC之目录遍历

SDLC之目录遍历

可将这些材料直接应用于SDLC中的代码审计和渗透测试 —— sec875

image

假设有个网站,托管了很多文章和资源用于阅读资料。它们的URL资源请求如下:

http://example.com/file=report.pdf

攻击者可以实施这样的payload来获取文件系统中的其他文件

http://example.com/file=../../../../../etc/passwd

思考编码与双重编码

攻击者可以对../进行URL编码:%2e%2e%2f,Web 服务器来负责解码,比如apache,nginx。

双重编码又是怎么回事?它是基于此场景:当请求提交到web服务器时,被解码了一次。然后该web服务器又将此请求发送到后面的web服务器用于调取资源,比如反向代理。

是否存在其他场景对URL进行解码?存在,可能在各种web服务器功能模块中出现,以及其他中间件,编码API等。比如encodeURL()函数

这样笼统的描述有助于快速将您引入到基于编码的bypass,这就达到此文的理解认知了,我不想在这打开这个兔子洞。同时还有更多的bypass,比如基于语义的bypass,多中间件或过滤器处理的歧义与“优化”等。

有了以上认知后,可以生动形象的理解一些bypass的技巧了。

所以说,请求被谁先接收极其重要。假设是waf先接收,它会不会具备web服务器的功能对URL进行解码呢?如果../被拦截了,但是它本身不具备URL解码的功能,那么编码就能绕过它。反之则无法绕过。

三重?四重?

其他编码又是如何?

上传文件场景练习

上传头像

image

发送到重放器中

image

观察发现路径与test强相关,payload如同所示

image

image

假设开发人员修复了之后,再来进行测试,这一次使用双重payload,如同所示

image

开发人员再一次意识到了基于test输入的问题并修复了,观察发现路径与filename强相关

image

image

检索文件场景练习

在检索文件时也可能存在路径遍历,这里叫我们找到path-traversal-secret.jpg文件

image

基于功能点的观察数据包,发现图片的显示与响应包的id变量强相关。这可如何控制此变量?我们尝试在GET请求中添加变量id已此祈祷服务器能够接收并可以控制响应包的变量

image

发现有效

image

小插曲:关于js的调试器与控制台

审计元素发现触发的是newRandomPicture()函数

image

查看函数的定义:火狐浏览器与谷歌浏览器具体描述不同,但大致差不多

image

从代码中发现,js事件发起get请求并将结果赋值于具体的元素ID里的src属性。

如果您使用断点来观察此函数时,应该注意以下位置的地方:调用堆栈与范围。调用堆栈明确的指出此时作用于哪个变量,以及其范围中对应的元数据。注意使用步进。

image


回到正题,试试URL编码,发现将系统文件都显示出来了

image

层层遍历,发现了目标

image

拿到目标flag:username的sha512哈希

image

image

Zip Slip漏洞

web应用大概率的会处理ZIP文件,Snyk 安全团队发现并负责任地披露了一个巧妙的漏洞,以下是此团队的原文:

https://snyk.io/research/zip-slip-vulnerability

https://www.油兔比.com/watch?v=l1MT5lr4p9o

总而言之,此漏洞基于两个部分:第一部分解压zip,释放基于文件名的payload(路径本身也是一种payload)。而第二部分也是根据应用的功能点来完成的sh脚本执行。也就是以上参考资料中的应用本身具备这两个功能:上传压缩文件并执行解压后的文件内容

image

直接下载,观察payload即可:https://github.com/snyk/zip-slip-vulnerability/tree/master/archives

看一眼您就明白了

image

观察以下不安全的代码,发现第5行没有输入验证,最后直接处理文件

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));
}

直接上传压缩文件即可

image

image

关于payload的制作

zip slip.zip ../../../../tmp/evil.sh
zip slip.zip 1.jpg

image

添加文件

image

修复建议

也是代码审计的点,看看有没有以下逻辑代码存在。

对于这些注入类payload的通用意识:第一步,名称字符串编码标准化。第二步,如果涉及字符串修改,放在过滤器之前,防止被畸形bypass。第三步,输入验证与检测(过滤器,黑白名单)。第四步,输出编码(HTML实体化等)。

结尾

感谢师傅们很有耐心的看到了这里。

我们还会再见面的。

共勉。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发