Nginx常见的错误配置举例
Nginx是当前主流的Web服务。以下是一些最常见的错误配置。
Missingrootlocation
server{ root/etc/nginx; location/hello.txt{ try_files$uri$uri/=404; proxy_passhttp://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{ listen80default_server; server_name_; location/static{ alias/usr/share/nginx/static/; } location/api{ proxy_passhttp://apiserver/v1/; } }
借助Off-by-slash配置错误,由于缺少/,因此有可能沿路径上移一步。OrangeTsai在Blackhat的演讲“BreakingParserLogic!”中使这项技术广为人知。在本次演讲中,他展示了location指令与alias指令结合使用的缺失斜杠如何使读取Web应用程序的源代码成为可能。鲜为人知的是,它还可以与其他指令(例如proxy_pass)一起使用。让我们来分解一下正在发生的事情以及它为什么起作用。
location/api{ proxy_passhttp://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_passURL中,从而得到最终URLhttp://apiserver/v1//user。请注意,URL中存在双斜杠,因为location指令不以斜杠结尾,并且proxy_passURL路径以斜杠结尾。大多数Web服务器会将http://apiserver/v1//useruser标准化为http://apiserver/v1/user,这意味着即使配置错误,所有内容仍将按预期运行,并且可能不会引起注意。
通过请求http://server/api../可以利用这种错误配置,这将导致Nginx请求标准化为http://apiserver/v1/../的URLhttp://apiserver/。这可能产生的影响取决于利用这种错误配置可以达到的效果。例如,这可能导致Apache服务器状态通过URLhttp://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
Unsafevariableuse
一些框架、脚本和Nginx配置不安全地使用Nginx存储的变量。这可能会导致诸如XSS,绕过HttpOnly保护,信息泄露甚至在某些情况下甚至是RCE之类的问题。
SCRIPT_NAME
如下配置:
location~\.php${ includefastcgi_params; fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; fastcgi_pass127.0.0.1:9000; }
主要问题是Nginx会将所有URL发送到以.php结尾的PHP解释器,即使该文件在磁盘上不存在。这是Nginx创建的PitfallsandCommonMistakes文档中罗列的许多Nginx错误配置中的一种。
如果PHP脚本试图基于SCRIPT_NAME定义基本URL,则将发生XSS。
GET/index.php//index.php SCRIPT_NAME=/index.php//index.php
Usageof$uricanleadtoCRLFInjection
与Nginx变量有关的另一个错误配置是使用$uri或$document_uri而不是$request_uri。$uri和$document_uri包含标准化的URI,而Nginx中的标准化包括对URI进行解码的URL。Volema发现,在Nginx配置中创建重定向会导致CRLF注入时,通常使用$uri。
易受攻击的Nginx配置的示例如下:
location/{ return302https://example.com$uri; }
HTTP请求的新行字符为\r(回车)和\n(换行)。对新行字符进行URL编码将导致以下字符%0d%0a的表示形式。如果这些字符包含在对服务器的配置错误的请求(例如http://localhost/%0d%0aDetectify:%20clrf)中,则该服务器将使用名为Detectify的新标头进行响应,这是因为$uri变量包含URL解码后的换行字符。
HTTP/1.1302MovedTemporarily Server:nginx/1.19.3 Content-Type:text/html Content-Length:145 Connection:keep-alive Location:https://example.com/ Detectify:clrf
Anyvariable
在某些情况下,用户提供的数据可以视为Nginx变量。目前尚不清楚为什么会发生这种情况,但如本H1报告所示,这种情况并不罕见或不容易测试。如果搜索错误消息,我们可以看到它在SSIfiltermodule中找到,从而表明这是由于SSI引起的。
测试方法如下:
$curl-H‘Referer:bar'http://localhost/foo$http_referer|grep‘foobar'
Rawbackendresponsereading
使用Nginx的proxy_pass,可以拦截后端创建的错误和HTTP标头。如果要隐藏内部错误消息和标头,以便由Nginx处理,则这非常有用。如果后端响应一个请求,Nginx将自动提供一个自定义错误页面。但是,如果Nginx无法理解这是HTTP响应怎么办?
如果客户端向Nginx发送无效的HTTP请求,则该请求将按原样转发到后端,后端将使用其原始内容进行应答。然后,Nginx将无法理解无效的HTTP响应,而会将其转发给客户端。想象一下这样的uWSGI应用程序:
defapplication(environ,start_response): start_response('500Error',[('Content-Type', 'text/html'),('Secret-Header','secret-info')]) return[b"Secretinfo,shouldnotbevisible!"]
Nginx配置如下:
http{ error_page500/html/error.html; proxy_intercept_errorson; proxy_hide_headerSecret-Header; }
如果后端的响应状态大于300,proxy_intercept_errors将提供自定义响应。在上面的uWSGI应用程序中,我们将发送500错误,Nginx将拦截该错误。
proxy_hide_header:可以隐藏任何指定的来自客户端的HTTP标头。
如果我们发送普通的GET请求,则Nginx将返回:
HTTP/1.1500InternalServerError 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.1500Error Content-Type:text/html Secret-Header:secret-info Secretinfo,shouldnotbevisible!
merge_slashessettooff
默认情况下,merge_slashes指令设置为on,这是一种将两个或多个正斜杠压缩为一个的机制,因此///将变为/。如果Nginx用作反向代理,并且被代理的应用程序容易受到本地文件包含的影响,则在请求中使用额外的斜杠可能会留出利用空间。DannyRobinsonandRotemBar对此进行了详细描述。
以上就是Nginx常见的错误配置举例的详细内容,更多关于Nginx错误配置的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。