Proxy / WAF Protections Bypass

Техніки з цього дослідження.

Приклад правила Nginx:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

Щоб запобігти обхіду, Nginx виконує нормалізацію шляху перед перевіркою. Однак, якщо сервер backend виконує іншу нормалізацію (видаляючи символи, які не видаляє nginx), це може призвести до обхіду цієї захисту.

NodeJS - Express

Flask

Spring Boot

PHP-FPM

Конфігурація Nginx FPM:

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.

Як запобігти

location ~* ^/admin {
deny all;
}

Обхід Правил Mod Security

Плутанина Шляхів

У цьому пості пояснено, що 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

Неправильний Заголовок

У цьому дослідженні зазначено, що було можливо обійти правила AWS WAF, застосовані до HTTP-заголовків, надсилаючи "неправильний" заголовок, який не був належним чином розібраний AWS, але був розібраний сервером backend.

Наприклад, надсилаючи наступний запит зі впровадженням SQL-ін'єкції у заголовку X-Query:

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 це розумів (це було виправлено).

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated