2022-05-08 23:13:03 +00:00
# Nginx
2022-04-28 16:01:33 +00:00
< details >
2023-08-03 19:12:22 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks云 ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 推特 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 YouTube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
* 你在一个**网络安全公司**工作吗? 你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组** ](https://discord.gg/hRep4RUj7f ) 或 [**Telegram群组** ](https://t.me/peass ) 或 **关注**我在**Twitter**上的[** 🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ) **提交PR来分享你的黑客技巧。**
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
< / details >
2022-04-28 16:01:33 +00:00
2023-06-10 23:31:32 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (1) (2) (4).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
[**DragonJAR Security Conference是一场国际网络安全活动** ](https://www.dragonjarcon.org/ ), 将于2023年9月7日至8日在哥伦比亚波哥大举行。这是一个内容丰富的技术活动, 展示了吸引全球黑客和研究人员的最新研究成果。\
立即在以下链接注册,不要错过这个重要的会议!:
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
{% embed url="https://www.dragonjarcon.org/" %}
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
## 缺少根位置 <a href="#missing-root-location" id="missing-root-location"></a>
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
server {
2023-08-03 19:12:22 +00:00
root /etc/nginx;
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
location /hello.txt {
try_files $uri $uri/ =404;
proxy_pass http://127.0.0.1:8080/;
}
2020-12-30 09:35:46 +00:00
}
```
2023-08-03 19:12:22 +00:00
`root` 指令指定了Nginx的根文件夹。在上面的例子中, 根文件夹是`/etc/nginx`,这意味着我们可以访问该文件夹中的文件。上面的配置没有针对`/ (location / {...})`的位置,只有针对`/hello.txt`的位置。因此,`root`指令将被全局设置,这意味着对`/`的请求将带您到本地路径`/etc/nginx`。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
一个简单的请求,比如`GET /nginx.conf`,将显示存储在`/etc/nginx/nginx.conf`中的Nginx配置文件的内容。如果根目录设置为`/etc`,对`/nginx/nginx.conf`的`GET`请求将显示配置文件。在某些情况下, 可能可以访问其他配置文件、访问日志甚至加密的HTTP基本身份验证凭据。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
## 别名LFI配置错误 <a href="#alias-lfi-misconfiguration" id="alias-lfi-misconfiguration"></a>
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
在Nginx配置中查找"location"语句,如果有类似以下的语句:
2021-10-18 11:21:18 +00:00
```
2023-08-03 19:12:22 +00:00
location /imgs {
alias /path/images/;
2020-07-15 15:43:14 +00:00
}
```
2023-08-03 19:12:22 +00:00
因为存在LFI漏洞, 原因如下:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
/imgs../flag.txt
```
2023-08-03 19:12:22 +00:00
以下是一本关于黑客技术的书籍中关于黑客技术的内容。以下内容来自文件/hive/hacktricks/network-services-pentesting/pentesting-web/nginx.md。将相关的英文文本翻译成中文, 并保持完全相同的markdown和html语法。不要翻译代码、黑客技术名称、黑客术语、云/SaaS平台名称( 如Workspace、aws、gcp...) 、泄漏一词、渗透测试和markdown标签。此外, 请不要添加任何额外的内容, 只需翻译和markdown语法。
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
/path/images/../flag.txt
```
2023-08-03 19:12:22 +00:00
正确的配置应该是:
2021-10-18 11:21:18 +00:00
```
2023-08-03 19:12:22 +00:00
location /imgs/ {
alias /path/images/;
2020-07-15 15:43:14 +00:00
}
```
2023-08-03 19:12:22 +00:00
**所以, 如果你发现了一些Nginx服务器, 你应该检查这个漏洞。此外, 如果你发现文件/目录暴力破解的行为异常,也可能是这个漏洞。**
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
更多信息:[https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/](https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/)
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
Accunetix测试:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
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
```
2023-08-03 19:12:22 +00:00
## 不安全的变量使用 <a href="#unsafe-variable-use" id="unsafe-variable-use"></a>
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
一个易受攻击的Nginx配置示例是:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
location / {
2023-08-03 19:12:22 +00:00
return 302 https://example.com$uri;
2020-12-30 09:35:46 +00:00
}
```
2023-08-03 19:12:22 +00:00
HTTP请求的换行符是\r( 回车) 和\n( 换行) 。对换行符进行URL编码会得到以下字符的表示: %0d%0a。当这些字符包含在一个请求中, 例如`http://localhost/%0d%0aDetectify:%20clrf`发送到一个存在配置错误的服务器时,由于$uri变量包含URL解码的换行符, 服务器将会响应一个名为`Detectify`的新头部。
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
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
```
2023-08-03 19:12:22 +00:00
了解CRLF注入和响应拆分的风险, 请访问[https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/](https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/)。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
### 任意变量
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
在某些情况下, 用户提供的数据可以被视为Nginx变量。目前尚不清楚为什么会发生这种情况, 但这并不罕见, 也不容易测试, 正如在这份[H1报告](https://hackerone.com/reports/370094)中所示。如果我们搜索错误消息,可以看到它在[SSI过滤模块](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx\_http\_ssi\_filter\_module.c#L365)中找到, 因此揭示了这是由SSI引起的。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
测试这种情况的一种方法是设置一个referer头的值:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
$ curl -H ‘ Referer: bar’ http://localhost/foo$http_referer | grep ‘ foobar’
```
2023-08-03 19:12:22 +00:00
我们扫描了这个配置错误, 并发现了几个用户可以打印Nginx变量值的实例。发现的易受攻击实例数量有所减少, 这可能表明已经修复了这个问题。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
## 读取原始后端响应
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
使用Nginx的`proxy_pass`, 有可能拦截由后端创建的错误和HTTP头。如果您想隐藏内部错误消息和头部, 以便由Nginx处理, 这非常有用。如果后端返回自定义错误页面, Nginx将自动提供该页面。但是, 如果Nginx无法理解它是一个HTTP响应呢?
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
如果客户端向Nginx发送无效的HTTP请求, 该请求将原样转发给后端, 后端将以其原始内容回答。然后, Nginx将无法理解无效的HTTP响应, 只会将其转发给客户端。想象一个像这样的uWSGI应用程序:
2022-04-11 23:27:21 +00:00
```python
2020-12-30 09:35:46 +00:00
def application(environ, start_response):
2023-08-03 19:12:22 +00:00
start_response('500 Error', [('Content-Type',
2020-12-30 09:35:46 +00:00
'text/html'),('Secret-Header','secret-info')])
2023-08-03 19:12:22 +00:00
return [b"Secret info, should not be visible!"]
2020-12-30 09:35:46 +00:00
```
2023-08-03 19:12:22 +00:00
而且使用以下指令在Nginx中:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
http {
2023-08-03 19:12:22 +00:00
error_page 500 /html/error.html;
proxy_intercept_errors on;
proxy_hide_header Secret-Header;
2020-12-30 09:35:46 +00:00
}
```
2023-08-03 19:12:22 +00:00
[proxy\_intercept\_errors ](http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html#proxy\_intercept\_errors )会在后端返回的响应状态码大于300时提供自定义响应。在上面的uWSGI应用中, 我们将发送一个`500错误`, 这将被Nginx拦截。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
[proxy\_hide\_header ](http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html#proxy\_hide\_header )非常直观, 它将隐藏客户端中指定的任何HTTP头。
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
如果我们发送一个普通的`GET`请求, Nginx将返回:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Content-Type: text/html
Content-Length: 34
Connection: close
```
2023-08-03 19:12:22 +00:00
但是如果我们发送一个无效的HTTP请求, 比如:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
GET /? XTTP/1.1
Host: 127.0.0.1
Connection: close
```
2023-08-03 19:12:22 +00:00
我们将得到以下响应:
2021-10-18 11:21:18 +00:00
```
2020-12-30 09:35:46 +00:00
XTTP/1.1 500 Error
Content-Type: text/html
Secret-Header: secret-info
Secret info, should not be visible!
```
2023-08-03 19:12:22 +00:00
## merge\_slashes 设置为 off
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
[merge\_slashes ](http://nginx.org/en/docs/http/ngx\_http\_core\_module.html#merge\_slashes ) 指令默认设置为 "on",它是一种将两个或多个正斜杠压缩为一个正斜杠的机制,因此 `///` 将变为 `/` 。如果 Nginx 用作反向代理,并且被代理的应用程序容易受到本地文件包含的攻击,那么在请求中使用额外的斜杠可能会为攻击留下漏洞。这一点由 [Danny Robinson 和 Rotem Bar ](https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d ) 详细描述。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
我们发现了 33 个 Nginx 配置文件将 `merge_slashes` 设置为 "off"。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
## map 指令未指定默认值
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
这似乎是一种常见情况,当 ** `map` 用于某种授权控制** 时。简化的示例可能如下所示:
2022-04-11 23:27:21 +00:00
```
http {
...
2023-08-03 19:12:22 +00:00
map $uri $mappocallow {
/map-poc/private 0;
/map-poc/secret 0;
/map-poc/public 1;
}
2022-04-11 23:27:21 +00:00
...
}
```
```
server {
...
2023-08-03 19:12:22 +00:00
location /map-poc {
if ($mappocallow = 0) {return 403;}
return 200 "Hello. It is private area: $mappocallow";
}
2022-04-11 23:27:21 +00:00
...
}
```
2023-08-03 19:12:22 +00:00
[根据手册 ](https://nginx.org/en/docs/http/ngx\_http\_map\_module.html ):
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
> 默认值\
> 如果源值与指定的变量都不匹配,则设置结果值。当未指定默认值时,默认的结果值将为空字符串。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
很容易忘记 `default` 值。所以**恶意用户可以绕过这个 "授权控制"**,只需访问 `/map-poc` 中不存在的情况,比如 `https://targethost.com/map-poc/another-private-area` 。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
## Nginx DNS欺骗
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
根据这篇文章:[http://blog.zorinaq.com/nginx-resol**ver-vulns/**](http://blog.zorinaq.com/nginx-resolver-vulns/),如果你**知道Nginx使用的DNS服务器**(并且你可以拦截通信),那么**可能可以欺骗Nginx的DNS记录**,所以如果使用的是**127.0.0.1**,则无效,并且知道它正在请求的**域名**。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
Nginx可以使用以下方式指定要使用的DNS服务器:
2022-04-11 23:27:21 +00:00
```
resolver 8.8.8.8;
```
2023-08-03 19:12:22 +00:00
## `proxy_pass`和`internal`指令
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
**`proxy_pass`**指令可用于将内部请求重定向到其他服务器,无论是内部还是外部。\
**`internal`**指令用于明确告知Nginx该位置只能在内部访问。
2022-04-11 23:27:21 +00:00
2023-08-03 19:12:22 +00:00
使用这些指令**并不是一个漏洞,但你应该检查它们的配置方式**。
2020-12-30 09:35:46 +00:00
2022-06-19 13:37:58 +00:00
## proxy\_set\_header Upgrade & Connection
2023-08-03 19:12:22 +00:00
如果nginx服务器配置为传递Upgrade和Connection头, 则可以执行[h2c Smuggling攻击](../../pentesting-web/h2c-smuggling.md)以访问受保护/内部的端点。
2022-06-19 13:37:58 +00:00
{% hint style="danger" %}
2023-08-03 19:12:22 +00:00
此漏洞将允许攻击者与`proxy_pass`端点(在本例中为`http://backend:9999`) 建立直接连接, nginx不会检查其内容。
2022-06-19 13:37:58 +00:00
{% endhint %}
2023-08-03 19:12:22 +00:00
以下是一个易受攻击配置的示例,用于从[此处](https://bishopfox.com/blog/h2c-smuggling-request)窃取`/flag`:
2022-06-19 13:37:58 +00:00
```
server {
2023-08-03 19:12:22 +00:00
listen 443 ssl;
server_name localhost;
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/privkey.pem;
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
location / {
proxy_pass http://backend:9999;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
location /flag {
deny all;
}
2022-06-19 13:37:58 +00:00
```
{% hint style="warning" %}
2023-08-03 19:12:22 +00:00
请注意,即使`proxy_pass`指向特定的**路径**,例如`http://backend:9999/socket.io`,连接也将与`http://backend:9999`建立,因此您可以**在该内部端点内联系任何其他路径。因此, 在proxy\_pass的URL中指定路径并不重要。**
2022-06-19 13:37:58 +00:00
{% endhint %}
2023-08-03 19:12:22 +00:00
## 亲自尝试
2020-12-30 09:35:46 +00:00
2023-08-03 19:12:22 +00:00
Detectify创建了一个GitHub存储库, 您可以使用Docker设置自己的易受攻击的Nginx测试服务器, 并尝试找到本文中讨论的一些配置错误!
2020-12-30 09:35:46 +00:00
[https://github.com/detectify/vulnerable-nginx ](https://github.com/detectify/vulnerable-nginx )
2023-08-03 19:12:22 +00:00
## 静态分析工具
2020-07-15 15:43:14 +00:00
2022-05-08 23:13:03 +00:00
### [GIXY](https://github.com/yandex/gixy)
2020-07-15 15:43:14 +00:00
2023-08-03 19:12:22 +00:00
Gixy是一个用于分析Nginx配置的工具。Gixy的主要目标是防止安全配置错误并自动检测缺陷。
2022-04-11 23:27:21 +00:00
2022-07-24 19:52:09 +00:00
### [Nginxpwner](https://github.com/stark0de/nginxpwner)
2023-08-03 19:12:22 +00:00
Nginxpwner是一个简单的工具, 用于查找常见的Nginx配置错误和漏洞。
2022-07-24 19:52:09 +00:00
2023-08-03 19:12:22 +00:00
## 参考资料
2022-04-11 23:27:21 +00:00
2022-05-08 23:13:03 +00:00
* [**https://blog.detectify.com/2020/11/10/common-nginx-misconfigurations/** ](https://blog.detectify.com/2020/11/10/common-nginx-misconfigurations/ )
* [**http://blog.zorinaq.com/nginx-resolver-vulns/** ](http://blog.zorinaq.com/nginx-resolver-vulns/ )
* [**https://github.com/yandex/gixy/issues/115** ](https://github.com/yandex/gixy/issues/115 )
2022-04-28 16:01:33 +00:00
2023-06-10 23:31:32 +00:00
< figure > < img src = "../../.gitbook/assets/image (1) (1) (2) (4).png" alt = "" > < figcaption > < / figcaption > < / figure >
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
[**DragonJAR Security Conference es un evento internacional de ciberseguridad** ](https://www.dragonjarcon.org/ ) 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!:
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
{% embed url="https://www.dragonjarcon.org/" %}
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
< details >
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-04-30 21:54:03 +00:00
* 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** ](https://github.com/sponsors/carlospolop )!
* Discover [**The PEASS Family** ](https://opensea.io/collection/the-peass-family ), our collection of exclusive [**NFTs** ](https://opensea.io/collection/the-peass-family )
* Get the [**official PEASS & HackTricks swag** ](https://peass.creator-spring.com )
* **Join the** [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discord group** ](https://discord.gg/hRep4RUj7f ) or the [**telegram group** ](https://t.me/peass ) or **follow** me on **Twitter** [**🐦** ](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md )[**@carlospolopm** ](https://twitter.com/hacktricks\_live )**.**
* **Share your hacking tricks by submitting PRs to the** [**hacktricks repo** ](https://github.com/carlospolop/hacktricks ) **and** [**hacktricks-cloud repo** ](https://github.com/carlospolop/hacktricks-cloud ).
2022-04-28 16:01:33 +00:00
< / details >