mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
113 lines
7.2 KiB
Markdown
113 lines
7.2 KiB
Markdown
# Обхід правил ACL Nginx за допомогою маніпулювання шляхом <a href="#heading-pathname-manipulation-bypassing-reverse-proxies-and-load-balancers-security-rules" id="heading-pathname-manipulation-bypassing-reverse-proxies-and-load-balancers-security-rules"></a>
|
||
|
||
Техніки [з цього дослідження](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
|
||
|
||
Приклад правила Nginx:
|
||
```plaintext
|
||
location = /admin {
|
||
deny all;
|
||
}
|
||
|
||
location = /admin/ {
|
||
deny all;
|
||
}
|
||
```
|
||
Щоб запобігти обхіду, Nginx виконує нормалізацію шляху перед перевіркою. Однак, якщо сервер backend виконує іншу нормалізацію (видаляючи символи, які не видаляє nginx), це може призвести до обхіду цієї захисту.
|
||
|
||
### **NodeJS - Express**
|
||
|
||
| Версія Nginx | **Символи обходу Node.js** |
|
||
| ------------- | ----------------------------- |
|
||
| 1.22.0 | `\xA0` |
|
||
| 1.21.6 | `\xA0` |
|
||
| 1.20.2 | `\xA0`, `\x09`, `\x0C` |
|
||
| 1.18.0 | `\xA0`, `\x09`, `\x0C` |
|
||
| 1.16.1 | `\xA0`, `\x09`, `\x0C` |
|
||
|
||
### **Flask**
|
||
|
||
| Версія Nginx | **Символи обходу Flask** |
|
||
| ------------- | -------------------------------------------------------------- |
|
||
| 1.22.0 | `\x85`, `\xA0` |
|
||
| 1.21.6 | `\x85`, `\xA0` |
|
||
| 1.20.2 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||
| 1.18.0 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||
| 1.16.1 | `\x85`, `\xA0`, `\x1F`, `\x1E`, `\x1D`, `\x1C`, `\x0C`, `\x0B` |
|
||
|
||
### **Spring Boot**
|
||
|
||
| Версія Nginx | **Символи обходу Spring Boot** |
|
||
| ------------- | --------------------------------- |
|
||
| 1.22.0 | `;` |
|
||
| 1.21.6 | `;` |
|
||
| 1.20.2 | `\x09`, `;` |
|
||
| 1.18.0 | `\x09`, `;` |
|
||
| 1.16.1 | `\x09`, `;` |
|
||
|
||
### **PHP-FPM**
|
||
|
||
Конфігурація Nginx FPM:
|
||
```plaintext
|
||
location = /admin.php {
|
||
deny all;
|
||
}
|
||
|
||
location ~ \.php$ {
|
||
include snippets/fastcgi-php.conf;
|
||
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
|
||
}
|
||
```
|
||
Nginx налаштований на блокування доступу до `/admin.php`, але можна обійти це, звернувшись до `/admin.php/index.php`.
|
||
|
||
### Як запобігти
|
||
```plaintext
|
||
location ~* ^/admin {
|
||
deny all;
|
||
}
|
||
```
|
||
## Обхід Правил Mod Security <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
|
||
|
||
### Плутанина Шляхів
|
||
|
||
[**У цьому пості**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) пояснено, що ModSecurity v3 (до версії 3.0.12), **неправильно реалізував змінну `REQUEST_FILENAME`**, яка повинна була містити доступний шлях (до початку параметрів). Це тому, що він виконував URL-декодування, щоб отримати шлях.\
|
||
Отже, запит, подібний до `http://example.com/foo%3f';alert(1);foo=`, в ModSecurity припустить, що шлях - це просто `/foo`, оскільки `%3f` перетворюється в `?`, закінчуючи URL-шлях, але фактично шлях, який отримає сервер, буде `/foo%3f';alert(1);foo=`.
|
||
|
||
Змінні `REQUEST_BASENAME` та `PATH_INFO` також були пошкоджені цим багом.
|
||
|
||
Щось подібне трапилося в версії 2 Mod Security, що дозволяло обійти захист, який запобігав користувачам отримувати доступ до файлів з певними розширеннями, пов'язаними з резервними копіями файлів (наприклад, `.bak`), просто надсилаючи URL-кодований крапку у вигляді `%2e`, наприклад: `https://example.com/backup%2ebak`.
|
||
|
||
## Обхід AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
|
||
|
||
### Неправильний Заголовок
|
||
|
||
[У цьому дослідженні](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) зазначено, що було можливо обійти правила AWS WAF, застосовані до HTTP-заголовків, надсилаючи "неправильний" заголовок, який не був належним чином розібраний AWS, але був розібраний сервером backend.
|
||
|
||
Наприклад, надсилаючи наступний запит зі впровадженням SQL-ін'єкції у заголовку X-Query:
|
||
```http
|
||
GET / HTTP/1.1\r\n
|
||
Host: target.com\r\n
|
||
X-Query: Value\r\n
|
||
\t' or '1'='1' -- \r\n
|
||
Connection: close\r\n
|
||
\r\n
|
||
```
|
||
Було можливо обійти AWS WAF, оскільки він не розумів, що наступний рядок є частиною значення заголовка, тоді як сервер NODEJS це розумів (це було виправлено).
|
||
|
||
## Посилання
|
||
|
||
* [https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)
|
||
* [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass)
|
||
|
||
<details>
|
||
|
||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
Інші способи підтримки HackTricks:
|
||
|
||
* Якщо ви хочете побачити свою **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||
|
||
</details>
|