# Proxy / WAF Koruma Aşma {{#include ../banners/hacktricks-training.md}} ## Yolu Manipüle Ederek Nginx ACL Kurallarını Aşma Teknikler [bu araştırmadan](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies). Nginx kural örneği: ```plaintext location = /admin { deny all; } location = /admin/ { deny all; } ``` Nginx, atlatmaları önlemek için kontrol etmeden önce yol normalizasyonu yapar. Ancak, arka uç sunucusu farklı bir normalizasyon gerçekleştirirse (nginx'in kaldırmadığı karakterleri kaldırma gibi), bu savunmayı aşmak mümkün olabilir. ### **NodeJS - Express** | Nginx Versiyonu | **Node.js Atlatma Karakterleri** | | --------------- | --------------------------------- | | 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 Versiyonu | **Flask Atlatma Karakterleri** | | --------------- | --------------------------------------------------------------- | | 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 Versiyonu | **Spring Boot Atlatma Karakterleri** | | --------------- | ------------------------------------ | | 1.22.0 | `;` | | 1.21.6 | `;` | | 1.20.2 | `\x09`, `;` | | 1.18.0 | `\x09`, `;` | | 1.16.1 | `\x09`, `;` | ### **PHP-FPM** Nginx FPM yapılandırması: ```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` erişimini engelleyecek şekilde yapılandırılmıştır, ancak bu, `/admin.php/index.php` adresine erişerek aşılabilir. ### Nasıl önlenir ```plaintext location ~* ^/admin { deny all; } ``` ## Mod Security Kurallarını Bypass Etme ### Yol Karışıklığı [**Bu yazıda**](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) ModSecurity v3'ün (3.0.12'ye kadar) **`REQUEST_FILENAME`** değişkenini yanlış bir şekilde uyguladığı açıklanmaktadır; bu değişken erişilen yolu (parametrelerin başlangıcına kadar) içermesi gerekiyordu. Bunun nedeni, yolu almak için bir URL çözümlemesi yapmasıdır.\ Bu nedenle, mod güvenlikte `http://example.com/foo%3f';alert(1);foo=` gibi bir istek, yolun sadece `/foo` olduğunu varsayacaktır çünkü `%3f` `?`'ya dönüştürülerek URL yolunu sonlandırır, ancak aslında sunucunun alacağı yol `/foo%3f';alert(1);foo=` olacaktır. `REQUEST_BASENAME` ve `PATH_INFO` değişkenleri de bu hatadan etkilenmiştir. Mod Security'nin 2. versiyonunda benzer bir durum meydana gelmiş ve yedek dosyalarla ilgili belirli uzantılara sahip dosyalara erişimi engelleyen bir korumayı aşmayı mümkün kılmıştır (örneğin `.bak` gibi) sadece noktanın `%2e` olarak URL kodlanarak gönderilmesiyle, örneğin: `https://example.com/backup%2ebak`. ## AWS WAF ACL'yi Bypass Etme ### Bozuk Başlık [Bu araştırma](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies), AWS'nin düzgün bir şekilde ayrıştırmadığı ancak arka uç sunucusu tarafından ayrıştırılan "bozuk" bir başlık göndererek AWS WAF kurallarını aşmanın mümkün olduğunu belirtmektedir. Örneğin, X-Query başlığında bir SQL enjeksiyonu ile aşağıdaki isteği göndermek: ```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'ı atlatmak mümkündü çünkü bir sonraki satırın başlığın değeri olduğunu anlamıyordu, oysa NODEJS sunucusu bunu anlıyordu (bu düzeltildi). ## Genel WAF atlatmaları ### İstek Boyutu Sınırları Genellikle WAF'ların kontrol edeceği belirli bir istek uzunluğu sınırı vardır ve eğer bir POST/PUT/PATCH isteği bu sınırı aşarsa, WAF isteği kontrol etmez. - AWS WAF için, [**belgelere göz atabilirsiniz**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
Application Load Balancer ve AWS AppSync korumaları için incelenebilecek maksimum web istek gövde boyutu8 KB
CloudFront, API Gateway, Amazon Cognito, App Runner ve Verified Access korumaları için incelenebilecek maksimum web istek gövde boyutu**64 KB
- [**Azure belgelerinden**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:** Core Rule Set 3.1 (veya daha düşük) olan eski Web Uygulama Güvenlik Duvarları, istek gövde denetimini kapatarak **128 KB**'dan büyük mesajlara izin verir, ancak bu mesajlar güvenlik açıkları için kontrol edilmeyecektir. Daha yeni sürümler (Core Rule Set 3.2 veya daha yeni) için, maksimum istek gövde sınırını devre dışı bırakarak aynı şey yapılabilir. Bir istek boyut sınırını aşarsa: Eğer **önleme modu**: İsteği kaydeder ve engeller.\ Eğer **tespit modu**: Sınır kadar inceler, geri kalanını göz ardı eder ve `Content-Length` sınırı aşarsa kaydeder. - [**Akamai'den**](https://community.akamai.com/customers/s/article/Can-WAF-inspect-all-arguments-and-values-in-request-body?language=en_US)**:** Varsayılan olarak, WAF yalnızca bir isteğin ilk 8KB'sini inceler. Gelişmiş Meta Veriler ekleyerek sınırı 128KB'a kadar artırabilir. - [**Cloudflare'dan**](https://developers.cloudflare.com/ruleset-engine/rules-language/fields/#http-request-body-fields)**:** 128KB'a kadar. ### Obfuscation ```bash # IIS, ASP Clasic <%s%cr%u0131pt> == #changing the case of the tag < #prepending an additional "<" #using backticks instead of parenetheses java%0ascript:alert(1) #using encoded newline characters