17 KiB
Nginx
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一个网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或者 Telegram群组 或者关注我在Twitter上的🐦@carlospolopm.
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
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.conf
的GET
请求将显示配置文件。在某些情况下,可能会访问到其他配置文件、访问日志,甚至是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_pass
和internal
指令
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配置错误和漏洞。
参考资料
- https://blog.detectify.com/2020/11/10/common-nginx-misconfigurations/
- http://blog.zorinaq.com/nginx-resolver-vulns/
- https://github.com/yandex/gixy/issues/115
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 🎥
- Do you work in a cybersecurity company? Do you want to see your company advertised in HackTricks? or do you want to have access to the latest version of the PEASS or download HackTricks in PDF? Check the SUBSCRIPTION PLANS!
- Discover The PEASS Family, our collection of exclusive NFTs
- Get the official PEASS & HackTricks swag
- Join the 💬 Discord group or the telegram group or follow me on Twitter 🐦@carlospolopm.
- Share your hacking tricks by submitting PRs to the hacktricks repo and hacktricks-cloud repo.