应用安全系列之十一:路径遍历

您所在的位置:网站首页 漏洞扫描一般采用的技术 应用安全系列之十一:路径遍历

应用安全系列之十一:路径遍历

2023-06-18 07:12| 来源: 网络整理| 查看: 265

本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的API可以更好地更直接地解决问题,也不排除可以严格地输入验证来解决。

Web系统中关于文件的操作有两种,上传和下载,不同的操纵一旦路径或者文件名没有控制好,就会出现很严重的问题,轻则泄露内部机密信息,重则注入木马,控制服务器。

文件上传

        上传文件通过在Web页面上添加这样的输入框,用户通过输入框输入要上传的文件,同时,要注意必须输入input输入框的name属性,否则,可能导致不会上传文件的数据。而且,form的enctype属性设置为multipart/form-data,设置该值后,浏览器在上传文件时,会把文件的内容放在HTTP请求的消息体中,并且使用MIME协议对上传文件信息进行描述,这样服务器根据MIME协议对数据进行解析即可。上传文件容易出现的问题是:上传路径控制不正确、上传可执行的文件、上传文件并发性控制不当、存储文件过多导致性能降低,以及由Web服务器自身缺陷引起的漏洞。文件之所以可以能够上传到其他位置,主要是由相对路径的特殊字符(../)引起的,例如,Web应用程序的根目录在/www/webroot,程序用来上传的文件在/www/webroot/upload路径下,如果一个用户名是Alex,用户ID是1000,那么他可以上传文件到/www/webroot/upload/al/1000这个路径下,如果输入的文件名为../../webroot/test. data,程序又没有对文件名进行有效的检查,就可能会创建一个文件名为../../webroot/test.data的文件,系统会在/www/webroot/路径下创建一个文件test.data,这样即使上传的空间有限制,恶意用户也可以通过此漏洞,将文件上传到其他路径下,绕过空间的限制,甚至可以将服务器的空间全部占用,影响服务器的正常工作。如果攻击者可以上传一些可以在服务器端可以执行的文件,例如:以jsp、asp、aspx、asa、hdx、cer、exe、bat等扩展名结尾的文件,上传之后,如果还可以通过URL路径访问此文件,就可以出发此文件的执行,严重危害系统的安全。

      上传文件漏洞产生的原因如下:

       第一、就是没有严格控制上传文件的类型和大小;

       第二、就是没有对文件名进行检测,导致../../的出现,出现路径跳转。

       第三、上传的路径的权限设置不对,应该只能设置为可读写,但是不能可执行。

      第四、由于语言的API理解与使用不正确,导致出现问题。例如Java语言的File类,有三个函数:getPath、getAbsolutePath和getCanonicalPath, 如果没有仔细研究这几个API的功能,直接使用getAbsolutePath,就会以为把../等路径处理,得到最终的绝对路径,其实结果却不是的,这几个API的说明如下;

类函数说明FilegetPath返回的是定义时的路径,可能是相对路径,也可能是绝对路径getAbsolutePath返回的是定义时的路径对应的相对路径,但不会处理“.”和“..”的情况getCanonicalPath返回的是规范化的绝对路径,相当于将“.”和“..”解析成对应的正确的路径

真正了解了这些函数的含义之后,才会正确地使用他们,不能依靠名字就断定其功能。

文件下载

        文件下载容易出现的问题就是,当一个用户获得一个文件的下载权限时,他可以通过修改文件名或者文件ID,下载别的用户的私有文件,也就是路径遍历问题。一个攻击者可以使用多个“..”导致操作系统跳到限制的路径以外的路径,甚至整个系统,这就是路径遍历问题。它可以使攻击者突破应用程序的安全控制,泄露服务器的敏感数据,包括配置文件、日志、源代码,使得攻击者可以更容易地获得更高权限的信息,而且利用起来也相对简单。例如下面这个URL:

http://www.test.com/?fn=/../../../../../../../../../../../etc/passwd

 访问这个URL可能的后果就是下载服务器系统的/etc/passwd文件。这个URL在Web服务器会被判断不是一个HTML或者其他的Web常用的文件扩展名,因此可能会被拒绝,那么可以尝试如下:

http://www.test.com/?fn=/../../../../../../../../../../../etc/passwd%00.html

  通过%00.html欺骗Web应用程序,访问的是个.html文件,但是,到具体的后端实现时,%00会被解析为控制符,导致访问的还是/etc/passwd文件。 

如果成功,就可以直接查看/etc/passwd文件的内容:

 

导致路径遍历的原因主要原因如下:

     第一、是对输入的检查不当或者没有检查,

    第二、对输入没有进行检查,但对路径的过滤方法不当,例如:有的程序员可能会立马想到将../替换成空字符,不就可以解决了吗?那么:..../..// 替换的结果之后还是../。所以替换的方法不可行。

    第三、同上传的API理解与使用不正确。各种语言获取绝对路径的API如下:

语    言函 数 接 口Crealpath()JavagetCanonicalPath()ASP.NETGetFullPathPerlrealpath()或者abs_path()PHPrealpath()Pythonos.path.abspath

   无论上传还是下载出现的问题,关于路径没有特殊字符编码或者转义处理方法,因为点(.)作为文件扩展名的一部分时也是合法的,只能采用输入验证的方法,可以采用统一的处理方法:

   第一、输入验证, 只要出现非法字符串(..) 或者以~开头的字符串,(WIndow系统需要注意%,例如:%SysttemRoot% 或者%UserHome%等,都可以跳转到其他路径),就报错退出,不尝试错误纠正处理。考虑到不同的系统对文件名的限制不一样,需要考虑Windows、Linux和Mac系统的文件名的合法与非法字符。

  第二、不直接使用客户端提供的文件名,客户端提供的文件名只用于显示,这样无论什么文件名都是可以接受的。内部系统可以使用随机数产生器产生一个随机的文件ID,需要足够长,足够难猜,否则,还可能通过修改文件ID遍历文件。

  第三、获取绝对路径名之后,需要判断需要访问的路径是否在目标路径之下,例如:下载文件是否在整体下载路径的根目录之下,如果所有的文件都放在/download 这个路径之下,就要检测一下,获得绝对路径之后,是否以/download开头。如果使用文件ID的方案这一步,也就不必要了。

     总之,关于路径跳转的问题,不要尝试去纠错,使用安全的措施去预防,才能有保障。

最后再谈一个和路劲遍历有关的特殊的攻击,可能平时都不太关注,就是解压缩时,如果压缩文件中的文件名含有(../)的文件,会在解压时覆盖目标路劲之外的文件。可能有的人会问,如何去制作一个含有../的文件? 其实,不同的操作系统对文件名的限制是不一样的,在windows系统下不能制作,可以尝试在linux或者MAC系统下试试。 在解压之后,往系统写作之前,需要针对每一个ZipEntry的文件名字进行校验,非法的文件直接扔掉。

问题代码示例:

Enumeration entries = zip.getEntries(); while (entries.hasMoreElements()) { ZipEntry e = entries.nextElement(); File f = new File(destinationDir, e.getName()); // 没有判断内部的文件名,就直接向系统西写入。 InputStream input = zip.getInputStream(e); IOUtils.copy(input, write(f)); }

  需要在获取entry的名字之后,对e.getName进行校验之后,再写入文件系统。 针对最常用的语言:java: ZipEntry  和.net: IArchiveEntry等, 在获取每一个Entry的名字并且在使用之前都需要进行验证之后,才能使用。

如果有不妥之处,希望可以留言指出。谢谢!

参考:

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3