Yaml python biblioteke is ook in staat om python voorwerpe te serialiseer en nie net rou data nie:
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
Kontroleer hoe die tuple nie 'n rou tipe data is nie en daarom is dit geserialiseer. En dieselfde het met die range gebeur (geneem uit die builtins).
safe_load() of safe_load_all() gebruik SafeLoader en ondersteun nie klas objek deserialisering nie. Klas objek deserialisering voorbeeld:
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
Die vorige kode het unsafe_load gebruik om die geserialiseerde python klas te laai. Dit is omdat in weergawe >= 5.1, dit nie toelaat om enige geserialiseerde python klas of klasattribuut te deserialiseer nie, met Loader wat nie gespesifiseer is in load() of Loader=SafeLoader.
Let wel, in onlangs weergawes kan jy nie nie meer .load()sonder 'n Loader aanroep nie en die FullLoader is nie meer kwesbaar vir hierdie aanval nie.
RCE
Pasgemaakte payloads kan geskep word met behulp van Python YAML modules soos PyYAML of ruamel.yaml. Hierdie payloads kan kwesbaarhede in stelsels benut wat onbetroubare invoer deserialiseer sonder behoorlike sanitasie.