SAML Basics

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Επισκόπηση SAML

Η Security Assertion Markup Language (SAML) επιτρέπει στους παρόχους ταυτότητας (IdP) να χρησιμοποιούνται για την αποστολή διαπιστευτηρίων εξουσιοδότησης στους παρόχους υπηρεσιών (SP), διευκολύνοντας την ενιαία σύνδεση (SSO). Αυτή η προσέγγιση απλοποιεί τη διαχείριση πολλαπλών συνδέσεων επιτρέποντας τη χρήση ενός μόνο συνόλου διαπιστευτηρίων σε πολλές ιστοσελίδες. Χρησιμοποιεί το XML για την τυποποιημένη επικοινωνία μεταξύ των IdPs και των SPs, συνδέοντας την πιστοποίηση της ταυτότητας του χρήστη με την εξουσιοδότηση της υπηρεσίας.

Σύγκριση μεταξύ SAML και OAuth

  • Το SAML είναι σχεδιασμένο για να παρέχει στις επιχειρήσεις μεγαλύτερο έλεγχο στην ασφάλεια της σύνδεσης SSO.

  • Το OAuth είναι σχεδιασμένο για να είναι πιο φιλικό προς την κινητή συσκευή, χρησιμοποιεί το JSON και είναι μια συνεργατική προσπάθεια από εταιρείες όπως η Google και η Twitter.

Ροή Πιστοποίησης SAML

Για περισσότερες λεπτομέρειες ελέγξτε την πλήρη ανάρτηση από https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/. Αυτό είναι ένα σύνοψη:

Η διαδικασία πιστοποίησης SAML περιλαμβάνει αρκετά βήματα, όπως φαίνεται στο σχήμα:

  1. Προσπάθεια πρόσβασης στον πόρο: Ο χρήστης προσπαθεί να αποκτήσει πρόσβαση σε έναν προστατευμένο πόρο.

  2. Δημιουργία αιτήματος SAML: Ο SP δεν αναγνωρίζει τον χρήστη και δημιουργεί ένα αίτημα SAML.

  3. Ανακατεύθυνση στο IdP: Ο χρήστης ανακατευθύνεται στο IdP, με το αίτημα SAML να περνά από τον περιηγητή του χρήστη.

  4. Λήψη αιτήματος από το IdP: Το IdP λαμβάνει το αίτημα SAML.

  5. Πιστοποίηση στο IdP: Το IdP πιστοποιεί τον χρήστη.

  6. Επαλήθευση του χρήστη: Το IdP επαληθεύει την εγκυρότητα του χρήστη για πρόσβαση στον ζητούμενο πόρο.

  7. Δημιουργία απάντησης SAML: Το IdP δημιουργεί μια απάντηση SAML που περιέχει τις απαραίτητες διαβεβαιώσεις.

  8. Ανακατεύθυνση στο ACS URL του SP: Ο χρήστης ανακατευθύνεται στο URL ACS (Assertion Consumer Service) του SP.

  9. Επαλήθευση της απάντησης SAML: Το ACS επαληθεύει την απάντηση SAML.

  10. Πρόσβαση στον πόρο που ζητήθηκε: Παρέχεται πρόσβαση στον αρχικά ζητούμενο πόρο.

Παράδειγμα Αιτήματος SAML

Θεωρήστε την περίπτωση όπου ένας χρήστης ζητά πρόσβαση σε έναν ασφαλή πόρο στο https://shibdemo-sp1.test.edu/secure/. Ο SP ανιχνεύει την έλλειψη πιστοποίησης και δημιουργεί ένα αίτημα SAML:

GET /secure/ HTTP/1.1
Host: shibdemo-sp1.test.edu
...

Το αρχικό αίτημα SAML φαίνεται ως εξής:

<?xml version="1.0"?>
<samlp:AuthnRequest ...
</samlp:AuthnRequest>

Τα βασικά στοιχεία αυτού του αιτήματος περιλαμβάνουν:

  • AssertionConsumerServiceURL: Καθορίζει τη διεύθυνση όπου ο IdP θα στείλει την απόκριση SAML μετά την πιστοποίηση.

  • Destination: Η διεύθυνση του IdP στην οποία αποστέλλεται το αίτημα.

  • ProtocolBinding: Καθορίζει τη μέθοδο μετάδοσης των μηνυμάτων πρωτοκόλλου SAML.

  • saml:Issuer: Αναγνωρίζει τον φορέα που προκάλεσε το αίτημα.

Ακολουθεί η δημιουργία του αιτήματος SAML, όπου ο SP απαντά με μια ανακατεύθυνση 302, καθοδηγώντας τον περιηγητή στον IdP με το αίτημα SAML που κωδικοποιείται στην κεφαλίδα Location της απόκρισης HTTP. Η παράμετρος RelayState διατηρεί τις πληροφορίες κατάστασης καθ' όλη τη διάρκεια της συναλλαγής, εξασφαλίζοντας ότι ο SP αναγνωρίζει το αρχικό αίτημα πόρου κατά τη λήψη της απόκρισης SAML. Η παράμετρος SAMLRequest είναι μια συμπιεσμένη και κωδικοποιημένη έκδοση του αρχικού XML αποσπάσματος, χρησιμοποιώντας συμπίεση Deflate και κωδικοποίηση base64.

Παράδειγμα Απόκρισης SAML

Μπορείτε να βρείτε μια πλήρη απόκριση SAML εδώ. Τα κύρια στοιχεία της απόκρισης περιλαμβάνουν:

  • ds:Signature: Αυτή η ενότητα, μια XML υπογραφή, εξασφαλίζει την ακεραιότητα και την αυθεντικότητα του εκδότη της δήλωσης. Η απόκριση SAML στο παράδειγμα περιέχει δύο στοιχεία ds:Signature, ένα για το μήνυμα και ένα για τη δήλωση.

  • saml:Assertion: Αυτό το τμήμα περιέχει πληροφορίες σχετικά με την ταυτότητα του χρήστη και, πιθανώς, άλλα χαρακτηριστικά.

  • saml:Subject: Καθορίζει τον κύριο υποκείμενο όλων των δηλώσεων στη δήλωση.

  • saml:StatusCode: Αντιπροσωπεύει την κατάσταση της λειτουργίας αντίδρασης στο αντίστοιχο αίτημα.

  • saml:Conditions: Λεπτομερείς συνθήκες, όπως ο χρονικός περιορισμός ισχύος της Δήλωσης και ο καθορισμένος Πάροχος Υπηρεσιών.

  • saml:AuthnStatement: Επιβεβαιώνει ότι ο IdP πιστοποίησε το υποκείμενο της Δήλωσης.

  • saml:AttributeStatement: Περιέχει χαρακτηριστικά που περιγράφουν το υποκείμενο της Δήλωσης.

Ακολουθείται από την απόκριση SAML, η διαδικασία περιλαμβάνει μια ανακατεύθυνση 302 από τον IdP. Αυτό οδηγεί σε ένα αίτημα POST προς την URL Υπηρεσίας Καταναλωτή Καταστατικού (ACS) του Παρόχου Υπηρεσιών. Το αίτημα POST περιλαμβάνει τις παραμέτρους RelayState και SAMLResponse. Ο ACS είναι υπεύθυνος για την επεξεργασία και την επικύρωση της απόκρισης SAML.

Αφού ληφθεί το αίτημα POST και επικυρωθεί η απόκριση SAML, παρέχεται πρόσβαση στον προστατευμένο πόρο που αρχικά ζήτησε ο χρήστης. Αυτό απεικονίζεται με ένα αίτημα GET προς το /secure/ σημείο εισόδου και μια απόκριση 200 OK, που υποδηλώνει επιτυχή πρόσβαση στον πόρο.

<Signature>
<SignedInfo>
<CanonicalizationMethod />
<SignatureMethod />
<Reference>
<Transforms />
<DigestMethod />
<DigestValue />
</Reference>
...
</SignedInfo>
<SignatureValue />
<KeyInfo />
<Object />
</Signature>

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

Τύποι XML Υπογραφών

  1. Υπογραφή Εντοπισμένη: Αυτός ο τύπος υπογραφής είναι απόγονος του πόρου που υπογράφει, πράγμα που σημαίνει ότι η υπογραφή περιέχεται στην ίδια δομή XML με το υπογεγραμμένο περιεχόμενο.

Παράδειγμα:

<samlp:Response ... ID="..." ... >
...
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
...
</samlp:Response>

Σε μια εντοπισμένη υπογραφή, το στοιχείο ds:Transform καθορίζει ότι είναι εντοπισμένη μέσω του αλγορίθμου enveloped-signature.

  1. Υπογραφή Περικλειόμενη: Αντίθετα με τις εντοπισμένες υπογραφές, οι περικλειόμενες υπογραφές περικλείουν τον υπογραφόμενο πόρο.

Παράδειγμα:

<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
<samlp:Response ... ID="..." ... >
...
</samlp:Response>
</ds:Signature>
  1. Αποσπασμένη Υπογραφή: Αυτός ο τύπος είναι ανεξάρτητος από το περιεχόμενο που υπογράφει. Η υπογραφή και το περιεχόμενο υπάρχουν ανεξάρτητα, αλλά διατηρείται ένας σύνδεσμος μεταξύ τους.

Παράδειγμα:

<samlp:Response ... ID="..." ... >
...
</samlp:Response>
<ds:Signature>
<ds:SignedInfo>
...
<ds:Reference URI="#...">
...
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>

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

Αναφορές

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated