Cache Poisoning via URL discrepancies

HackTricks'i Destekleyin

Bu, cache proxy'leri ve web sunucuları arasındaki farklılıklardan yararlanarak cache zehirleme saldırıları gerçekleştirmek için önerilen tekniklerin bir özetidir https://portswigger.net/research/gotta-cache-em-all.

Bu saldırının amacı, cache sunucusunu statik bir kaynağın yüklendiğini düşündürmek ve böylece onu önbelleğe alırken, cache sunucusunun önbellek anahtarı olarak yolun bir kısmını saklamasıdır; ancak web sunucusu başka bir yolu çözümleyerek yanıt verir. Web sunucusu, dinamik bir sayfa yükleyecek gerçek yolu çözecektir (bu, kullanıcı hakkında hassas bilgiler, XSS gibi kötü niyetli bir yük veya örneğin saldırganın web sitesinden bir JS dosyası yüklemek için yönlendirme içerebilir).

Ayırıcılar

URL ayırıcıları, çerçeve ve sunucuya göre değişir ve isteklerin nasıl yönlendirildiğini ve yanıtların nasıl işlendiğini etkiler. Bazı yaygın köken ayırıcıları şunlardır:

  • Noktalı virgül: Spring'de matris değişkenleri için kullanılır (örneğin, /hello;var=a/world;var1=b;var2=c/hello/world).

  • Nokta: Ruby on Rails'de yanıt formatını belirtir (örneğin, /MyAccount.css/MyAccount).

  • Null Byte: OpenLiteSpeed'de yolları keser (örneğin, /MyAccount%00aaa/MyAccount).

  • Yeni satır baytı: Nginx'de URL bileşenlerini ayırır (örneğin, /users/MyAccount%0aaaa/account/MyAccount).

Bu süreçten sonra diğer özel ayırıcılar bulunabilir:

  • Adım 1: Önbelleğe alınamayan istekleri tanımlayın ve bunları potansiyel ayırıcıların nasıl işlendiğini izlemek için kullanın.

  • Adım 2: Yollara rastgele ekler ekleyin ve bir karakterin ayırıcı olarak işlev görüp görmediğini belirlemek için sunucunun yanıtını karşılaştırın.

  • Adım 3: Yanıtın değişip değişmediğini görmek için rastgele ekin önüne potansiyel ayırıcılar ekleyin; bu, ayırıcı kullanımını gösterir.

Normalizasyon & Kodlamalar

  • Amaç: Hem cache hem de köken sunucularındaki URL ayrıştırıcıları, uç nokta eşlemesi ve önbellek anahtarları için yolları çıkarmak üzere URL'leri normalize eder.

  • Süreç: Yol ayırıcılarını tanımlar, karakterleri çözerek ve nokta segmentlerini kaldırarak yolu çıkarır ve normalize eder.

Kodlamalar

Farklı HTTP sunucuları ve proxy'leri, Nginx, Node ve CloudFront gibi, ayırıcıları farklı şekilde çözer, bu da CDNs ve köken sunucuları arasında tutarsızlıklara yol açar. Örneğin, web sunucusu bu dönüşümü gerçekleştirirse /myAccount%3Fparam/myAccount?param ancak cache sunucusu anahtar olarak yolu /myAccount%3Fparam olarak saklarsa, bir tutarsızlık vardır.

Bu tutarsızlıkları kontrol etmenin bir yolu, yolu herhangi bir kodlama olmadan yükledikten sonra farklı karakterleri URL kodlayarak istekler göndermek ve kodlanmış yol yanıtının önbellek yanıtından gelip gelmediğini kontrol etmektir.

Nokta segmenti

Noktaların dahil olduğu yol normalizasyonu, cache zehirleme saldırıları için de oldukça ilginçtir. Örneğin, /static/../home/index veya /aaa..\home/index, bazı cache sunucuları bu yolları kendileri anahtar olarak önbelleğe alırken, diğerleri yolu çözebilir ve /home/index'i önbellek anahtarı olarak kullanabilir. Daha önce olduğu gibi, bu tür istekler göndermek ve yanıtın önbellekten toplanıp toplanmadığını kontrol etmek, /home/index'e verilen yanıtın, bu yollar istendiğinde gönderilen yanıt olup olmadığını belirlemeye yardımcı olur.

Statik Kaynaklar

Birçok cache sunucusu, yanıtı statik olarak tanımlanırsa her zaman önbelleğe alır. Bu, şu nedenlerden olabilir:

  • Uzantı: Cloudflare, aşağıdaki uzantılara sahip dosyaları her zaman önbelleğe alır: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx

  • Dinamik bir yanıtı önbelleğe almak için bir ayırıcı ve statik bir uzantı kullanarak zorlamak mümkündür; örneğin, /home$image.png isteği /home$image.png'i önbelleğe alacak ve köken sunucusu /home ile yanıt verecektir.

  • İyi bilinen statik dizinler: Aşağıdaki dizinler statik dosyalar içerir ve bu nedenle yanıtları önbelleğe alınmalıdır: /static, /assets, /wp-content, /media, /templates, /public, /shared

  • Bir ayırıcı, statik bir dizin ve noktalar kullanarak dinamik bir yanıtı önbelleğe almak mümkündür; örneğin, /home/..%2fstatic/something /static/something'i önbelleğe alacak ve yanıt /home olacaktır.

  • Statik dizinler + noktalar: /static/..%2Fhome veya /static/..%5Chome isteği olduğu gibi önbelleğe alınabilir, ancak yanıt /home olabilir.

  • Statik dosyalar: Bazı özel dosyalar her zaman önbelleğe alınır, örneğin /robots.txt, /favicon.ico ve /index.html. Bu, /home/..%2Frobots.txt gibi kötüye kullanılabilir; burada önbellek /robots.txt'i saklayabilir ve köken sunucusu /home'a yanıt verebilir.

HackTricks'i Destekleyin

Last updated