常见的Nginx配置错误原理分析及其危害

简介: 常见的Nginx配置错误原理分析及其危害

nginx简介

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

环境搭建

    git clone https://github.com/detectify/vulnerable-nginx.gitcd vulnerable-nginxdocker-compose up -d浏览器访问:http://xxx.xxx.xxx.xxx:5000/cats


    根目录位置丢失

    危害:在某些情况下,访问者可能会访问其他配置文件、访问日志甚至 HTTP 基本身份验证的加密凭据

    示例

    root指令指定 Nginx 的根文件夹。nginx的根文件夹是/etc/nginx这意味着我们可以访问该文件夹中的文件。上面的配置没有针对/(location / {...})的位置,只有/cats的位置。因此,root 指令会被设置为全局,这意味着对/的请求会将你带到本地路径/etc/nginx

    GET /nginx.conf这样简单的请求都能显示存储在/etc/nginx/nginx.conf中Nginx 配置文件的内容。如果将根设置为/etc,则对/nginx/nginx.conf的GET请求将显示配置文件。

    root指令指定/etc/nginx文件夹位置,可访问该文件夹下所有文件

    640.png


    请求访问http://192.168.240.129:5000/nginx.conf成功看到了nginx.conf文件内容

    640.png


    收集的近 50000 个Nginx 配置文件中,最常见的根路径如下:

    640.png

    off-by-slash

    危害

    这可能导致服务器状态通过 URL公开,或者可能让不希望公开访问的路径可访问

    结合一条缺少尾斜杠的location指令与一条alias指令,来读取 Web 应用程序的源代码。鲜为人知的是,它还可以与其他指令(例如proxy_pass)一起使用。

    示例

    如下图。路径指向的是 /usr/share/nginx/html/

    640.png

    一条缺少尾斜杠的location指令与一条alias指令

    cats后加.. 可越权访问 nginx下的文件

    http://192.168.240.129/cats../flag.txt

    640.png


    它还可以与其他指令(例如proxy_pass)一起使用


    640.png


    proxy_pass http://apache:80/catpictures/;

    如果一个 Nginx 服务器运行能在 server 访问的以下配置,则可以假定访问者只能访问http://apache:80/catpictures/下的路径

    当请求http://192.168.240.129:5000/image时,Nginx将首先规范化 URL。然后,它会查看前缀/images是否与URL 匹配,本例中是匹配的

    然后,服务器从 URL 中删除该前缀,保留/1.jpg路径。再将此路径添加到proxy_pass URL 中,从而得到最终URL http://apache:80/images//1.jpg

    请求http://192.168.240.129:5000/image../可以利用这种错误配置,这将导致 Nginx 请求URL:

    http://apache:80/catpictures../,其标准化为http://apache:80/

    640.png

    成功查看到secret.html

    导致访问者看到可能让不希望公开访问的路径可访问

    640.png


    不安全的变量使用


    1、使用 $uri 可导致 CRLF 注入

    危害

    与Nginx 变量有关的另一个错误配置是使用$uri$document_uri代替$request_uri$uri和$document_uri包含标准化的 URI,而 Nginx 中的normalization包括对 URI 解码的 URL。在 Nginx 配置中创建重定向时经常会使用$uri,结果导致 CRLF 注入

    示例

    一个易受攻击的 Nginx 配置


    640.png


    HTTP 请求的换行符为\r(回车)和\n(换行)。对换行符进行 URL 编码将导致以下字符表示形式%0d%0a。如果将这些字符包含在对配置错误的服务器的一个请求中

    (例如http://192.168.240.129/images-credits%0d%0aDetectify:%20clrf),则该服务器将使用一个名为Detectify的新标头进行响应,因为 $uri 变量包含URL 解码的换行符。

    640.png


    2、SCRIPT_NAME

    危害

    有可能发生 XSS

    像下面这样的配置

      location ~ \.php$ {                include fastcgi_params;                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                fastcgi_pass 127.0.0.1:9000;        }

      主要问题是 Nginx 会将所有 URL 发送到以.php结尾的 PHP 解释器,即使该文件在磁盘上不存在。这是 Nginx 创建的“陷阱和常见错误”文档中提到的,在许多 Nginx 配置中都常见的错误。如果这个 PHP 脚本试图基于SCRIPT_NAME定义一个基本 URL,则将发生 XSS。


      <?php
      if(basename($_SERVER['SCRIPT_NAME']) ==basename($_SERVER['SCRIPT_FILENAME']))   echo dirname($_SERVER['SCRIPT_NAME']);
      ?>
      GET /index.php/<script>alert(1)</script>/index.phpSCRIPT_NAME  =  /index.php/<script>alert(1)</script>/index.php

      3、Any 变量

      危害

      用户可以在其中打印 Nginx 变量的值

      在某些情况下,用户提供的数据可以视为 Nginx 变量。目前尚不清楚为什么会发生这种情况,但如这份H1报告所示,这种情况并不罕见或不容易测试。如果搜索错误消息,我们可以看到它是在SSI过滤器模块中找到的,表明这是由 SSI 引起的。

      一种测试方法是设置一个引用标头值:


      $ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’


      原始后端响应读取

      危害

      隐藏内部错误消息和标头以便 Nginx 处理


      使用 Nginx 的proxy_pass,可以拦截后端创建的错误和 HTTP 标头。如果你这个方法会非常有用。如果后端回答一个错误,Nginx 将自动提供一个自定义错误页面。但如果 Nginx 无法理解这是一个 HTTP 响应怎么办?

      如果一个客户端向 Nginx 发送了一个无效的 HTTP 请求,则该请求将按原样转发到后端,后端将使用其原始内容来应答。然后,Nginx 将无法理解无效的 HTTP 响应,而将其转发给客户端。想象一个这样的 uWSGI 应用程序:

        def application(environ, start_response):   start_response('500 Error', [('Content-Type','text/html'),('Secret-Header','secret-info')])   return [b"Secret info, should not be visible!"]

        并在 Nginx 中使用以下指令:

          http {   error_page 500 /html/error.html;   proxy_intercept_errors on;   proxy_hide_header Secret-Header;}

          如果后端的响应状态大于 300,proxy_intercept_errors将提供一个自定义响应。在上面的 uWSGI 应用程序中,我们将发送一个500 Error,Nginx 将拦截该错误。

          proxy_hide_header可以自解释;它将从客户端隐藏任何指定的 HTTP 标头。

          如果我们发送一个普通的 GET 请求,则 Nginx 将返回:

            HTTP/1.1 500 Internal Server ErrorServer: nginx/1.10.3Content-Type: text/htmlContent-Length: 34Connection: close

            但是,如果我们发送一个无效的 HTTP 请求,例如:

              GET /? XTTP/1.1Host: 127.0.0.1Connection: close

              我们将收到以下答复:


              XTTP/1.1 500 ErrorContent-Type: text/htmlSecret-Header: secret-infoSecret info, should not be visible!

              merge_slashes 设置为 off

              此配置项表示是否合并相邻的“/”,例如,//test///a.txt,在配置为on时,会将其匹配为location /test/a.txt;如果配置为off,则不会匹配,URI将仍然是//test///a.txt。

              危害

              如果 Nginx 用作反向代理,并且被代理的应用程序容易受到本地文件包含内容的影响,则在请求中使用额外的斜杠可能会留出恶意利用空间。


              相关文章
              |
              7月前
              |
              编解码 应用服务中间件 Linux
              centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
              centos配置nginx-rtmp实现ffmpeg转码rtsp为rtmp视频流
              606 1
              |
              7月前
              |
              Ubuntu 安全 应用服务中间件
              详细指南:配置Nginx服务器在Ubuntu平台上
              以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
              391 18
              |
              7月前
              |
              Ubuntu 安全 应用服务中间件
              详细指南:配置Nginx服务器在Ubuntu平台上
              以上步骤涵盖了基本流程:从软件包管理器获取 Ngnix, 设置系统服务, 调整UFW规则, 创建并激活服务器块(也称作虚拟主机), 并进行了初步优化与加固措施。这些操作都是建立在命令行界面上,并假设用户具有必要权限(通常是root用户)来执行这些命令。每个操作都有其特定原因:例如,设置开机启动确保了即使重启后也能自动运行 Ngnix;而编辑server block则定义了如何处理进入特定域名请求等等。
              650 17
              |
              8月前
              |
              数据建模 应用服务中间件 PHP
              配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
              本示例演示如何通过Docker挂载同一宿主目录至Nginx与PHP容器,实现PHP项目运行环境配置。需注意PHP容器中监听地址修改为0.0.0.0:9000,并调整Nginx配置中fastcgi_pass指向正确的IP与端口。同时确保Nginx容器中/var/www/html权限正确,以避免访问问题。
              配置nginx容器和php容器协同工作成功,使用ip加端口的方式进行通信
              |
              9月前
              |
              应用服务中间件 网络安全 nginx
              配置Nginx以支持Websocket连接的方法。
              通过上述配置,Nginx将能够理解WebSocket协议的特殊要求,代理Websocket流量到合适的后端服务器。注意,Websocket并不是HTTP,尽管它最初是通过HTTP请求启动的连接升级,因此保证Nginx了解并能够妥善处理这种升级流程是关键。
              1918 10
              |
              8月前
              |
              Ubuntu 应用服务中间件 Linux
              在Ubuntu上配置Nginx实现开机自启功能
              至此,Nginx应该已经被正确地设置为开机自启。在Ubuntu中利用 `systemd`对服务进行管理是一种高效的方式,为系统管理员提供了强大的服务管理能力,包括但不限于启动、停止、重启服务,以及配置服务的开机自启动。通过这些简洁的命令,即使是对Linux不太熟悉的用户也能轻松地进行配置。
              379 0
              |
              10月前
              |
              安全 应用服务中间件 网络安全
              Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
              Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
              700 0
              Nginx SSL/TLS协议栈中配置深度解析与实践指南-优雅草卓伊凡
              |
              负载均衡 应用服务中间件 nginx
              |
              11月前
              |
              应用服务中间件 Linux 网络安全
              Centos 8.0中Nginx配置文件和https正书添加配置
              这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
              969 87
              |
              11月前
              |
              负载均衡 应用服务中间件 nginx
              Nginx配置与命令
              Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。
              992 14