目录
- Missing root location
- Off-By-Slash
- Unsafe variable use
- SCRIPT_NAME
- Usage of $uri can lead to CRLF Injection
- Any variable
- Raw backend response reading
- merge_slashes set to off
Missing root locationserver {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-Slashserver {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常见的错误配置举例】Nginx服务器配置错误的一个迹象是 , 当URL中的斜杠被删除时 , 服务器仍会返回相同的响应 。例如 , 如果http://server/api/user和http://server/apiuser返回相同的响应 , 则服务器可能容易受到攻击 。这将导致发送以下请求:
http://server/api/user -> http://apiserver/v1//userhttp://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 。
GET /index.php//index.phpSCRIPT_NAME = /index.php//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 TemporarilyServer: nginx/1.19.3Content-Type: text/htmlContent-Length: 145Connection: keep-aliveLocation: 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 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 set to off
默认情况下 ,
merge_slashes指令设置为on , 这是一种将两个或多个正斜杠压缩为一个的机制 , 因此///将变为/ 。如果Nginx用作反向代理 , 并且被代理的应用程序容易受到本地文件包含的影响 , 则在请求中使用额外的斜杠可能会留出利用空间 。Danny Robinson and Rotem Bar对此进行了详细描述 。以上就是Nginx常见的错误配置举例的详细内容 , 更多关于Nginx 错误配置的资料请关注考高分网其它相关文章!
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
