Content Security Policy (CSP) Bypass
Last updated
Last updated
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)
Deneyimli hackerlar ve bug bounty avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!
Hacking İçgörüleri Hacking'in heyecanı ve zorluklarına dalan içeriklerle etkileşimde bulunun
Gerçek Zamanlı Hack Haberleri Gerçek zamanlı haberler ve içgörülerle hızlı tempolu hacking dünyasında güncel kalın
Son Duyurular Yeni başlayan bug bounty'ler ve önemli platform güncellemeleri hakkında bilgi sahibi olun
Bugün Discord üzerinden bize katılın ve en iyi hackerlarla işbirliği yapmaya başlayın!
Content Security Policy (CSP), esasen cross-site scripting (XSS) gibi saldırılara karşı koruma sağlamak amacıyla tanınan bir tarayıcı teknolojisidir. Tarayıcı tarafından güvenli bir şekilde yüklenebilecek kaynakların yollarını ve kaynaklarını tanımlayarak çalışır. Bu kaynaklar, resimler, çerçeveler ve JavaScript gibi çeşitli öğeleri kapsar. Örneğin, bir politika, aynı alan adından (self) kaynakların yüklenmesine ve çalıştırılmasına izin verebilir; bu, inline kaynakları ve eval
, setTimeout
veya setInterval
gibi fonksiyonlar aracılığıyla string kodunun çalıştırılmasını içerir.
CSP'nin uygulanması, yanıt başlıkları aracılığıyla veya HTML sayfasına meta öğeleri ekleyerek gerçekleştirilir. Bu politikayı izleyerek, tarayıcılar bu şartları proaktif bir şekilde uygular ve tespit edilen ihlalleri hemen engeller.
Yanıt başlığı aracılığıyla uygulanmıştır:
Meta etiketi aracılığıyla uygulandı:
CSP, bu başlıklar kullanılarak zorlanabilir veya izlenebilir:
Content-Security-Policy
: CSP'yi zorlar; tarayıcı herhangi bir ihlali engeller.
Content-Security-Policy-Report-Only
: İzleme için kullanılır; ihlalleri engellemeden raporlar. Ön üretim ortamlarında test etmek için idealdir.
CSP, hem aktif hem de pasif içeriğin yüklenmesi için kökenleri kısıtlar, inline JavaScript yürütmesi ve eval()
kullanımı gibi yönleri kontrol eder. Bir örnek politika:
script-src: JavaScript için belirli kaynaklara izin verir, URL'ler, satır içi scriptler ve olay işleyicileri veya XSLT stilleri tarafından tetiklenen scriptler dahil.
default-src: Belirli fetch direktifleri yoksa kaynakları almak için varsayılan bir politika belirler.
child-src: Web işçileri ve gömülü çerçeve içerikleri için izin verilen kaynakları belirtir.
connect-src: fetch, WebSocket, XMLHttpRequest gibi arayüzler kullanılarak yüklenebilecek URL'leri kısıtlar.
frame-src: Çerçeveler için URL'leri kısıtlar.
frame-ancestors: Geçerli sayfayı gömebilecek kaynakları belirtir, <frame>
, <iframe>
, <object>
, <embed>
ve <applet>
gibi öğelere uygulanır.
img-src: Resimler için izin verilen kaynakları tanımlar.
font-src: @font-face
kullanılarak yüklenen fontlar için geçerli kaynakları belirtir.
manifest-src: Uygulama manifest dosyalarının izin verilen kaynaklarını tanımlar.
media-src: Medya nesnelerini yüklemek için izin verilen kaynakları tanımlar.
object-src: <object>
, <embed>
ve <applet>
öğeleri için izin verilen kaynakları tanımlar.
base-uri: <base>
öğeleri kullanarak yüklenebilecek izin verilen URL'leri belirtir.
form-action: Form gönderimleri için geçerli uç noktaları listeler.
plugin-types: Bir sayfanın çağırabileceği mime türlerini kısıtlar.
upgrade-insecure-requests: Tarayıcılara HTTP URL'lerini HTTPS olarak yeniden yazmalarını talimat verir.
sandbox: <iframe>
'in sandbox niteliğine benzer kısıtlamalar uygular.
report-to: Politika ihlal edilirse bir raporun gönderileceği grubu belirtir.
worker-src: Worker, SharedWorker veya ServiceWorker scriptleri için geçerli kaynakları belirtir.
prefetch-src: Alınacak veya önceden alınacak kaynaklar için geçerli kaynakları belirtir.
navigate-to: Bir belgenin herhangi bir şekilde (a, form, window.location, window.open, vb.) gidebileceği URL'leri kısıtlar.
*
: data:
, blob:
, filesystem:
şemaları dışındaki tüm URL'lere izin verir.
'self'
: Aynı alan adından yüklemeye izin verir.
'data'
: Veriler şeması aracılığıyla kaynakların yüklenmesine izin verir (örneğin, Base64 kodlu resimler).
'none'
: Herhangi bir kaynaktan yüklemeyi engeller.
'unsafe-eval'
: eval()
ve benzeri yöntemlerin kullanılmasına izin verir, güvenlik nedenleriyle önerilmez.
'unsafe-hashes'
: Belirli satır içi olay işleyicilerini etkinleştirir.
'unsafe-inline'
: Satır içi <script>
veya <style>
gibi satır içi kaynakların kullanılmasına izin verir, güvenlik nedenleriyle önerilmez.
'nonce'
: Kriptografik bir nonce (bir kez kullanılan sayı) kullanarak belirli satır içi scriptler için bir beyaz liste.
JS sınırlı yürütme varsa, sayfa içinde kullanılan bir nonce almak mümkündür doc.defaultView.top.document.querySelector("[nonce]")
ile ve ardından kötü niyetli bir script yüklemek için yeniden kullanılabilir (strict-dynamic kullanılıyorsa, herhangi bir izin verilen kaynak yeni kaynaklar yükleyebilir, bu nedenle bu gerekli değildir), örneğin:
'sha256-<hash>'
: Belirli bir sha256 hash'ine sahip scriptleri beyaz listeye alır.
'strict-dynamic'
: Bir nonce veya hash ile beyaz listeye alındıysa, herhangi bir kaynaktan script yüklenmesine izin verir.
'host'
: example.com
gibi belirli bir hostu belirtir.
https:
: URL'leri yalnızca HTTPS kullananlarla kısıtlar.
blob:
: Kaynakların Blob URL'lerinden (örneğin, JavaScript ile oluşturulan Blob URL'leri) yüklenmesine izin verir.
filesystem:
: Kaynakların dosya sisteminden yüklenmesine izin verir.
'report-sample'
: İhlal raporunda ihlal eden kodun bir örneğini içerir (hata ayıklama için yararlıdır).
'strict-origin'
: 'self' ile benzer ancak kaynakların protokol güvenlik seviyesinin belgeyle eşleşmesini sağlar (yalnızca güvenli kökenler güvenli kökenlerden kaynak yükleyebilir).
'strict-origin-when-cross-origin'
: Aynı köken istekleri yaparken tam URL'leri gönderir, ancak istek çapraz köken olduğunda yalnızca kökeni gönderir.
'unsafe-allow-redirects'
: Hemen başka bir kaynağa yönlendirecek kaynakların yüklenmesine izin verir. Güvenliği zayıflattığı için önerilmez.
Çalışan yük: "/><script>alert(1);</script>
Bu çalışmıyor, daha fazla bilgi için bunu kontrol et.
Çalışan yük:
Eğer bir şekilde izin verilen JS kodu, DOM'da yeni bir script etiketi oluşturabiliyorsa ve bu izin verilen script onu oluşturuyorsa, yeni script etiketi çalıştırılmaya izin verilecektir.
Çalışan yük:
Görünüşe göre bu artık çalışmıyor
Çalışan yükler:
Eğer bir JS dosyası yükleyebiliyorsanız, bu CSP'yi atlayabilirsiniz:
Çalışan yük:
Ancak, sunucunun yüklenen dosyayı doğrulama olasılığı yüksektir ve yalnızca belirli türde dosyaların yüklenmesine izin verecektir.
Ayrıca, sunucu tarafından kabul edilen bir uzantı kullanarak bir dosya içinde JS kodu yükleyebilseniz bile (örneğin: script.png), bu yeterli olmayacaktır çünkü bazı sunucular, apache sunucusu gibi, dosyanın MIME türünü uzantıya göre seçer ve Chrome gibi tarayıcılar, bir görüntü olması gereken bir şeyin içinde Javascript kodunu çalıştırmayı reddeder. "Umarım", hatalar vardır. Örneğin, bir CTF'den öğrendiğim kadarıyla Apache, .wave uzantısını bilmez, bu nedenle onu MIME türü olarak audio/ ile sunmaz.
Buradan, bir XSS ve dosya yüklemesi bulursanız ve yanlış yorumlanan bir uzantı bulmayı başarırsanız, o uzantıyla bir dosya yüklemeyi ve script'in içeriğini denemek isteyebilirsiniz. Ya da, sunucu yüklenen dosyanın doğru formatını kontrol ediyorsa, bir polyglot oluşturabilirsiniz (bazı polyglot örnekleri burada).
JS enjekte etmek mümkün değilse, örneğin kimlik bilgilerini bir form eylemi enjekte ederek dışarı sızdırmayı deneyebilirsiniz (ve belki şifre yöneticilerinin şifreleri otomatik doldurmasını bekleyebilirsiniz). Bu raporda bir örnek bulabilirsiniz. Ayrıca, default-src
'nin form eylemlerini kapsamadığını unutmayın.
Aşağıdaki bazı yükler için unsafe-eval
bile gerekli değildir.
Bir açık sürümünü yükleyin angular ve keyfi JS çalıştırın:
window
nesnesini döndüren fonksiyonlar içeren bir kütüphane kullanarak Payload'lar (bu yazıya göz atın):Yazı, cdn.cloudflare.com
(veya başka bir izin verilen JS kütüphaneleri deposu) üzerinden tüm kütüphaneleri yükleyebileceğinizi, her kütüphaneden eklenen tüm fonksiyonları çalıştırabileceğinizi ve hangi kütüphanelerden hangi fonksiyonların window
nesnesini döndürdüğünü kontrol edebileceğinizi gösteriyor.
Angular XSS bir sınıf adından:
bu CTF yazısına göre, CSP içinde https://www.google.com/recaptcha/ kullanarak CSP'yi atlayarak rastgele JS kodu çalıştırabilirsiniz: