# Proxy / WAF Protections Bypass {{#include ../banners/hacktricks-training.md}} ## Bypass Nginx ACL Rules with Pathname Manipulation Τεχνικές [από αυτή την έρευνα](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies). Παράδειγμα κανόνα Nginx: ```plaintext location = /admin { deny all; } location = /admin/ { deny all; } ``` Για να αποτραπούν οι παρακάμψεις, το Nginx εκτελεί κανονικοποίηση διαδρομής πριν από τον έλεγχο. Ωστόσο, αν ο διακομιστής backend εκτελεί διαφορετική κανονικοποίηση (αφαιρώντας χαρακτήρες που δεν αφαιρεί το nginx), μπορεί να είναι δυνατή η παράκαμψη αυτής της άμυνας. ### **NodeJS - Express** | Nginx Version | **Node.js Bypass Characters** | | ------------- | ----------------------------- | | 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 Version | **Flask Bypass Characters** | | ------------- | -------------------------------------------------------------- | | 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 Version | **Spring Boot Bypass Characters** | | ------------- | --------------------------------- | | 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; } ``` ## Bypass Mod Security Rules ### Path Confusion [**Σε αυτή την ανάρτηση**](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=` στο mod security θα υποθέσει ότι η διαδρομή είναι απλώς `/foo` επειδή το `%3f` μετατρέπεται σε `?` που τερματίζει τη διαδρομή URL, αλλά στην πραγματικότητα η διαδρομή που θα λάβει ο διακομιστής θα είναι `/foo%3f';alert(1);foo=`. Οι μεταβλητές `REQUEST_BASENAME` και `PATH_INFO` επηρεάστηκαν επίσης από αυτό το σφάλμα. Κάτι παρόμοιο συνέβη στην έκδοση 2 του Mod Security που επέτρεπε την παράκαμψη μιας προστασίας που εμπόδιζε τους χρήστες να προσπελάσουν αρχεία με συγκεκριμένες επεκτάσεις σχετικές με αρχεία αντιγράφων ασφαλείας (όπως `.bak`) απλά στέλνοντας την τελεία κωδικοποιημένη σε `%2e`, για παράδειγμα: `https://example.com/backup%2ebak`. ## Bypass AWS WAF ACL ### Malformed Header [Αυτή η έρευνα](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) αναφέρει ότι ήταν δυνατό να παρακαμφθούν οι κανόνες AWS WAF που εφαρμόζονταν σε HTTP headers στέλνοντας έναν "κακώς σχηματισμένο" header που δεν αναλύθηκε σωστά από την AWS αλλά αναλύθηκε από τον διακομιστή backend. Για παράδειγμα, στέλνοντας το ακόλουθο αίτημα με μια SQL injection στον header 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 το καταλάβαινε (αυτό διορθώθηκε). ## Γενικές παρακάμψεις WAF ### Όρια Μεγέθους Αιτήσεων Συνήθως, τα WAF έχουν ένα συγκεκριμένο όριο μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτό, το WAF δεν θα ελέγξει την αίτηση. - Για το AWS WAF, μπορείτε να [**ελέγξετε την τεκμηρίωση**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:**
Μέγιστο μέγεθος σώματος αίτησης ιστού που μπορεί να ελεγχθεί για προστασίες Application Load Balancer και AWS AppSync8 KB
Μέγιστο μέγεθος σώματος αίτησης ιστού που μπορεί να ελεγχθεί για προστασίες CloudFront, API Gateway, Amazon Cognito, App Runner και Verified Access**64 KB
- Από [**τα έγγραφα του Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:** Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από **128 KB** απενεργοποιώντας την επιθεώρηση σώματος αιτήσεων, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας το μέγιστο όριο σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους: Αν **λειτουργία πρόληψης**: Καταγράφει και μπλοκάρει την αίτηση.\ Αν **λειτουργία ανίχνευσης**: Ελέγχει μέχρι το όριο, αγνοεί το υπόλοιπο και καταγράφει αν το `Content-Length` υπερβαίνει το όριο. - Από [**Akamai**](https://community.akamai.com/customers/s/article/Can-WAF-inspect-all-arguments-and-values-in-request-body?language=en_US)**:** Από προεπιλογή, το WAF ελέγχει μόνο τα πρώτα 8KB μιας αίτησης. Μπορεί να αυξήσει το όριο έως 128KB προσθέτοντας Προηγμένα Μεταδεδομένα. - Από [**Cloudflare**](https://developers.cloudflare.com/ruleset-engine/rules-language/fields/#http-request-body-fields)**:** Έως 128KB. ### 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