Content Security Policy (CSP) Bypass
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
Η Πολιτική Ασφαλείας Περιεχομένου (CSP) αναγνωρίζεται ως τεχνολογία προγράμματος περιήγησης, κυρίως με στόχο την προστασία από επιθέσεις όπως η διασταυρούμενη σcripting (XSS). Λειτουργεί καθορίζοντας και περιγράφοντας διαδρομές και πηγές από τις οποίες οι πόροι μπορούν να φορτωθούν με ασφάλεια από το πρόγραμμα περιήγησης. Αυτοί οι πόροι περιλαμβάνουν μια σειρά στοιχείων όπως εικόνες, πλαίσια και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέπει τη φόρτωση και εκτέλεση πόρων από τον ίδιο τομέα (self), συμπεριλαμβανομένων των inline πόρων και της εκτέλεσης κώδικα συμβολοσειρών μέσω συναρτήσεων όπως eval
, setTimeout
ή setInterval
.
Η εφαρμογή του CSP πραγματοποιείται μέσω κεφαλίδων απόκρισης ή με την ενσωμάτωση meta στοιχείων στη σελίδα HTML. Ακολουθώντας αυτή την πολιτική, τα προγράμματα περιήγησης επιβάλλουν ενεργά αυτούς τους κανονισμούς και μπλοκάρουν αμέσως οποιεσδήποτε ανιχνευμένες παραβάσεις.
Implemented via response header:
Υλοποιήθηκε μέσω μετα-ετικέτας:
CSP μπορεί να επιβληθεί ή να παρακολουθείται χρησιμοποιώντας αυτές τις κεφαλίδες:
Content-Security-Policy
: Επιβάλλει το CSP; ο περιηγητής μπλοκάρει οποιεσδήποτε παραβιάσεις.
Content-Security-Policy-Report-Only
: Χρησιμοποιείται για παρακολούθηση; αναφέρει παραβιάσεις χωρίς να τις μπλοκάρει. Ιδανικό για δοκιμές σε περιβάλλοντα προ-παραγωγής.
CSP περιορίζει τις προελεύσεις για τη φόρτωση τόσο ενεργού όσο και παθητικού περιεχομένου, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση του eval()
. Ένα παράδειγμα πολιτικής είναι:
script-src: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων URLs, inline scripts, και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets.
default-src: Ορίζει μια προεπιλεγμένη πολιτική για την ανάκτηση πόρων όταν απουσιάζουν συγκεκριμένες οδηγίες ανάκτησης.
child-src: Προσδιορίζει επιτρεπόμενους πόρους για web workers και περιεχόμενο ενσωματωμένων πλαισίων.
connect-src: Περιορίζει τα URLs που μπορούν να φορτωθούν χρησιμοποιώντας διεπαφές όπως fetch, WebSocket, XMLHttpRequest.
frame-src: Περιορίζει τα URLs για πλαίσια.
frame-ancestors: Προσδιορίζει ποιες πηγές μπορούν να ενσωματώσουν τη τρέχουσα σελίδα, εφαρμόσιμο σε στοιχεία όπως <frame>
, <iframe>
, <object>
, <embed>
, και <applet>
.
img-src: Ορίζει επιτρεπόμενες πηγές για εικόνες.
font-src: Προσδιορίζει έγκυρες πηγές για γραμματοσειρές που φορτώνονται χρησιμοποιώντας @font-face
.
manifest-src: Ορίζει επιτρεπόμενες πηγές αρχείων manifest εφαρμογής.
media-src: Ορίζει επιτρεπόμενες πηγές για τη φόρτωση αντικειμένων πολυμέσων.
object-src: Ορίζει επιτρεπόμενες πηγές για στοιχεία <object>
, <embed>
, και <applet>
.
base-uri: Προσδιορίζει επιτρεπόμενα URLs για φόρτωση χρησιμοποιώντας στοιχεία <base>
.
form-action: Λίστα έγκυρων endpoints για υποβολές φορμών.
plugin-types: Περιορίζει τους τύπους mime που μπορεί να καλέσει μια σελίδα.
upgrade-insecure-requests: Δίνει οδηγίες στους περιηγητές να ξαναγράψουν τα HTTP URLs σε HTTPS.
sandbox: Εφαρμόζει περιορισμούς παρόμοιους με την ιδιότητα sandbox ενός <iframe>
.
report-to: Προσδιορίζει μια ομάδα στην οποία θα σταλεί μια αναφορά αν παραβιαστεί η πολιτική.
worker-src: Προσδιορίζει έγκυρες πηγές για scripts Worker, SharedWorker, ή ServiceWorker.
prefetch-src: Προσδιορίζει έγκυρες πηγές για πόρους που θα ανακτηθούν ή θα προανακτηθούν.
navigate-to: Περιορίζει τα URLs στα οποία μπορεί να πλοηγηθεί ένα έγγραφο με οποιονδήποτε τρόπο (a, form, window.location, window.open, κ.λπ.)
*
: Επιτρέπει όλα τα URLs εκτός από αυτά με data:
, blob:
, filesystem:
schemes.
'self'
: Επιτρέπει τη φόρτωση από το ίδιο domain.
'data'
: Επιτρέπει την ανάκτηση πόρων μέσω του data scheme (π.χ., εικόνες κωδικοποιημένες σε Base64).
'none'
: Αποκλείει τη φόρτωση από οποιαδήποτε πηγή.
'unsafe-eval'
: Επιτρέπει τη χρήση του eval()
και παρόμοιων μεθόδων, δεν συνιστάται για λόγους ασφαλείας.
'unsafe-hashes'
: Ενεργοποιεί συγκεκριμένους inline event handlers.
'unsafe-inline'
: Επιτρέπει τη χρήση inline πόρων όπως inline <script>
ή <style>
, δεν συνιστάται για λόγους ασφαλείας.
'nonce'
: Μια λευκή λίστα για συγκεκριμένα inline scripts χρησιμοποιώντας ένα κρυπτογραφικό nonce (αριθμός που χρησιμοποιείται μία φορά).
Αν έχετε περιορισμένη εκτέλεση JS, είναι δυνατόν να αποκτήσετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με doc.defaultView.top.document.querySelector("[nonce]")
και στη συνέχεια να το επαναχρησιμοποιήσετε για να φορτώσετε ένα κακόβουλο script (αν χρησιμοποιείται strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές, οπότε αυτό δεν είναι απαραίτητο), όπως στο:
'sha256-<hash>'
: Λευκή λίστα σεναρίων με συγκεκριμένο sha256 hash.
'strict-dynamic'
: Επιτρέπει τη φόρτωση σεναρίων από οποιαδήποτε πηγή αν έχει λευκανθεί με nonce ή hash.
'host'
: Προσδιορίζει μια συγκεκριμένη πηγή, όπως το example.com
.
https:
: Περιορίζει τις διευθύνσεις URL σε αυτές που χρησιμοποιούν HTTPS.
blob:
: Επιτρέπει τη φόρτωση πόρων από Blob URLs (π.χ., Blob URLs που δημιουργούνται μέσω JavaScript).
filesystem:
: Επιτρέπει τη φόρτωση πόρων από το σύστημα αρχείων.
'report-sample'
: Συμπεριλαμβάνει ένα δείγμα του παραβιασμένου κώδικα στην αναφορά παραβίασης (χρήσιμο για αποσφαλμάτωση).
'strict-origin'
: Παρόμοιο με το 'self' αλλά διασφαλίζει ότι το επίπεδο ασφαλείας του πρωτοκόλλου των πηγών ταιριάζει με το έγγραφο (μόνο ασφαλείς πηγές μπορούν να φορτώσουν πόρους από ασφαλείς πηγές).
'strict-origin-when-cross-origin'
: Στέλνει πλήρεις διευθύνσεις URL κατά την εκτέλεση αιτημάτων ίδιας προέλευσης αλλά στέλνει μόνο την προέλευση όταν το αίτημα είναι διασυνοριακό.
'unsafe-allow-redirects'
: Επιτρέπει τη φόρτωση πόρων που θα ανακατευθύνουν αμέσως σε άλλο πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.
Working payload: "/><script>alert(1);</script>
Αυτό δεν λειτουργεί, για περισσότερες πληροφορίες ελέγξτε αυτό.
Λειτουργικό payload:
Αν μπορείτε με κάποιον τρόπο να κάνετε ένα επιτρεπόμενο JS code να δημιουργήσει μια νέα ετικέτα script στο DOM με τον κωδικό σας, επειδή μια επιτρεπόμενη script την δημιουργεί, η νέα ετικέτα script θα επιτρέπεται να εκτελείται.
Λειτουργικό payload:
Φαίνεται ότι αυτό δεν λειτουργεί πια
Λειτουργικά payloads:
Αν μπορείτε να ανεβάσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτήν την CSP:
Working payload:
Ωστόσο, είναι πολύ πιθανό ότι ο διακομιστής επικυρώνει το ανεβασμένο αρχείο και θα επιτρέψει μόνο να ανεβάσετε καθορισμένο τύπο αρχείων.
Επιπλέον, ακόμη και αν μπορούσατε να ανεβάσετε έναν κωδικό JS μέσα σε ένα αρχείο χρησιμοποιώντας μια επέκταση που γίνεται αποδεκτή από τον διακομιστή (όπως: script.png), αυτό δεν θα είναι αρκετό γιατί μερικοί διακομιστές όπως ο διακομιστής apache επιλέγουν τον τύπο MIME του αρχείου με βάση την επέκταση και οι περιηγητές όπως ο Chrome θα απορρίψουν την εκτέλεση του κώδικα Javascript μέσα σε κάτι που θα έπρεπε να είναι μια εικόνα. "Ελπίζουμε", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF έμαθα ότι ο Apache δεν γνωρίζει την .wave επέκταση, επομένως δεν την σερβίρει με έναν τύπο MIME όπως audio/*.
Από εδώ, αν βρείτε ένα XSS και μια δυνατότητα ανέβασμα αρχείου, και καταφέρετε να βρείτε μια παρερμηνευμένη επέκταση, θα μπορούσατε να προσπαθήσετε να ανεβάσετε ένα αρχείο με αυτή την επέκταση και το περιεχόμενο του script. Ή, αν ο διακομιστής ελέγχει τη σωστή μορφή του ανεβασμένου αρχείου, δημιουργήστε ένα polyglot (μερικά παραδείγματα polyglot εδώ).
Αν δεν είναι δυνατή η έγχυση JS, θα μπορούσατε να προσπαθήσετε να εξάγετε για παράδειγμα διαπιστευτήρια εγχύοντας μια ενέργεια φόρμας (και ίσως περιμένοντας τους διαχειριστές κωδικών πρόσβασης να συμπληρώσουν αυτόματα τους κωδικούς). Μπορείτε να βρείτε ένα παράδειγμα σε αυτή την αναφορά. Επίσης, σημειώστε ότι το default-src
δεν καλύπτει τις ενέργειες φόρμας.
Για μερικά από τα παρακάτω payload unsafe-eval
δεν είναι καν απαραίτητο.
Φορτώστε μια ευάλωτη έκδοση του angular και εκτελέστε αυθαίρετο JS:
window
object (check out this post):Η ανάρτηση δείχνει ότι μπορείτε να φορτώσετε όλες τις βιβλιοθήκες από το cdn.cloudflare.com
(ή οποιοδήποτε άλλο επιτρεπόμενο αποθετήριο βιβλιοθηκών JS), να εκτελέσετε όλες τις προστιθέμενες συναρτήσεις από κάθε βιβλιοθήκη και να ελέγξετε ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το αντικείμενο window
.
Angular XSS από ένα όνομα κλάσης:
Σύμφωνα με αυτή την αναφορά CTF μπορείτε να καταχραστείτε https://www.google.com/recaptcha/ μέσα σε ένα CSP για να εκτελέσετε αυθαίρετο κώδικα JS παρακάμπτοντας το CSP:
Περισσότερα payloads από αυτήν την αναφορά:
Η παρακάτω διεύθυνση URL ανακατευθύνει στο example.com (από εδώ):
Abusing *.google.com/script.google.com
Είναι δυνατόν να εκμεταλλευτείτε το Google Apps Script για να λάβετε πληροφορίες σε μια σελίδα μέσα στο script.google.com. Όπως γίνεται σε αυτή την αναφορά.
Σενάρια όπως αυτό όπου το script-src
έχει οριστεί σε self
και ένα συγκεκριμένο domain που είναι στη λίστα επιτρεπόμενων μπορεί να παρακαμφθεί χρησιμοποιώντας JSONP. Τα endpoints JSONP επιτρέπουν ανασφαλείς μεθόδους callback που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, λειτουργικό payload:
JSONBee περιέχει έτοιμες προς χρήση JSONP endpoints για CSP bypass διαφόρων ιστοσελίδων.
Η ίδια ευπάθεια θα συμβεί αν το έμπιστο endpoint περιέχει ένα Open Redirect γιατί αν το αρχικό endpoint είναι έμπιστο, οι ανακατευθύνσεις είναι έμπιστες.
Όπως περιγράφεται στην παρακάτω ανάρτηση, υπάρχουν πολλές τρίτες τομείς, που μπορεί να επιτρέπονται κάπου στο CSP, μπορούν να καταχρηστούν για να εξάγουν δεδομένα ή να εκτελέσουν κώδικα JavaScript. Μερικοί από αυτούς τους τρίτους είναι:
Οντότητα | Επιτρεπόμενος Τομέας | Δυνατότητες |
---|---|---|
www.facebook.com, *.facebook.com | Exfil | |
Hotjar | *.hotjar.com, ask.hotjar.io | Exfil |
Jsdelivr | *.jsdelivr.com, cdn.jsdelivr.net | Exec |
Amazon CloudFront | *.cloudfront.net | Exfil, Exec |
Amazon AWS | *.amazonaws.com | Exfil, Exec |
Azure Websites | *.azurewebsites.net, *.azurestaticapps.net | Exfil, Exec |
Salesforce Heroku | *.herokuapp.com | Exfil, Exec |
Google Firebase | *.firebaseapp.com | Exfil, Exec |
Αν βρείτε οποιονδήποτε από τους επιτρεπόμενους τομείς στο CSP του στόχου σας, οι πιθανότητες είναι ότι μπορεί να είστε σε θέση να παρακάμψετε το CSP εγγραφόμενοι στην υπηρεσία τρίτου μέρους και, είτε να εξάγετε δεδομένα σε αυτή την υπηρεσία είτε να εκτελέσετε κώδικα.
Για παράδειγμα, αν βρείτε το παρακάτω CSP:
ή
Πρέπει να είστε σε θέση να εξάγετε δεδομένα, παρόμοια με το πώς γινόταν πάντα με Google Analytics/Google Tag Manager. Σε αυτή την περίπτωση, ακολουθείτε τα παρακάτω γενικά βήματα:
Δημιουργήστε έναν λογαριασμό Facebook Developer εδώ.
Δημιουργήστε μια νέα εφαρμογή "Facebook Login" και επιλέξτε "Website".
Μεταβείτε στο "Settings -> Basic" και αποκτήστε το "App ID" σας.
Στον στόχο ιστότοπο από τον οποίο θέλετε να εξάγετε δεδομένα, μπορείτε να εξάγετε δεδομένα χρησιμοποιώντας απευθείας την συσκευή SDK του Facebook "fbq" μέσω ενός "customEvent" και του payload δεδομένων.
Μεταβείτε στο "Event Manager" της εφαρμογής σας και επιλέξτε την εφαρμογή που δημιουργήσατε (σημειώστε ότι ο διαχειριστής εκδηλώσεων μπορεί να βρεθεί σε μια διεύθυνση URL παρόμοια με αυτή: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events
Επιλέξτε την καρτέλα "Test Events" για να δείτε τις εκδηλώσεις που αποστέλλονται από τον "ιστότοπό σας".
Στη συνέχεια, από την πλευρά του θύματος, εκτελείτε τον παρακάτω κώδικα για να αρχικοποιήσετε το pixel παρακολούθησης του Facebook ώστε να δείχνει στο app-id του λογαριασμού προγραμματιστή του επιτιθέμενου και να εκδώσετε μια προσαρμοσμένη εκδήλωση όπως αυτή:
Όσον αφορά τα άλλα επτά τρίτα μέρη τομέων που αναφέρονται στον προηγούμενο πίνακα, υπάρχουν πολλοί άλλοι τρόποι που μπορείτε να τους εκμεταλλευτείτε. Ανατρέξτε στην προηγούμενη ανάρτηση στο blog για επιπλέον εξηγήσεις σχετικά με άλλες τρίτες καταχρήσεις.
Εκτός από την προαναφερθείσα ανακατεύθυνση για την παράκαμψη περιορισμών διαδρομής, υπάρχει μια άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) που μπορεί να χρησιμοποιηθεί σε ορισμένους διακομιστές.
Για παράδειγμα, αν το CSP επιτρέπει τη διαδρομή https://example.com/scripts/react/
, μπορεί να παρακαμφθεί ως εξής:
Ο περιηγητής θα φορτώσει τελικά το https://example.com/scripts/angular/angular.js
.
Αυτό λειτουργεί επειδή για τον περιηγητή, φορτώνετε ένα αρχείο με όνομα ..%2fangular%2fangular.js
που βρίσκεται κάτω από το https://example.com/scripts/react/
, το οποίο είναι συμβατό με το CSP.
Έτσι, θα το αποκωδικοποιήσουν, ζητώντας ουσιαστικά το https://example.com/scripts/react/../angular/angular.js
, το οποίο είναι ισοδύναμο με το https://example.com/scripts/angular/angular.js
.
Με την εκμετάλλευση αυτής της ασυνέπειας στην ερμηνεία URL μεταξύ του περιηγητή και του διακομιστή, οι κανόνες διαδρομής μπορούν να παρακαμφθούν.
Η λύση είναι να μην αντιμετωπίζεται το %2f
ως /
στην πλευρά του διακομιστή, διασφαλίζοντας συνεπή ερμηνεία μεταξύ του περιηγητή και του διακομιστή για να αποφευχθεί αυτό το ζήτημα.
Online Παράδειγμα: https://jsbin.com/werevijewa/edit?html,output
Εάν η οδηγία base-uri λείπει, μπορείτε να την εκμεταλλευτείτε για να εκτελέσετε μια dangling markup injection.
Επιπλέον, εάν η σελίδα φορτώνει ένα σενάριο χρησιμοποιώντας μια σχετική διαδρομή (όπως <script src="/js/app.js">
) χρησιμοποιώντας ένα Nonce, μπορείτε να εκμεταλλευτείτε την ετικέτα base για να κάνετε να φορτώσει το σενάριο από τον δικό σας διακομιστή επιτυγχάνοντας XSS.
Εάν η ευάλωτη σελίδα φορτώνεται με httpS, χρησιμοποιήστε μια διεύθυνση httpS στη βάση.
Μια συγκεκριμένη πολιτική γνωστή ως Content Security Policy (CSP) μπορεί να περιορίσει τα JavaScript events. Παρ' όλα αυτά, το AngularJS εισάγει προσαρμοσμένα events ως εναλλακτική λύση. Μέσα σε ένα event, το AngularJS παρέχει ένα μοναδικό αντικείμενο $event
, το οποίο αναφέρεται στο εγγενές αντικείμενο event του προγράμματος περιήγησης. Αυτό το αντικείμενο $event
μπορεί να εκμεταλλευτεί για να παρακαμφθεί η CSP. Σημαντικά, στο Chrome, το αντικείμενο $event/event
διαθέτει ένα χαρακτηριστικό path
, το οποίο περιέχει έναν πίνακα αντικειμένων που εμπλέκονται στην αλυσίδα εκτέλεσης του event, με το αντικείμενο window
να βρίσκεται πάντα στο τέλος. Αυτή η δομή είναι καθοριστική για τις τακτικές διαφυγής από το sandbox.
Κατευθύνοντας αυτόν τον πίνακα προς το φίλτρο orderBy
, είναι δυνατόν να επαναληφθεί, εκμεταλλευόμενοι το τερματικό στοιχείο (το αντικείμενο window
) για να ενεργοποιηθεί μια παγκόσμια συνάρτηση όπως το alert()
. Το παρακάτω απόσπασμα κώδικα διευκρινίζει αυτή τη διαδικασία:
Αυτό το απόσπασμα επισημαίνει τη χρήση της οδηγίας ng-focus
για την ενεργοποίηση του γεγονότος, χρησιμοποιώντας το $event.path|orderBy
για να χειριστεί τον πίνακα path
, και εκμεταλλευόμενο το αντικείμενο window
για να εκτελέσει τη συνάρτηση alert()
, αποκαλύπτοντας έτσι το document.cookie
.
Βρείτε άλλες παρακάμψεις Angular στο https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
Μια πολιτική CSP που επιτρέπει συγκεκριμένα domains για τη φόρτωση σεναρίων σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης συναρτήσεων callback και ορισμένων ευάλωτων κλάσεων. Περαιτέρω πληροφορίες σχετικά με αυτή την τεχνική μπορούν να βρεθούν σε έναν λεπτομερή οδηγό που είναι διαθέσιμος σε αυτό το git repository.
Λειτουργικά payloads:
Άλλες τελείες εκτέλεσης JSONP μπορούν να βρεθούν εδώ (μερικές από αυτές διαγράφηκαν ή διορθώθηκαν)
Τι συμβαίνει όταν η CSP συναντήσει ανακατεύθυνση από την πλευρά του διακομιστή; Εάν η ανακατεύθυνση οδηγεί σε διαφορετική προέλευση που δεν επιτρέπεται, θα αποτύχει.
Ωστόσο, σύμφωνα με την περιγραφή στο CSP spec 4.2.2.3. Διαδρομές και Ανακατευθύνσεις, εάν η ανακατεύθυνση οδηγεί σε διαφορετική διαδρομή, μπορεί να παρακάμψει τους αρχικούς περιορισμούς.
Ακολουθεί ένα παράδειγμα:
Αν το CSP έχει οριστεί σε https://www.google.com/a/b/c/d
, καθώς η διαδρομή λαμβάνεται υπόψη, τόσο τα scripts /test
όσο και /a/test
θα αποκλειστούν από το CSP.
Ωστόσο, το τελικό http://localhost:5555/301
θα ανακατευθυνθεί από τον διακομιστή σε https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//
. Δεδομένου ότι πρόκειται για ανακατεύθυνση, η διαδρομή δεν λαμβάνεται υπόψη, και το script μπορεί να φορτωθεί, παρακάμπτοντας έτσι τον περιορισμό της διαδρομής.
Με αυτή την ανακατεύθυνση, ακόμη και αν η διαδρομή καθοριστεί πλήρως, θα παρακαμφθεί.
Επομένως, η καλύτερη λύση είναι να διασφαλιστεί ότι η ιστοσελίδα δεν έχει ανοιχτές ευπάθειες ανακατεύθυνσης και ότι δεν υπάρχουν τομείς που μπορούν να εκμεταλλευτούν στους κανόνες CSP.
Διαβάστε πώς εδώ.
'unsafe-inline'
σημαίνει ότι μπορείτε να εκτελέσετε οποιοδήποτε σενάριο μέσα στον κώδικα (το XSS μπορεί να εκτελέσει κώδικα) και img-src *
σημαίνει ότι μπορείτε να χρησιμοποιήσετε στην ιστοσελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.
Μπορείτε να παρακάμψετε αυτό το CSP εξάγοντας τα δεδομένα μέσω εικόνων (σε αυτή την περίπτωση το XSS εκμεταλλεύεται ένα CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει ένα SQLi, και εξάγει τη σημαία μέσω μιας εικόνας):
From: https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle
Μπορείτε επίσης να εκμεταλλευτείτε αυτή τη ρύθμιση για να φορτώσετε κώδικα javascript που έχει εισαχθεί μέσα σε μια εικόνα. Αν, για παράδειγμα, η σελίδα επιτρέπει τη φόρτωση εικόνων από το Twitter. Μπορείτε να δημιουργήσετε μια ειδική εικόνα, να την ανεβάσετε στο Twitter και να εκμεταλλευτείτε το "unsafe-inline" για να εκτελέσετε έναν κώδικα JS (όπως μια κανονική XSS) που θα φορτώσει την εικόνα, θα εξάγει τον JS από αυτήν και θα τον εκτελέσει: https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/
Η λειτουργία importScripts
των service workers δεν περιορίζεται από το CSP:
Έρευνα: https://portswigger.net/research/bypassing-csp-with-policy-injection
Αν μια παράμετρος που στέλνετε επικολληθεί μέσα στη δήλωση της πολιτικής, τότε μπορείτε να αλλάξετε την πολιτική με κάποιον τρόπο που την καθιστά άχρηστη. Μπορείτε να επιτρέψετε το script 'unsafe-inline' με οποιονδήποτε από αυτούς τους παρακάμψεις:
Γιατί αυτή η οδηγία θα επικαλύψει τις υπάρχουσες οδηγίες script-src. Μπορείτε να βρείτε ένα παράδειγμα εδώ: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E
Στο Edge είναι πολύ πιο απλό. Αν μπορείτε να προσθέσετε στο CSP απλά αυτό: ;_
Edge θα απορρίψει ολόκληρη την πολιτική.
Παράδειγμα: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E
Παρατηρήστε την έλλειψη της οδηγίας 'unsafe-inline'
Αυτή τη φορά μπορείτε να κάνετε το θύμα να φορτώσει μια σελίδα υπό τον έλεγχό σας μέσω XSS με ένα <iframe
. Αυτή τη φορά θα κάνετε το θύμα να έχει πρόσβαση στη σελίδα από όπου θέλετε να εξάγετε πληροφορίες (CSRF). Δεν μπορείτε να έχετε πρόσβαση στο περιεχόμενο της σελίδας, αλλά αν με κάποιο τρόπο μπορείτε να ελέγξετε τον χρόνο που χρειάζεται η σελίδα για να φορτώσει μπορείτε να εξάγετε τις πληροφορίες που χρειάζεστε.
Αυτή τη φορά μια σημαία θα εξαχθεί, όποτε μια χαρακτήρας μαντεύεται σωστά μέσω SQLi η απάντηση χρειάζεται περισσότερο χρόνο λόγω της λειτουργίας ύπνου. Στη συνέχεια, θα είστε σε θέση να εξάγετε τη σημαία:
Αυτή η επίθεση θα περιλάμβανε κάποια κοινωνική μηχανική όπου ο επιτιθέμενος πείθει τον χρήστη να σύρει και να αποθέσει έναν σύνδεσμο πάνω στο bookmarklet του προγράμματος περιήγησης. Αυτό το bookmarklet θα περιείχε κακόβουλο javascript κώδικα που όταν σύρεται και αποτίθεται ή κάνετε κλικ θα εκτελείται στο πλαίσιο του τρέχοντος διαδικτυακού παραθύρου, παρακάμπτοντας το CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών όπως cookies ή tokens.
Για περισσότερες πληροφορίες ελέγξτε την αρχική αναφορά εδώ.
Στο αυτή την αναφορά CTF, το CSP παρακάμπτεται με την εισαγωγή μέσα σε ένα επιτρεπόμενο iframe ενός πιο περιοριστικού CSP που απαγόρευε τη φόρτωση ενός συγκεκριμένου JS αρχείου που, στη συνέχεια, μέσω prototype pollution ή dom clobbering επέτρεπε να καταχραστεί ένα διαφορετικό σενάριο για να φορτώσει ένα αυθαίρετο σενάριο.
Μπορείτε να περιορίσετε ένα CSP ενός Iframe με το csp
χαρακτηριστικό:
Στο αυτό το writeup CTF, ήταν δυνατό μέσω HTML injection να περιοριστεί περισσότερο μια CSP έτσι ώστε ένα σενάριο που προλαμβάνει το CSTI να απενεργοποιήθηκε και επομένως η ευπάθεια έγινε εκμεταλλεύσιμη. Η CSP μπορεί να γίνει πιο περιοριστική χρησιμοποιώντας HTML meta tags και τα inline scripts μπορούν να απενεργοποιηθούν αφαιρώντας την είσοδο που επιτρέπει το nonce τους και ενεργοποιώντας συγκεκριμένο inline script μέσω sha:
Αν μπορέσετε να κάνετε τον διακομιστή να απαντήσει με την κεφαλίδα Content-Security-Policy-Report-Only
με μια τιμή που ελέγχετε εσείς (ίσως λόγω ενός CRLF), θα μπορούσατε να το κάνετε να δείχνει τον διακομιστή σας και αν τυλίξετε το JS περιεχόμενο που θέλετε να εξάγετε με <script>
και επειδή είναι πολύ πιθανό ότι το unsafe-inline
δεν επιτρέπεται από την CSP, αυτό θα προκαλέσει ένα σφάλμα CSP και μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στον διακομιστή από το Content-Security-Policy-Report-Only
.
Για ένα παράδειγμα ελέγξτε αυτή την αναφορά CTF.
Ένα iframe
δημιουργείται που δείχνει σε μια διεύθυνση URL (ας την ονομάσουμε https://example.redirect.com
) η οποία επιτρέπεται από το CSP.
Αυτή η διεύθυνση URL στη συνέχεια ανακατευθύνει σε μια μυστική διεύθυνση URL (π.χ., https://usersecret.example2.com
) που δεν επιτρέπεται από το CSP.
Ακούγοντας το γεγονός securitypolicyviolation
, μπορεί κανείς να συλλάβει την ιδιότητα blockedURI
. Αυτή η ιδιότητα αποκαλύπτει το domain της μπλοκαρισμένης URI, διαρρέοντας το μυστικό domain στο οποίο ανακατευθύνθηκε η αρχική διεύθυνση URL.
Είναι ενδιαφέρον να σημειωθεί ότι οι περιηγητές όπως ο Chrome και ο Firefox έχουν διαφορετικές συμπεριφορές στη διαχείριση των iframes σε σχέση με το CSP, οδηγώντας σε πιθανή διαρροή ευαίσθητων πληροφοριών λόγω μη καθορισμένης συμπεριφοράς.
Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του CSP αυτού καθαυτού για να συμπεράνουμε το μυστικό υποdomain. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP για να περιλαμβάνει συγκεκριμένα domains που είναι σκόπιμα μπλοκαρισμένα. Για παράδειγμα, αν το μυστικό υποdomain αποτελείται από άγνωστους χαρακτήρες, μπορείτε να δοκιμάσετε επαναληπτικά διαφορετικά υποdomains τροποποιώντας την οδηγία CSP για να μπλοκάρετε ή να επιτρέψετε αυτά τα υποdomains. Ακολουθεί ένα απόσπασμα που δείχνει πώς μπορεί να ρυθμιστεί το CSP για να διευκολύνει αυτή τη μέθοδο:
Με την παρακολούθηση των αιτημάτων που αποκλείονται ή επιτρέπονται από την CSP, μπορεί κανείς να περιορίσει τους πιθανούς χαρακτήρες στο μυστικό υποτομέα, αποκαλύπτοντας τελικά το πλήρες URL.
Και οι δύο μέθοδοι εκμεταλλεύονται τις λεπτομέρειες της υλοποίησης και της συμπεριφοράς της CSP στους περιηγητές, δείχνοντας πώς οι φαινομενικά ασφαλείς πολιτικές μπορούν ακούσια να διαρρεύσουν ευαίσθητες πληροφορίες.
Trick from here.
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
According to the last technique commented in this video, sending too many parameters (1001 GET parameters although you can also do it with POST params and more that 20 files). Any defined header()
in the PHP web code won't be sent because of the error that this will trigger.
PHP is known for buffering the response to 4096 bytes by default. Therefore, if PHP is showing a warning, by providing enough data inside warnings, the response will be sent before the CSP header, causing the header to be ignored. Then, the technique consists basically in filling the response buffer with warnings so the CSP header isn't sent.
Idea from this writeup.
From this writeup it looks like it was possible to bypass a CSP protection by loading an error page (potentially without CSP) and rewriting its content.
SOME είναι μια τεχνική που εκμεταλλεύεται ένα XSS (ή πολύ περιορισμένο XSS) σε ένα endpoint μιας σελίδας για να εκμεταλλευτεί άλλα endpoints της ίδιας προέλευσης. Αυτό γίνεται φορτώνοντας το ευάλωτο endpoint από μια σελίδα επιτιθέμενου και στη συνέχεια ανανεώνοντας τη σελίδα του επιτιθέμενου στο πραγματικό endpoint στην ίδια προέλευση που θέλετε να εκμεταλλευτείτε. Με αυτόν τον τρόπο το ευάλωτο endpoint μπορεί να χρησιμοποιήσει το opener
αντικείμενο στο payload για να πρόσβαση στο DOM του πραγματικού endpoint προς εκμετάλλευση. Για περισσότερες πληροφορίες δείτε:
Επιπλέον, το wordpress έχει ένα JSONP endpoint στο /wp-json/wp/v2/users/1?_jsonp=data
που θα αντανακλά τα δεδομένα που αποστέλλονται στην έξοδο (με τον περιορισμό μόνο σε γράμματα, αριθμούς και τελείες).
Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό το endpoint για να δημιουργήσει μια επίθεση SOME κατά του WordPress και να ενσωματώσει το μέσα σε <script s
rc=/wp-json/wp/v2/users/1?_jsonp=some_attack></script>
σημειώστε ότι αυτό το script θα φορτωθεί επειδή είναι επιτρεπτό από 'self'. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας επιτιθέμενος μπορεί να εκμεταλλευτεί την επίθεση SOME μέσω του ευάλωτου callback endpoint που παρακάμπτει το CSP για να δώσει περισσότερα προνόμια σε έναν χρήστη, να εγκαταστήσει ένα νέο plugin...
Για περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτήν την επίθεση δείτε https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/
Αν υπάρχει ένα αυστηρό CSP που δεν σας επιτρέπει να αλληλεπιδράσετε με εξωτερικούς διακομιστές, υπάρχουν μερικά πράγματα που μπορείτε πάντα να κάνετε για να εξάγετε τις πληροφορίες.
Μπορείτε απλώς να ενημερώσετε την τοποθεσία για να στείλετε στον διακομιστή του επιτιθέμενου τις μυστικές πληροφορίες:
Μπορείτε να ανακατευθύνετε εισάγοντας μια ετικέτα meta (αυτή είναι απλώς μια ανακατεύθυνση, δεν θα διαρρεύσει περιεχόμενο)
Για να φορτώνουν οι σελίδες πιο γρήγορα, οι φυλλομετρητές θα προ-λύσουν ονόματα κεντρικών υπολογιστών σε διευθύνσεις IP και θα τα αποθηκεύσουν για μελλοντική χρήση.
Μπορείτε να υποδείξετε σε έναν φυλλομετρητή να προ-λύσει ένα όνομα κεντρικού υπολογιστή με: <link rel="dns-prefetch" href="something.com">
Μπορείτε να εκμεταλλευτείτε αυτή τη συμπεριφορά για να εξάγετε ευαίσθητες πληροφορίες μέσω DNS αιτημάτων:
Άλλος τρόπος:
Για να αποφευχθεί αυτό, ο διακομιστής μπορεί να στείλει την κεφαλίδα HTTP:
Προφανώς, αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots)
Σε πολλές σελίδες μπορείτε να διαβάσετε ότι το WebRTC δεν ελέγχει την πολιτική connect-src
της CSP.
Στην πραγματικότητα μπορείτε να leak πληροφορίες χρησιμοποιώντας ένα DNS request. Δείτε αυτόν τον κώδικα:
Άλλη επιλογή:
https://csper.io/docs/generating-content-security-policy
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
```html ```
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)