Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an dieHackTricks und HackTricks Cloud GitHub-Repositorys einreichen.
Yaml Deserialisierung
Yaml-Python-Bibliotheken können auch Python-Objekte serialisieren und nicht nur Rohdaten:
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
Überprüfen Sie, wie das Tuple kein Rohdatentyp ist und daher wurde es serialisiert. Und dasselbe geschah mit dem Range (aus den eingebauten Funktionen).
safe_load() oder safe_load_all() verwendet SafeLoader und unterstützt keine Deserialisierung von Klassenobjekten. Beispiel für die Deserialisierung von Klassenobjekten:
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
Der vorherige Code verwendete unsafe_load, um die serialisierte Python-Klasse zu laden. Dies liegt daran, dass es in Version >= 5.1 nicht erlaubt ist, eine serialisierte Python-Klasse oder Klassenattribut zu deserialisieren, wenn im load() kein Loader angegeben ist oder Loader=SafeLoader.
Alte Versionen von pyyaml waren anfällig für Deserialisierungsangriffe, wenn Sie den Loader nicht angegeben haben, beim Laden von etwas: yaml.load(data)
Hinweis: In neueren Versionen können Sie nicht mehr .load() aufrufenohne einen Loader und der FullLoader ist nicht mehr anfällig für diesen Angriff.
RCE
Benutzerdefinierte Payloads können mithilfe von Python YAML-Modulen wie PyYAML oder ruamel.yaml erstellt werden. Diese Payloads können Schwachstellen in Systemen ausnutzen, die nicht vertrauenswürdige Eingaben ohne ordnungsgemäße Säuberung deserialisieren.