Nginx 错误配置如果不能及时修正,它会让你的网站陷入网络攻击的风险。 作为互联网上最常用的 Web 服务器之一,Nginx 因轻巧、模块化并且有对用户友好的配置格式而广受欢迎。Detectify 使用 Google BigQuery 分析了从 GitHub 下载的近 50000 个不重复的 Nginx 配置文件。 本文主要关注以下常见的 Nginx 错误配置:
server { root /etc/nginx;
location /hello.txt { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080/; } } root 指令指定 Nginx 的根文件夹。在上面的示例中,根文件夹是 像 在我们收集的近 50000 个 Nginx 配置文件中,最常见的根路径如下: 经常配置错误的 Nginx 根路径
这个配置错误指的是由于缺少一个斜杠,所以有可能沿路径上移一步。OrangeTsai 在 Blackhat 演讲“Breaking Parser Logic!”中让这项技术广为人知。 https://i./us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf 在这个演讲中,他展示了如何结合一条缺少尾斜杠的 location /api { proxy_pass http://apiserver/v1/; } 如果一个 Nginx 服务器运行能在 server 访问的以下配置,则可以假定访问者只能访问 http://server/api/user -> http://apiserver/v1//user 当请求 然后,服务器从 URL 中删除该前缀,保留 请注意,这个 URL 中存在双斜杠,因为 location 指令不以单斜杠结尾,并且 Nginx 服务器配置错误的一个迹象是,当 URL 中的一个斜杠被删除时,服务器仍会返回相同的响应。例如,如果 http://server/api/user -> http://apiserver/v1//user http://server/apiuser -> http://apiserver/v1/user 一些框架、脚本和 Nginx 配置会不安全地使用 Nginx 存储的变量。这可能会导致诸如 XSS、绕过 HttpOnly 保护、信息泄露,甚至在某些情况下的 RCE 之类的问题。 像下面这样的配置: location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; } 主要问题是 Nginx 会将所有 URL 发送到以 https://www./resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php?fileGuid=xVX6hcx8WXCYPVGd 如果这个 PHP 脚本试图基于 <?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 与 Nginx 变量有关的另一个错误配置是使用 一个易受攻击的 Nginx 配置的示例如下: location / {return 302 https://$uri;} HTTP 请求的换行符为\r(回车)和\n(换行)。对换行符进行 URL 编码将导致以下字符表示形式 HTTP/1.1 302 Moved Temporarily Server: nginx/1.19.3 Content-Type: text/html Content-Length: 145 Connection: keep-alive Location: https:/// Detectify: clrf 在某些情况下,用户提供的数据可以视为 Nginx 变量。目前尚不清楚为什么会发生这种情况,但如这份 H1 报告所示,这种情况并不罕见或不容易测试。如果搜索错误消息,我们可以看到它是在 SSI 过滤器模块中找到的,表明这是由 SSI 引起的。 https:///reports/370094?fileGuid=xVX6hcx8WXCYPVGd 一种测试方法是设置一个引用标头值: $ curl -H 'Referer: bar’ http://localhost/foo$http_referer | grep 'foobar’ 我们扫描了这种错误配置,发现了几个实例,用户可以在其中打印 Nginx 变量的值。我们发现易受攻击实例的数量有所下降,这可能表明这个漏洞已经做了修补。 使用 Nginx 的 如果一个客户端向 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 应用程序中,我们将发送一个 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.1Host: 127.0.0.1Connection: close 我们将收到以下答复: XTTP/1.1 500 Error Content-Type: text/html Secret-Header: secret-info Secret info, should not be visible! 默认情况下,merge_slashes 指令设置为“on”,这是一种将两个或多个正斜杠压缩为一个的机制,因此 http:///en/docs/http/ngx_http_core_module.html#merge_slashes?fileGuid=xVX6hcx8WXCYPVGd 我们发现 33 个 Nginx 配置文件的 我们创建了一个 GitHub 存储库,你可以在其中使用 Docker 来设置你自己的易受攻击的 Nginx 测试服务器,以及本文中讨论的一些错误配置,然后尝试自己找到它们。 https://github.com/detectify/vulnerable-nginx?fileGuid=xVX6hcx8WXCYPVGd Nginx 是一个非常强大的 Web 服务器平台,很好理解为什么它会被广泛使用。但是,灵活的配置意味着你更容易犯错误,而这些错误可能会对安全性产生影响。请不要使用这些常见的错误配置,以免攻击者轻易地入侵你的网站。 原文链接: https://blog./2020/11/10/common-nginx-misconfigurations/?fileGuid=xVX6hcx8WXCYPVGd |
|