Cache Poisoning via URL discrepancies
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
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).
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.
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.
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.
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.
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.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)