一、路径遍历漏洞
1.1、简述:
如果应用程序使用用户可控制的数据、以危险的方式访问位于应用程序服务器或其他后端文件系统中的文件和目录, 就会出现路径遍历漏洞。通过提交专门设计的输入,攻击者就可以在被访问的文件系统中读取或者写入任何内容。这种漏洞往往使攻击者能够从服务器上读取敏感信息或者重写敏感文件,并最终在服务器上执行任何命令
1.2、示例:
https://xxx.com/filestore/GetFile.ashx?filename=1.jpg
1、从查询字符串中提取filename参数值
2、将这个值附加在C\filestore\之后
3、用这个名称打开文件
4、读取文件的内容并将其返回给客户端
漏洞发生原因:攻击者可以将路径遍历序列放入文件名内,从第2步指定的图像目录向上回溯,从而访问服务器上的任何文件,路径遍历序列表示 为..\
https://xxx.com/filestore/GetFile.ashx?filename=..\winonws\win.ini
如果应用程序把filename参数的值附加到图像目录名称之后
C:/filestore/..\winonws\win.ini
相当于
C:\winonws\win.ini
返回默认的Wiodows配置文件
在新版本中, 和许多其他Web服务器一样,服务器进程默认以权限较低的用户账户运行。所以在探查路径遍历漏洞时, 最好是请求一个可由任何类型的用户读取的默认文件
此类攻击早已广为人知,通常会针对它们实施各种防御, 大多数情况下是采取输入确认过滤
二、查找和利用
2.1、简述:
1、许多功能都要求Web应用程序根据用户在请求中提交的参数向文件系统读取或写入数据。如果以不安全的方式执行这些操作, 攻击者就可以提交专门设计的输入,使应用程序访问开发者井不希望它访问的文件。
2、这类漏洞称为路径遍历漏洞,攻击者可利用这种漏洞读取密码和应用程序日志之类的敏感数据, 或者重写安全性至关重要的数据项, 如配置文件和软件代码。在最为严重的情况下, 这种漏洞可使攻击者能够完全攻破应用程序与基础操作系统。路径遍历漏洞很难发现,且Web应用程序对它们实施的防御也十分脆弱。
2.2、确定攻击目标
简述:
在对应用程序进行初步解析的过程中,应该已经确定了所有与路径遍历漏洞有关的明显受攻击面。主要用于文件上传或下载目的的所有功能都应进行全面测试。
小:用户可共享文档的工作流程应用程序,允许用户上传图像的博客、拍卖的应用程序, 以及为用户提供电子书、技术手册和公司报表等文档的信息型应用程序, 常常使用这种功能。
大:各种行为表示应用程序需要与文件系统进行交互
过程:
1、分析在应用程序解析过程中收集到的信息, 确定以下内容。
A、请求参数中明显包含文件或目录名称的所有情形
B、需要从服务器文件系统(相对于后端数据库)读取数据的所有应用程序功能
2、在测试其他漏洞的过程中, 寻找有益的错误消息或其他反常事件。设法确定用户提交的数据传送给文件API或作为操作系统命令参数的所有情况
白盒:
如果攻击者已经从本地访问应用程序,即通过白盒测试,或已经攻破了服务器的操作系统,那么往往能够直接确定路径遍历目标, 因为他可以监控应用程序与文件系统之间的全部交互
1、使用适当的工具监控服务器上的所有文件系统活动。如可以在Windows平台上使用Syslnternals开发的FileMon工具,在Linux平台上使用ltrace/strace工具, 在Sun Solaris平台上使用truss命令
2、在每一个被提交的参数( 包括全部cookie、查询字符串字段和POST数据项)中插入一个特殊的字符串(如traversaltest)测试应用程序的每一个页面。一次仅针对一个参数进行测试, 并使用自动技巧加速测试过程
3、在文件系统监控工具中设置一个过滤器, 确定所有包含测试字符串的文件系统事件
4、如果发现测试字符串被用作文件或目录, 或者出现在文件或目录名中, 那么对每一种情况进行测试, 确定其是否易于受到路径遍历攻击
2.3、探查路径遍历漏洞
简述:
1、确定各种潜在的路径遍历测试目标后, 必须分别测试每种情况, 弄清其是否以不安全的方式向相关文件系统操作传送用户可控制的数据。
2、在测试用户提交的参数时, 需确定遍历序列是否被应用程序阻止,或者它们是否能够正常工作。通常, 提交不会向上回溯到起始目录的遍历序列是一种较为可靠的初步测试方法。
过程:
1、假设所针对的参数被附加到应用程序预先设定的目录之后, 那么插入任意一个子目录和一个遍历序列修改参数的值
file=foo/file.txt
改为
file=foo/test/../file.txt
(即使子目录test并不存在,测试仍然有效,因为大多数文件系统在尝试获取文件路径前对其进行了规范化。路径序列删除了虚构的目录, 因此服务器并不检查它是否存在)
如果两种情况下完全相同, 就表示它易于受到攻击。应继续进行测试,尝试通过向上回溯到起始目录来访问不同的文件
2、在上述两种情况下, 如果应用程序的行为有所不同, 那么应用程序可能阻止、删除或净化遍历序列, 致使文件路径失效。需要研究是否可通过其他方法避开应用程序的过滤
如果发现提交遍历序列但不向上回溯至起始目录不会影响应用程序的行为, 再应该尝试遍历出起始目录, 从服务器文件系统的其他地方访问文件
1、如果所攻击的应用程序功能只拥有文件读取访问权限, 那么尝试访问相关操作系统上的一个已知任何用户均可读取的文件。提交一个值作为受控制的文件名参数
如:../../../etc/passwd
2、如果所攻击的功能拥有文件写入访问权限, 那么要最终确定应用程序是否易于受到攻击, 可能会更困难。一种有效的测试是尝试写入两个文件,一个文件可被任何用户写入,另一个文件即使是根用户或管理员也禁止写入
如:../../write_test.txt
../../windows/system32/config/sam
在UNIX平台上, 禁止根用户写入的文件取决于使用的平台版本, 但尝试用一个文件重写一个目录绝不可能取得成功,进行以下尝试
../../tmp/write_test.txt
../..tmp
在上面的每对测试中, 如果应用程序在响应两个请求时表现出行为差异(如响应第二个请求时返回一条错误消息, 而响应第一个请求时不返回错误消息), 那么应用程序可能易于受到攻击
3、可通过写入访问确定遍历漏洞, 即尝试在Web服务器的Web根目录中写入一个新文件, 然后尝试通过浏览器获得这个文件。但如果不知道Web根目录的位置,或者访问文件的用户并不拥有写入权限,可能不会成功
注:Windows平台接受斜线(/)和反斜线()作为目录分割符, 而UNIX平台只接受斜线作为分隔符。一些Web应用程序过滤两者之一,即使完全确信Web服务器运行的是UNIX操作系纨, 但应用程序仍然可能被Windows后端组件调用。所以当探查遍历漏洞时, 最好两者都进行测试
2.4、避开遍历攻击障碍
简述:
(上述)遍历攻击尝试并未成功, 并不意味着应用程序不容易受到攻击。许多应用程序开发者意识到路径遍历漏洞, 并执行各种输入确认检查尝试防止这种漏洞。但防御措施往往存在缺陷, 可被技术熟练的攻击者避开。
第一种常见的输入过滤方法:首先检查文件名参数中是否存在任何路径遍历序列, 如果存在,拒绝包含遍历序列的请求,或尝试删除该序列以对输入进行净化。这种类型的过滤往往易于受到各种攻击,使用编码或其他方法来避开过滤,这类攻击全都利用输入确认机制所面临的规范化问题
过程:
1、尝试始终通过使用斜线与反斜线的路径遍历序列进行测试,测试输入过滤是否仅检查其中一种序列,而文件系统却支持全部两种序列
2、尝试使用编码方案, 对遍历序列进行简单的URL编码。一定要对输入中的每一个斜线与点进行编码:点(%2e)、斜线(%2f)、反斜线(%5c)
3、16位Unicode编码:点(%u002e)、斜线(%u2215)、反斜线(%u2216)
4、双倍URL编码:点(%252e)、斜线(%252f)、反斜线(%255c)
5、超长UTF-8 Unicode编码:点(%c0%2e、%e0%40%ae、%c0ae)、斜线(%c0%af、%e0%80%af、%c0%2f)、反斜线(%c0%5c、%c0%80%5c)
可以在Bp中使用非法UniCode有效载荷类型为任何特殊字符生成大量其他形式的表示法,并将它提交到目标参数的相关位置。这些表示法严重违反了Unicode表示法规则,但却为许多Unicode解码器接受、特别是windows平台上的解码器。
第二种防御路径遍历攻击时常用的输入过滤,确认用户提交的输入是否包含应用程序想要的后缀(如文件类型)或前缀(如起始目录),可能二种防御会联合使用。
过程:
1、一些应用程序检查用户提交的文件是否以一种或一组特殊的文件类型结尾,并拒绝访问其他内容的请求。有时候可以在请求的文件名后放入一个URL编码的空字节, 在后面连接应用程序接受的文件类型,从而避开这种检查,如../../test.ini%00.jpg
如果应用程序使用API在托管执行环境下执行文件类型检查, 该执行环境允许字符中包含空字符,但当获取文件时,应用程序最终在一个无法控制的环境(其中的字符串以空白字符结束)中使用API,因此文件名被截短
2、有的应用程序将它们自己的文件类型后缀附加在用户提交的文件名后, 尝试控制被访问的文件类型。基于相同的原因, 前面的任何一种利用都可能取得成功
3、有的应用程序检查用户提交的文件名的开头部分是否为起始目录的某一个子目录, 或一个特殊的文件名。避开这种检查:filestore/../../../etc/passwd
4、如果针对输入过滤的攻击都无法成功, 可能应用程序实施了多种类型的过滤,需要同时使用上面的几种攻击方法(同时针对遍历序列过滤与文件类型或目录过滤),并且分阶段进行
2.5、处理定制编码
简述:
应用程序采用的文件名编码方案最终以危险的方式进行处理, 模糊处理也不能提供任何安全保璋, 这时就会出现路径遍历漏洞。如应用程序具有某种工作流程功能, 允许用户上传与下载文件。执行上传操作的请求提供个文件名参数,在写入文件时易于受到路径遍历攻击。如果一个文件成功上传, 那么应用程序再为用户提供一个下载URL
应用程序核对将要写入的文件是否已经存在,存在则拒绝写入
为下载用户文件而生成的URL使用一种定制模糊处理方案表示。这种方案似乎是一种定制的Base64编码形式,在每个编码文件名位置使用一组不同的字符
直接利用漏洞中的障碍,尽管能够在服务器文件系统中写入任何文件, 但攻击者却无法重写任何现有的文件,且Web服务器进程拥有的较低权限意味着攻击者不可能在任何有利位置创建新文件。如果不对定制编码进行逆向工程, 攻击者也不可能请求任何一个现有的文件
2.6、利用遍历漏洞
简述:
1、确定一个可向服务器文件系统读取或写入任意文件的路径遍历漏洞后,应当实施哪种攻击利用这些漏洞,在文件系统上拥有和Web服务器进程相同的读取/写入权限
2、可以利用读取访问路径遍历漏洞从包含有用信息的服务器上获取有益的文件, 或帮助优化针对其他漏洞的攻击
1、操作系统与应用程序的密码文件
2、服务器与应用程序配置文件
3、可能含有数据库证书的包含文件
4、应用程序使用的数据源,如MySQL数据库文件或XML文件
5、服务器可执行页面的源代码, 以执行代码审查, 搜索漏洞
6、可能包含用户名和会话令牌的应用程序日志文件等
3、利用漏洞的方法:
A、在用户的启动文件夹中创建脚本
B、当用户下一次连接时, 修改in.ftpd等文件执行任意命令
向一个拥有执行许可的Web目录写入脚本, 从浏览器调用它们
三、防止路径遍历漏洞
3.1、简介:
避免向任何文件系统API传送用户提交的数据是防止路径遍历漏洞的最有效方法。大多数文件都没有采用访问控制, 攻击者可将这些文件存入web根目录中, 再通过URL直接访问。如果以上方法行不通, 应用程序可能会保存一个可由页面处理的硬编码图像文件列表, 并使用不同的标识符(如索引号)指定需要的文件。任何包含无效标识符的请求都可能被拒绝, 因为没有受攻击面可供用户利用, 使其操纵页面提供的文件路径。
与实现文件上传与下载的工作流程功能一样, 应用程序可能需要允许用户通过名称指定文件, 采用最简单的办法,将用户提交的用户名传送给文件系统API,从而达到这种目的, 应用程序应实施深层防御措施, 为路径遍历攻击设立几层障碍。
1、对用户提交的文件名进行相关解码与规范化之后, 应用程序应检查该文件名是否包含路径遍历序列(使用反斜线或斜线)或空字节,检测出应用程序应停止处理请求
2、应用程序应使用一个硬编码的、允许访问的文件类型列表, 并拒绝任何访问其他文件类型的请求
3、对用户提交的文件名进行过滤后, 应用程序应使用适当的文件系统API确认是否一切正常以及使用该文件名访问的文件是否位于应用程序指定的起始目录中
应用程序可以使用一个chrooted环境访问包含被访问文件的目录, 减轻大多数路径遍历漏洞造成的影响。在这种情况下, chrooted目录就好比是文件系统根目录, 任何试图从这个目录向上回溯的多余遍历请求被忽略。大多数UNIX平台都支持chrooted文件系统,在windows平台上,以新逻辑驱动器的形式安装相关目录,并使用相应的驱动器字母访问目录内容,即可实现类似的效果
应用程序应将其路径遍历攻击防御机制与日志和警报机制整合在一起。只要收到一个包含路径遍历序列的请求, 提出请求的用户就可能时恶意的,应用程序应在日志中进行记录标明该请求企图违反安全机制, 并终止该用户的会话,冻结该用户账户并向管理员发出警报
版权归原作者 黑色地带(崛起) 所有, 如有侵权,请联系我们删除。