diff options
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbb8d6b --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# Минималистичный Web Application Firewall (WAF) на OpenResty + +UPDATE: добавлена работа со спецификой уязвимости PHP2Shell: + +1. Бан по Multipart-границам формы +2. Глубине вложенности JSON-структур +3. Странным параметрам PHPSESSID + +## Архитектура + +[ Входящий запрос ] + │ + ├──► 0. Белый список IP и Глобальный Бан-лист (L1/L2 кэш) + │ + ├──► 1. waf.detector (Эвристика заголовков, Smuggling и сессии) + │ + ├──► 2. waf.limits (Двухпороговый Token Bucket на POST-динамику) + │ + ├──► 3. waf.analyzer (Анализатор Query String URL на SQLi/LFI) + │ + └──► 4. waf.filter (Потоковый стриминг Multipart и JSON скобок) + +Структура файлов в репозитории: + +• example.lua — Пример реализации на фазе access_by_lua 7 уровня OSI (фаза блока http). +• waf/config.lua — Единая точка конфигурации лимитов, белых списков и штрафных матриц. +• waf/ban.lua — Двухуровневый кэш блокировок (Локальная L1 таблица воркера ➡️ L2 shared_dict). +• waf/detector.lua — Анализатор аномалий HTTP-заголовков и валидатор формата куки PHPSESSID. +• waf/limits.lua — Двухпороговый ограничитель частоты (Rate Limiter) для тяжелых POST-запросов. +• waf/analyzer.lua — Высокоскоростной чистильщик параметров URL-строки (ngx.var.args). +• waf/filter.lua — Низкоуровневый потоковый парсер сырого сокета тела запроса (Multipart и JSON). + +## Примеры использования + +1. На уровне location + +```http { + + lua_shared_dict banned_ips 10m; + lua_shared_dict limits 2m; + + map $http_user_agent $is_bot { + default 0; + ~*googlebot|yandex|bingbot|baiduspider|mail.ru_bot|ia_archiver|facebot|facebookexternalhit|twitterbot|://google.com|ahrefsbot|semrushbot|telegrambot|vkshare|whatsapp 1; + } + + server { + listen 443 ssl; + server_name test.ru; + server_tokens off; + + location ~* /(wp-content|wp-includes|wp-admin|wp-login\.php|xmlrpc\.php|\.git|\.env|vendor|phpmyadmin|adminer\.php|\.htaccess|config\.init) { + access_log off; + log_not_found off; + return 444; + } + + location / { + access_log off; + access_by_lua_file /home/example.lua; + } + } + +}``` + +2. На уровне server + +``` +http { + + lua_shared_dict banned_ips 10m; + lua_shared_dict limits 2m; + + map $http_user_agent $is_bot { + default 0; + ~*googlebot|yandex|bingbot|baiduspider|mail.ru_bot|ia_archiver|facebot|facebookexternalhit|twitterbot|://google.com|ahrefsbot|semrushbot|telegrambot|vkshare|whatsapp 1; + } + + server { + listen 443 ssl; + server_name test.ru; + access_by_lua_file /home/example.lua; + } +} + +``` |
