Content Security Policy (CSP) Bypass
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!
Hacking Einblicke Engagieren Sie sich mit Inhalten, die in den Nervenkitzel und die Herausforderungen des Hackens eintauchen
Echtzeit-Hack-Nachrichten Bleiben Sie auf dem Laufenden über die schnelllebige Hackerwelt durch Echtzeitnachrichten und Einblicke
Neueste Ankündigungen Bleiben Sie informiert über die neuesten Bug-Bounties und wichtige Plattform-Updates
Treten Sie uns auf Discord bei und beginnen Sie noch heute mit den besten Hackern zusammenzuarbeiten!
Content Security Policy (CSP) wird als Browsertechnologie anerkannt, die hauptsächlich darauf abzielt, sich gegen Angriffe wie Cross-Site-Scripting (XSS) zu schützen. Es funktioniert, indem es Pfade und Quellen definiert und detailliert, von denen Ressourcen sicher vom Browser geladen werden können. Diese Ressourcen umfassen eine Reihe von Elementen wie Bilder, Frames und JavaScript. Zum Beispiel könnte eine Richtlinie das Laden und Ausführen von Ressourcen von derselben Domain (self) erlauben, einschließlich Inline-Ressourcen und die Ausführung von String-Code durch Funktionen wie eval
, setTimeout
oder setInterval
.
Die Implementierung von CSP erfolgt durch Antwort-Header oder durch die Einfügung von Meta-Elementen in die HTML-Seite. In Übereinstimmung mit dieser Richtlinie setzen Browser diese Bestimmungen proaktiv durch und blockieren sofort alle erkannten Verstöße.
Implementiert über Antwort-Header:
Implementiert über das Meta-Tag:
CSP kann mit diesen Headern durchgesetzt oder überwacht werden:
Content-Security-Policy
: Setzt die CSP durch; der Browser blockiert alle Verstöße.
Content-Security-Policy-Report-Only
: Wird zur Überwachung verwendet; meldet Verstöße, ohne sie zu blockieren. Ideal für Tests in Pre-Production-Umgebungen.
CSP beschränkt die Ursprünge für das Laden sowohl aktiver als auch passiver Inhalte und kontrolliert Aspekte wie die Ausführung von Inline-JavaScript und die Verwendung von eval()
. Ein Beispiel für eine Richtlinie ist:
script-src: Erlaubt spezifische Quellen für JavaScript, einschließlich URLs, Inline-Skripte und Skripte, die durch Ereignis-Handler oder XSLT-Stylesheets ausgelöst werden.
default-src: Legt eine Standardrichtlinie für das Abrufen von Ressourcen fest, wenn spezifische Abrufrichtlinien fehlen.
child-src: Gibt erlaubte Ressourcen für Web-Worker und eingebettete Frame-Inhalte an.
connect-src: Beschränkt URLs, die mit Schnittstellen wie fetch, WebSocket, XMLHttpRequest geladen werden können.
frame-src: Beschränkt URLs für Frames.
frame-ancestors: Gibt an, welche Quellen die aktuelle Seite einbetten können, anwendbar auf Elemente wie <frame>
, <iframe>
, <object>
, <embed>
und <applet>
.
img-src: Definiert erlaubte Quellen für Bilder.
font-src: Gibt gültige Quellen für Schriftarten an, die mit @font-face
geladen werden.
manifest-src: Definiert erlaubte Quellen für Anwendungsmanifestdateien.
media-src: Definiert erlaubte Quellen für das Laden von Medienobjekten.
object-src: Definiert erlaubte Quellen für <object>
, <embed>
und <applet>
-Elemente.
base-uri: Gibt erlaubte URLs für das Laden mit <base>
-Elementen an.
form-action: Listet gültige Endpunkte für Formularübermittlungen auf.
plugin-types: Beschränkt MIME-Typen, die eine Seite aufrufen kann.
upgrade-insecure-requests: Weist Browser an, HTTP-URLs in HTTPS umzuschreiben.
sandbox: Wendet Einschränkungen an, die ähnlich wie das Sandbox-Attribut eines <iframe>
sind.
report-to: Gibt eine Gruppe an, an die ein Bericht gesendet wird, wenn die Richtlinie verletzt wird.
worker-src: Gibt gültige Quellen für Worker-, SharedWorker- oder ServiceWorker-Skripte an.
prefetch-src: Gibt gültige Quellen für Ressourcen an, die abgerufen oder vorab abgerufen werden.
navigate-to: Beschränkt die URLs, zu denen ein Dokument auf beliebige Weise navigieren kann (a, Formular, window.location, window.open usw.)
*
: Erlaubt alle URLs, außer denen mit data:
, blob:
, filesystem:
-Schemas.
'self'
: Erlaubt das Laden von derselben Domain.
'data'
: Erlaubt das Laden von Ressourcen über das Daten-Schema (z. B. Base64-kodierte Bilder).
'none'
: Blockiert das Laden von jeder Quelle.
'unsafe-eval'
: Erlaubt die Verwendung von eval()
und ähnlichen Methoden, aus Sicherheitsgründen nicht empfohlen.
'unsafe-hashes'
: Ermöglicht spezifische Inline-Ereignis-Handler.
'unsafe-inline'
: Erlaubt die Verwendung von Inline-Ressourcen wie Inline-<script>
oder <style>
, aus Sicherheitsgründen nicht empfohlen.
'nonce'
: Eine Whitelist für spezifische Inline-Skripte unter Verwendung eines kryptografischen Nonce (einmal verwendete Zahl).
Wenn Sie eine eingeschränkte Ausführung von JS haben, ist es möglich, einen verwendeten Nonce innerhalb der Seite mit doc.defaultView.top.document.querySelector("[nonce]")
zu erhalten und ihn dann wiederzuverwenden, um ein bösartiges Skript zu laden (wenn strict-dynamic verwendet wird, kann jede erlaubte Quelle neue Quellen laden, sodass dies nicht erforderlich ist), wie in:
'sha256-<hash>'
: Whitelistet Skripte mit einem spezifischen sha256-Hash.
'strict-dynamic'
: Erlaubt das Laden von Skripten aus jeder Quelle, wenn sie durch ein nonce oder einen Hash whitelisted wurde.
'host'
: Gibt einen spezifischen Host an, wie example.com
.
https:
: Beschränkt URLs auf solche, die HTTPS verwenden.
blob:
: Erlaubt das Laden von Ressourcen von Blob-URLs (z.B. Blob-URLs, die über JavaScript erstellt wurden).
filesystem:
: Erlaubt das Laden von Ressourcen vom Dateisystem.
'report-sample'
: Beinhaltet ein Beispiel des verletzenden Codes im Verletzungsbericht (nützlich für das Debugging).
'strict-origin'
: Ähnlich wie 'self', stellt jedoch sicher, dass das Sicherheitsniveau des Protokolls der Quellen mit dem Dokument übereinstimmt (nur sichere Ursprünge können Ressourcen von sicheren Ursprüngen laden).
'strict-origin-when-cross-origin'
: Sendet vollständige URLs bei Anfragen mit demselben Ursprung, sendet jedoch nur den Ursprung, wenn die Anfrage cross-origin ist.
'unsafe-allow-redirects'
: Erlaubt das Laden von Ressourcen, die sofort zu einer anderen Ressource umleiten. Nicht empfohlen, da es die Sicherheit schwächt.
Working payload: "/><script>alert(1);</script>
Das funktioniert nicht, für mehr Informationen hier überprüfen.
Funktionierender Payload:
Wenn Sie es irgendwie schaffen können, dass ein erlaubter JS-Code ein neues Skript-Tag im DOM mit Ihrem JS-Code erstellt, weil ein erlaubtes Skript es erstellt, wird das neue Skript-Tag erlaubt sein, ausgeführt zu werden.
Funktionierender Payload:
Es scheint, dass dies nicht mehr funktioniert
Funktionierende Payloads:
Wenn Sie eine JS-Datei hochladen können, können Sie diese CSP umgehen:
Funktionierender Payload:
Es ist jedoch sehr wahrscheinlich, dass der Server die hochgeladene Datei validiert und nur bestimmte Dateitypen erlaubt.
Darüber hinaus, selbst wenn Sie einen JS-Code in einer Datei mit einer vom Server akzeptierten Erweiterung (wie: script.png) hochladen könnten, wäre das nicht genug, da einige Server wie der Apache-Server den MIME-Typ der Datei basierend auf der Erweiterung auswählen und Browser wie Chrome Javascript-Code in etwas, das ein Bild sein sollte, nicht ausführen. "Hoffentlich" gibt es Fehler. Zum Beispiel habe ich von einem CTF gelernt, dass Apache nicht weiß, was die .wave-Erweiterung ist, daher wird sie nicht mit einem MIME-Typ wie audio/ bedient.
Von hier aus, wenn Sie ein XSS und einen Datei-Upload finden und es Ihnen gelingt, eine missverstandene Erweiterung zu finden, könnten Sie versuchen, eine Datei mit dieser Erweiterung und dem Inhalt des Skripts hochzuladen. Oder, wenn der Server das korrekte Format der hochgeladenen Datei überprüft, erstellen Sie ein Polyglot (einige Polyglot-Beispiele hier).
Wenn es nicht möglich ist, JS zu injizieren, könnten Sie immer noch versuchen, beispielsweise Anmeldeinformationen durch das Injizieren einer Formularaktion zu exfiltrieren (und vielleicht erwarten, dass Passwortmanager Passwörter automatisch ausfüllen). Sie finden ein Beispiel in diesem Bericht. Beachten Sie auch, dass default-src
keine Formularaktionen abdeckt.
Für einige der folgenden Payloads wird unsafe-eval
nicht einmal benötigt.
Laden Sie eine verwundbare Version von Angular und führen Sie beliebigen JS aus:
window
-Objekt zurückgeben (schau dir diesen Beitrag an):Der Beitrag zeigt, dass du alle Bibliotheken von cdn.cloudflare.com
(oder einem anderen erlaubten JS-Bibliotheks-Repo) laden, alle hinzugefügten Funktionen aus jeder Bibliothek ausführen und überprüfen kannst, welche Funktionen aus welchen Bibliotheken das window
-Objekt zurückgeben.
Angular XSS von einem Klassennamen:
Laut diesem CTF-Bericht können Sie https://www.google.com/recaptcha/ innerhalb einer CSP missbrauchen, um beliebigen JS-Code auszuführen und die CSP zu umgehen:
Mehr Payloads aus diesem Bericht: