hacktricks/network-services-pentesting/pentesting-web/nginx.md

17 KiB
Raw Blame History

Nginx

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

DragonJAR Security Conference es un evento internacional de ciberseguridad con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:

{% embed url="https://www.dragonjarcon.org/" %}

缺少根位置

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.confGET请求将显示配置文件。在某些情况下可能会访问到其他配置文件、访问日志甚至是HTTP基本身份验证的加密凭据。

别名LFI配置错误

在Nginx配置中查找“location”语句如果有类似以下的内容

location /imgs {
alias /path/images/;
}

存在LFI漏洞的原因是

/imgs../flag.txt

Nginx

Nginx is a popular web server that is commonly used to serve static content, reverse proxy, and load balance web applications. It is known for its high performance, scalability, and ability to handle a large number of concurrent connections.

Configuration Files

Nginx uses configuration files to define how it should handle incoming requests. The main configuration file is typically located at /etc/nginx/nginx.conf and includes other configuration files from the /etc/nginx/conf.d/ directory.

Virtual Hosts

Nginx uses virtual hosts to serve multiple websites on a single server. Each virtual host has its own configuration file, typically located in the /etc/nginx/conf.d/ directory. Virtual hosts can be configured to listen on specific IP addresses and ports, and can also be configured with SSL/TLS certificates for secure connections.

Reverse Proxy

Nginx can be used as a reverse proxy to forward requests to backend servers. This is commonly used to load balance traffic across multiple servers or to proxy requests to application servers running on different ports.

To configure Nginx as a reverse proxy, you can use the proxy_pass directive in the Nginx configuration file. This directive specifies the backend server to forward requests to.

Load Balancing

Nginx can also be used as a load balancer to distribute incoming requests across multiple backend servers. This helps to distribute the load and improve the overall performance and availability of the web application.

Nginx supports various load balancing algorithms, such as round-robin, least connections, and IP hash. These algorithms determine how Nginx selects the backend server to forward each request to.

To configure Nginx as a load balancer, you can use the upstream and server directives in the Nginx configuration file. The upstream directive defines a group of backend servers, and the server directive specifies the IP address and port of each backend server.

Security Considerations

When configuring Nginx, it is important to consider security best practices to protect against common web application vulnerabilities. Some important security considerations include:

  • Enforcing secure communication using SSL/TLS certificates.
  • Implementing access controls to restrict access to sensitive resources.
  • Protecting against common web attacks, such as cross-site scripting (XSS) and SQL injection.
  • Regularly updating Nginx and its modules to patch security vulnerabilities.

By following these security best practices, you can help ensure that your Nginx server is secure and protected against potential threats.

/path/images/../flag.txt

正确的配置应该是:

location /imgs/ {
alias /path/images/;
}

所以如果你发现了一些Nginx服务器你应该检查这个漏洞。此外如果你发现文件/目录暴力破解的行为异常,也可能是这个漏洞。

更多信息:https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/

Accunetix测试

alias../ => HTTP status code 403
alias.../ => HTTP status code 404
alias../../ => HTTP status code 403
alias../../../../../../../../../../../ => HTTP status code 400
alias../ => HTTP status code 403

不安全的路径限制

查看以下页面以了解如何绕过诸如以下指令的限制:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

不安全的变量使用

一个易受攻击的 Nginx 配置示例是:

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

HTTP请求的换行符是\r回车和\n换行。对换行符进行URL编码会得到以下字符的表示%0d%0a。当这些字符包含在一个请求中例如http://localhost/%0d%0aDetectify:%20clrf发送到一个存在配置错误的服务器时,由于$uri变量包含URL解码的换行符服务器将会响应一个名为Detectify的新头部。

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

了解有关CRLF注入和响应拆分的风险请访问https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/

任何变量

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

测试这种情况的一种方法是设置一个referer头的值

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

我们扫描了这个配置错误并发现了几个用户可以打印Nginx变量值的实例。发现的易受攻击实例数量有所减少这可能表明已经修复了这个问题。

读取原始后端响应

使用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;
}

proxy_intercept_errors会在后端返回的响应状态码大于300时提供自定义响应。在上面的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 设置为 off

默认情况下,merge_slashes 指令被设置为 "on",这是一种将两个或多个正斜杠压缩为一个正斜杠的机制,因此 /// 将变为 /。如果 Nginx 用作反向代理,并且被代理的应用程序容易受到本地文件包含的攻击,那么在请求中使用额外的斜杠可能会为攻击留下漏洞。这一点由 Danny Robinson 和 Rotem Bar 详细描述。

我们发现了 33 个 Nginx 配置文件将 merge_slashes 设置为 "off"。

map 指令未指定默认值

看起来这是一种常见情况,当 map 用于某种授权控制 时。简化的示例可能如下所示:

http {
...
map $uri $mappocallow {
/map-poc/private 0;
/map-poc/secret 0;
/map-poc/public 1;
}
...
}
server {
...
location /map-poc {
if ($mappocallow = 0) {return 403;}
return 200 "Hello. It is private area: $mappocallow";
}
...
}

根据手册

默认值
如果源值与指定的变量都不匹配,则设置结果值。当未指定默认值时,结果值将为空字符串。

很容易忘记default值。因此,恶意用户可以绕过这个"授权控制",只需访问/map-poc中不存在的情况,比如https://targethost.com/map-poc/another-private-area

Nginx DNS欺骗

根据这篇文章:http://blog.zorinaq.com/nginx-resolver-vulns/,如果你知道Nginx使用的DNS服务器(并且你可以拦截通信),那么可能可以欺骗Nginx的DNS记录,所以如果使用的是127.0.0.1,则无效,并且知道它正在请求的域名

Nginx可以使用以下方式指定要使用的DNS服务器

resolver     8.8.8.8;

proxy_passinternal指令

proxy_pass指令可用于将请求内部重定向到其他服务器,无论是内部还是外部。
**internal**指令用于明确告知Nginx该位置只能在内部访问。

使用这些指令并不是一个漏洞,但你应该检查它们的配置方式

proxy_set_header Upgrade & Connection

如果nginx服务器配置为传递Upgrade和Connection头则可以执行h2c Smuggling攻击以访问受保护/内部的端点。

{% hint style="danger" %} 此漏洞将允许攻击者与proxy_pass端点(在本例中为http://backend:9999建立直接连接nginx不会检查其内容。 {% endhint %}

以下是一个易受攻击配置的示例,用于从此处窃取/flag

server {
listen       443 ssl;
server_name  localhost;

ssl_certificate       /usr/local/nginx/conf/cert.pem;
ssl_certificate_key   /usr/local/nginx/conf/privkey.pem;

location / {
proxy_pass http://backend:9999;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}

location /flag {
deny all;
}

{% hint style="warning" %} 请注意,即使proxy_pass指向特定的路径,例如http://backend:9999/socket.io,连接也将与http://backend:9999建立,因此您可以联系该内部端点中的任何其他路径。因此在proxy_pass的URL中指定路径并不重要。 {% endhint %}

亲自尝试

Detectify创建了一个GitHub存储库您可以使用Docker设置自己的易受攻击的Nginx测试服务器并尝试找到本文中讨论的一些配置错误

https://github.com/detectify/vulnerable-nginx

静态分析工具

GIXY

Gixy是一个用于分析Nginx配置的工具。Gixy的主要目标是防止安全配置错误并自动检测缺陷。

Nginxpwner

Nginxpwner是一个简单的工具用于查找常见的Nginx配置错误和漏洞。

参考资料

DragonJAR Security Conference es un evento internacional de ciberseguridad con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:

{% embed url="https://www.dragonjarcon.org/" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥