Μοιραστείτε τα hacking tricks σας υποβάλλοντας PRs σταHackTricks και HackTricks Cloud αποθετήρια του github.
Αποσειροποίηση Yaml
Οι βιβλιοθήκες Yaml της python είναι επίσης ικανές να αποσειροποιήσουν αντικείμενα της python και όχι μόνο ακατέργαστα δεδομένα:
print(yaml.dump(str("lol")))
lol
...
print(yaml.dump(tuple("lol")))
!!python/tuple
- l
- o
- l
print(yaml.dump(range(1,10)))
!!python/object/apply:builtins.range
- 1
- 10
- 1
Ελέγξτε πώς το tuple δεν είναι ένας ακατέργαστος τύπος δεδομένων και γι' αυτό σειριοποιήθηκε. Και το ίδιο συνέβη με το range (που προέρχεται από τα builtins).
Οι safe_load() ή safe_load_all() χρησιμοποιούν τον SafeLoader και δεν υποστηρίζουν την αποσειριοποίηση αντικειμένων κλάσης. Παράδειγμα αποσειριοποίησης αντικειμένου κλάσης:
import yamlfrom yaml import UnsafeLoader, FullLoader, Loaderdata =b'!!python/object/apply:builtins.range [1, 10, 1]'print(yaml.load(data, Loader=UnsafeLoader))#range(1, 10)print(yaml.load(data, Loader=Loader))#range(1, 10)print(yaml.load_all(data))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=Loader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=UnsafeLoader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=FullLoader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.unsafe_load(data))#range(1, 10)print(yaml.full_load_all(data))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.unsafe_load_all(data))#<generator object load_all at 0x7fc4c6d8f040>#The other ways to load data will through an error as they won't even attempt to#deserialize the python object
Ο προηγούμενος κώδικας χρησιμοποιούσε την unsafe_load για να φορτώσει την σειροποιημένη κλάση Python. Αυτό συμβαίνει επειδή στην έκδοση >= 5.1, δεν επιτρέπεται να αποσειροποιηθεί οποιαδήποτε σειροποιημένη κλάση Python ή γνώρισμα κλάσης, χωρίς να καθορίζεται ο φορτωτής (Loader) στην load() ή Loader=SafeLoader.
Βασική Εκμετάλλευση
Παράδειγμα για το πώς να εκτελέσετε έναν χρόνο αναμονής (sleep):
Σημείωση ότι σε πρόσφατες εκδόσεις δεν μπορείτε πλέον να καλέσετε το .load()χωρίς ένα Loader και το FullLoader δεν είναι πλέον ευάλωτο σε αυτήν την επίθεση.
RCE
Προσαρμοσμένα φορτία μπορούν να δημιουργηθούν χρησιμοποιώντας τα Python YAML modules, όπως το PyYAML ή το ruamel.yaml. Αυτά τα φορτία μπορούν να εκμεταλλευτούν ευπάθειες σε συστήματα που αποσειριοποιούν μη αξιόπιστη είσοδο χωρίς κατάλληλη απολύμανση.