Yaml Python biblioteke is ook in staat om Python-voorwerpe te deserialiseer 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
Kyk hoe die tuple nie 'n rou tipe data is nie en daarom was dit geserializeer. En dieselfde het gebeur met die range (geneem van die builtins).
safe_load() of safe_load_all() gebruik SafeLoader en ondersteun nie die deserialisering van klassieke voorwerp nie. Voorbeeld van die deserialisering van 'n klassieke voorwerp:
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 geserializeerde Python-klas te laai. Dit is omdat in weergawe >= 5.1, dit nie toelaat om enige geserializeerde Python-klas of klasattribuut te deserialiseer nie, met Loader nie gespesifiseer in load() of Loader=SafeLoader.
Merk op dat in onlangse weergawes jy nie meer .load() kan roep sonder 'n Loader nie en die FullLoader is nie meer vatbaar vir hierdie aanval nie.
RCE
Aangepaste vragte kan geskep word met behulp van Python YAML-modules soos PyYAML of ruamel.yaml. Hierdie vragte kan kwesbaarhede in stelsels uitbuit wat onbetroubare insette deserialiseer sonder behoorlike sanitisering.