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 δεν είναι ένας ακατέργαστος τύπος δεδομένων και επομένως έχει serializied. Και το ίδιο συνέβη με το 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.
Σημειώστε ότι στις πρόσφατες εκδόσεις δεν μπορείτε πλέον να καλέσετε το .load()χωρίς έναν Loader και ο FullLoaderδεν είναι πλέον ευάλωτος σε αυτήν την επίθεση.
RCE
Μπορούν να δημιουργηθούν προσαρμοσμένα payloads χρησιμοποιώντας Python YAML modules όπως το PyYAML ή το ruamel.yaml. Αυτά τα payloads μπορούν να εκμεταλλευτούν ευπάθειες σε συστήματα που αποδομούν μη αξιόπιστη είσοδο χωρίς κατάλληλο καθαρισμό.