Biblioteki Yaml w Pythonie potrafią również serializować obiekty pythonowe, a nie tylko surowe dane:
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
Sprawdź, jak krotka nie jest surowym typem danych i dlatego została zaserializowana. To samo stało się z zakresem (pochodzącym z wbudowanych).
safe_load() lub safe_load_all() używa SafeLoader i nie obsługują deserializacji obiektów klasy. Przykład deserializacji obiektu klasy:
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
Poprzedni kod użył unsafe_load do wczytania zserializowanej klasy pythona. Wynika to z faktu, że w wersji >= 5.1 nie pozwala na deserializację żadnej zserializowanej klasy pythona lub atrybutu klasy, gdy Loader nie jest określony w load() lub Loader=SafeLoader.
Zauważ, że w najnowszych wersjach nie możesz już wywołać .load()bez Loadera, a FullLoader nie jest już podatny na ten atak.
RCE
Niestandardowe ładunki mogą być tworzone przy użyciu modułów Pythona YAML, takich jak PyYAML lub ruamel.yaml. Te ładunki mogą wykorzystać podatności w systemach, które deserializują niezaufane dane wejściowe bez odpowiedniej sanitacji.