Nginx常见的错误配置举例

Nginx是当前主流的Web服务。 以下是一些最常见的错误配置。

Missing root location

server {
  root /etc/nginx;

  location /hello.txt {
    try_files $uri $uri/ =404;
    proxy_pass http://127.0.0.1:8080/;
  }
}

root指令指定Nginx的根目录。 在上面的示例中,根目录是/etc/nginx,这意味着我们可以访问该目录下的文件。 上面的配置没有/的位置(location / {...}),只有/hello.txt的位置。 因此,将对root指令进行全局设置,这意味着对/的请求会将您带到本地路径/etc/nginx。

GET /nginx.conf这样简单的请求将显示存储在/etc/nginx/nginx.conf中的Nginx配置文件的内容。 如果将根设置为/etc,则对/nginx/nginx.conf的GET请求将显示配置文件。 在某些情况下,可能会访问其他配置文件,访问日志甚至HTTP基本身份验证的加密凭据。

在我们收集的近50,000个Nginx配置文件中,最常见的根路径如下:

Off-By-Slash

server {
  listen 80 default_server;

  server_name _;

  location /static {
    alias /usr/share/nginx/static/;
  }

  location /api {
    proxy_pass http://apiserver/v1/;
  }
}

借助Off-by-slash配置错误,由于缺少/,因此有可能沿路径上移一步。 Orange Tsai在Blackhat的演讲“ Breaking Parser Logic!”中使这项技术广为人知。 在本次演讲中,他展示了location指令与alias指令结合使用的缺失斜杠如何使读取Web应用程序的源代码成为可能。 鲜为人知的是,它还可以与其他指令(例如proxy_pass)一起使用。 让我们来分解一下正在发生的事情以及它为什么起作用。

  location /api {
    proxy_pass http://apiserver/v1/;
  }

如果Nginx服务器可以访问以下配置,则可以假定只能访问http://apiserver/v1/下的路径。

http://server/api/user -> http://apiserver/v1//user

当请求http://server/api/user时,Nginx将首先规范化URL。 然后,它会查看前缀/api是否与URL匹配,在这种情况下,它与URL匹配。 然后,从URL中删除该前缀,因此保留/user路径。 然后将此路径添加到proxy_pass URL中,从而得到最终URL http://apiserver/v1//user。 请注意,URL中存在双斜杠,因为location指令不以斜杠结尾,并且proxy_pass URL路径以斜杠结尾。 大多数Web服务器会将http://apiserver/v1//user user标准化为http://apiserver/v1/user,这意味着即使配置错误,所有内容仍将按预期运行,并且可能不会引起注意。

通过请求http://server/api../可以利用这种错误配置,这将导致Nginx请求标准化为http://apiserver/v1/../的URL http://apiserver/。 这可能产生的影响取决于利用这种错误配置可以达到的效果。 例如,这可能导致Apache服务器状态通过URL http://server/api../server-status 公开,或者可能使不希望公开访问的路径可访问。

Nginx服务器配置错误的一个迹象是,当URL中的斜杠被删除时,服务器仍会返回相同的响应。 例如,如果http://server/api/user和http://server/apiuser返回相同的响应,则服务器可能容易受到攻击。 这将导致发送以下请求:

http://server/api/user -> http://apiserver/v1//user
http://server/apiuser -> http://apiserver/v1/user

Unsafe variable use

一些框架、脚本和Nginx配置不安全地使用Nginx存储的变量。 这可能会导致诸如XSS,绕过HttpOnly保护,信息泄露甚至在某些情况下甚至是RCE之类的问题。

SCRIPT_NAME

如下配置:

  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创建的Pitfalls and Common Mistakes文档中罗列的许多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.php
SCRIPT_NAME = /index.php/<script>alert(1)</script>/index.php

Usage of $uri can lead to CRLF Injection

与Nginx变量有关的另一个错误配置是使用$uri或$document_uri而不是$request_uri。 $uri和$document_uri包含标准化的URI,而Nginx中的标准化包括对URI进行解码的URL。 Volema 发现,在Nginx配置中创建重定向会导致CRLF注入时,通常使用$uri。

易受攻击的Nginx配置的示例如下:

location / {
 return 302 https://example.com$uri;
}

HTTP请求的新行字符为\r(回车)和\n(换行)。 对新行字符进行URL编码将导致以下字符%0d%0a的表示形式。 如果这些字符包含在对服务器的配置错误的请求(例如http://localhost/%0d%0aDetectify:%20clrf)中,则该服务器将使用名为Detectify的新标头进行响应,这是因为$uri变量包含URL解码后的换行字符。

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.19.3
Content-Type: text/html
Content-Length: 145
Connection: keep-alive
Location: https://example.com/
Detectify: clrf

Any variable

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

测试方法如下:

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

Raw backend response reading

使用Nginx的proxy_pass,可以拦截后端创建的错误和HTTP标头。 如果要隐藏内部错误消息和标头,以便由Nginx处理,则这非常有用。 如果后端响应一个请求,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错误,Nginx将拦截该错误。

proxy_hide_header:可以隐藏任何指定的来自客户端的HTTP标头。

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

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

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

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

我们将收到以下响应:

XTTP/1.1 500 Error
Content-Type: text/html
Secret-Header: secret-info

Secret info, should not be visible!

merge_slashes set to off

默认情况下,merge_slashes指令设置为on,这是一种将两个或多个正斜杠压缩为一个的机制,因此///将变为/。 如果Nginx用作反向代理,并且被代理的应用程序容易受到本地文件包含的影响,则在请求中使用额外的斜杠可能会留出利用空间。 Danny Robinson and Rotem Bar对此进行了详细描述。

以上就是Nginx常见的错误配置举例的详细内容,更多关于Nginx 错误配置的资料请关注我们其它相关文章!

(0)

相关推荐

  • 修改配置解决Nginx服务器中常见的上传与连接错误

    nginx上传错误413 Request Entity Too Large 默认情况下使用nginx反向代理上传超过2MB的文件,会报错413 Request Entity Too Large,解决这个方法很简单,修改配置client_max_body_size值即可 修改nginx.conf #cat /usr/local/nginx-1.7.0/conf/nginx.conf | grep client_max_body_size client_max_body_size 10M; 如果需要

  • NGINX服务器配置404错误页面转向的方法

    什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是NGINX服务器,那么404页面的内容则为:404 Not Found 为什么要自定义404页面 在访问时遇到上面这样的404错误页面,我想99%(未经调查,估计数据)的用户会把页面关掉,用户就这样悄悄的流失了.如果此时能有一个漂亮的页面能够引导用户去他想去的地方必然可以留住用户.因此,每一个网站都

  • Nginx服务器中414错误和504错误的配置解决方法

    414 Request-URI Too Large #客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区, #请求头总长度大于128k时使用large_client_header_buffers设置的缓存区 client_header_buffer_size 128k; #large_client_header_buffers 指令参数4为个数,128k为大小,默认是8k.申请4个128k. large_client_header_buffers 4 128k; 当http

  • Nginx worker_connections配置太低导致500错误案例

    最近一次安全培训,需要用到安全攻防平台,结果30几个人登录上去直接爆出500错误.不知道什么原因,后来找来SSH登录用户,密码,逐步排查,发现了Nginx worker_connections配置问题. 原来是Nginx配置文件中的worker_connections配置太低,只有50,导致与php-fpm交互过程中超出了connections限制,出现了500错误.直接将此参数的值改成10240就解决了此问题.

  • nginx缓存及错误页面配置

    本机缓存设置 浏览器缓存是为了提高加载速度,因此我们可以通过Nginx对静态文件进行缓存. location ~ ^/(images|javascript|js|css|flash|media|static)/ { #过期30天 expires 30d; } 定义错误提示页面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } 自动显示目录 location / { autoindex on; } 此

  • 实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法

    nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询. 在nginx中事情就变成了这样:nginx只对页面的访问做access记录日志.不会有php的error log 信息.nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog. 原因是php-fpm的配

  • Nginx服务器中配置404错误页面时一些值得注意的地方

    换了VPS之后的某一天,在Google管理员工具控制台下看到了大量的"软404"错误,查找了一些资料之后发现是自己在Nginx下配置404页面的方法不对才导致了错误的产生,在此记录一下Nginx下正确的404页面配置方法. 404是一个相应代码,表示"页面无法找到"(Page Not Found),Google关于"软404"给出的说法是: 复制代码 代码如下: Instead of returning a 404 response code f

  • NGINX下配置404错误页面的方法分享

    1. 创建自己的404.html页面 2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 3.更改nginx.conf(或单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件 ) 中在server 区域加入: error_page 404 = /404.html 或者 error_page 404 = http://www.xxx.com/404.html 4.更改后重启nginx,,测试nginx.co

  • nginx反向代理服务因配置文件错误导致访问资源时出现404

    最近测试手上的项目,出现访问服务器的资源出现404的错误,这个是不应该会出现的问题,因为在此之前经过测试是没问题,下面是详细情况: 1)公司的服务器都是做过nginx反向代理 2)访问路径是在tomcat中配置过虚拟路径 3)前几天服务器有做过磁盘恢复 当然如果你也遇到过这关问题,没解决的可以参考一下,如果解决了就看一下我的解决方案是否有问题,本人刚接触Nginx不深: 出现这个问题,我首先考虑应该是路径出现了问题,然后去修改tomcat中的配置文件server.xml中的虚拟路径:然后再测试,

  • Nginx常见的错误配置举例

    Nginx是当前主流的Web服务. 以下是一些最常见的错误配置. Missing root location server { root /etc/nginx; location /hello.txt { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080/; } } root指令指定Nginx的根目录. 在上面的示例中,根目录是/etc/nginx,这意味着我们可以访问该目录下的文件. 上面的配置没有/的位置(location

  • 详解linux中 Nginx 常见502错误问题解决办法

    常见的Nginx 502 Bad Gateway解决办法如下: Nginx 502错误情况1: 网站的访问量大,而php-cgi的进程数偏少. 针对这种情况的502错误,只需增加php-cgi的进程数.具体就是修改/usr/local/php/etc/php-fpm.conf 文件,将其中的max_children值适当增加.这个数据要依据你的VPS或独立服务器的配置进行设置.一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多. /usr/local/php/sbin/php-f

  • 聊聊配置 Nginx 访问与错误日志的问题

    目录 配置Nginx访问日志 配置错误日志 日志文件的位置 读取和理解Nginx日志文件 Nginx是一个开放源代码的高性能HTTP和反向代理服务器,负责处理Internet上某些最大站点的负载.在管理NGINX网络服务器时,你要执行的最常见任务之一就是检查日志文件. 在对服务器或应用程序问题进行故障排除时,知道如何配置和读取日志非常有用,因为它们提供了详细的调试信息. Nginx用两种类型的日志记录其事件:访问日志和错误日志.访问日志记录有关客户端请求的信息,错误日志记录有关服务器和应用程序问

  • 超实用的Nginx常见配置合集分享

    目录 封禁 IP 仅开放内网 负载均衡 列出文件列表 路由转发 开启 gzip 压缩 解决跨域 资源防盗链 Keepalived 提高吞吐量 HTTP 强制跳转 HTTPS 封禁 IP 通过 deny 可以封禁指定 IP http { # .... # 封禁IP deny 192.168.4.3; deny 31.42.145.0/24; deny 51.12.35.0/24; } 仅开放内网 需要先禁止 192.168.1.1 开放其他内网网段,然后禁止其他所有 IP location / {

  • Nginx的一些常用配置汇总

    目录 Nginx配置文件结构 Nginx日志切割 root 与 alias 使用GZIP压缩提升请求效率 location匹配规则解析 使用SwitchHosts模拟本地域名解析 Nginx跨域配置支持 Nginx防盗链支持 Nginx负载均衡 upstream指令参数 Keepalived 提高吞吐量 Nginx的缓存 Nginx的反向代理缓存 使用Nginx配置HTTPS域名证书 总结 Nginx配置文件结构 1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录

  • Nginx各个模块的配置及常用配置选项

    目录 Nginx Location配置 请求转发和重定向 Nginx静态文件配置 文件下载服务器 Nginx配置HTTPS Nginx日志配置 Nginx超时设置 请求超时设置 Proxy反向代理超时设置 Nginx负载均衡 轮询(默认) 权重(weight) ip_hash url_hash fair(第三方) Nginx与uWSGI服务器的沟通 小结 接下来,我们仔细分析下Nginx各个模块的配置选项.注意:http块也可以进一步分成3块,http全局块里的配置对所有站点生效,server块

  • nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)

    一.服务器基础配 置 远程链接服务器 ssh 用户名@公网ip 默认的用户名是root,假如公网 ip 是 a.b.c.d, 那链接命名就是 ssh root@a.b.c.d 下载安装基础库 yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim 关闭 iptables 查看iptables规则 iptables -L 或 iptables -t n

  • 权限问题导致Nginx 403 Forbidden错误的解决方法

    今天在一个新的环境上安装nginx,结果访问的都是403 通常显示403我立马都会想到路径配置不对,但我仔细看了一下,目录路径没问题: nginx.conf: 复制代码 代码如下: server {         listen       80;         server_name  localhost;           #charset koi8-r;           #access_log  logs/host.access.log  main;           locat

  • 详谈Linux开发中常见段错误问题的原因及分析

    1    使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因. 2    内存读/写越界.包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等. 3    对于C++对象,应该通过相应类的接口来去内存进行操作,禁止通过其返回的指针对内存进行写操

随机推荐