【Nginx】nginx目录遍历漏洞

前言

除了X-Forwarded-For伪造客户端IP漏洞,发现还要修改关于目录遍历的漏洞,这里简单记录一下。

1、介绍

Nginx 目录遍历(Nginx Directory Traversal)是一种安全漏洞,通常会影响 Nginx 服务器上的 Web 应用程序。该漏洞允许攻击者通过利用应用程序代码中的错误配置或代码漏洞,来访问系统中未经授权的文件和目录。

简单来说,当 Nginx 服务器上的 Web 应用程序允许用户通过 URL 访问目录和文件,同时将 URL 中的目录和文件名称注入到服务器端的响应中时,就可能存在目录遍历漏洞。攻击者可以通过注入特殊的字符序列来绕过应用程序的访问控制,以访问敏感文件或目录。

2、问题分析介绍

网上有很多描述的示例,可以看Nginx漏洞修复之目录穿越(目录遍历)漏洞复现及修复
注意: 该漏洞主要出现在alias访问静态资源文件的时候。

例如,Nginx配置如下:

location /static {
    
    
    alias /static/images/;
}

一个 web 应用程序允许用户通过 URL 访问静态文件,如下:

http://www.example.com/static/images/picture.jpg

如果攻击者能够使用目录遍历漏洞来访问应用程序中未授权的目录和文件,那么他们可能通过以下 URL 访问静态文件:

http://www.example.com/static../../../../etc/passwd

上述 URL 的作用是向上遍历至根目录,然后访问 /etc/passwd 文件,从而访问到包含用户凭据等敏感信息的文件。

注意:
/static../表示/static/images/..,因为/static被alias替换成了/static/images/

3、解决

根据上面问题说明,我们可以直观的明白问题,主要原因是攻击者可以通过加入..得到/static../,使得实际请求地址变为/static/images/..然后进行非法访问。

修改也很简单,只需要在location的URI末尾加上/就可以,如下:

location /static/ {
    
    
    alias /static/images/;
}

查了些资料,感觉都挺有道理的解释,如下:

3.1 解释:为什么加入/可以解决✨

原本问题出现在/static后面没有结束限制,前面只要匹配上就会被alias替换成相应的URI,然后后面接入的..就会形成新的路径被攻击。

现在加上/来解决,是因为/表示必须是目录,因此在该location中,只会响应/static/及其子目录的请求,而无法获取到网站目录之外的文件

此外,加上/后,URI需要/static/才能被alias替换,无法在里面加入..形成/static../来访问。

3.2 解释2:什么是目录,什么是文件

/结尾表示资源是一个目录,而不是文件。当在Nginx配置location时,如果使用了以斜杠结尾的URI,则Nginx会将其视为目录而不是文件,从而决定以何种方式呈现给客户端。

在Unix/Linux操作系统中,一个文件可以是文本文件、二进制文件、图片、音频等各种类型,而一个目录则是用来存放文件及其他目录的。类似于Windows操作系统中的文件夹,一个目录可以包含多个文件或其他目录,即使目录为空,也会占用一定的磁盘空间,显示为一个文件夹的图标。

在Nginx中,一个URI可以表示一个文件,也可以表示一个目录。如果一个URI以斜杠结尾,Nginx会认为它是一个目录而不是文件。此时就可以通过访问该URI下的Index文件来展示目录的内容了。例如,如果浏览器访问http://example.com/files/,则Nginx会自动在该URI下查找名为index.htmlindex.htmindex.php等文件,并将其展示出来。

4、补充

关于Nginx配置中对于location末尾的“/“的处理

猜你喜欢

转载自blog.csdn.net/weixin_42516475/article/details/131109530
今日推荐