Поділіться своїми хакерськими трюками, надсилайте PR доHackTricks та HackTricks Cloud репозиторіїв GitHub.
Yaml Десеріалізація
Бібліотеки 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
Перевірте, як кортеж не є сировим типом даних, тому він був серіалізований. Те ж саме сталося з діапазоном (взято з вбудованих).
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 або атрибут класу, якщо в load() не вказано Loader або Loader=SafeLoader.
Зверніть увагу, що в останніх версіях ви не можете більше викликати .load()без Loader, і FullLoader вже не є вразливим до цього виду атаки.
RCE
Власні вразливості можна створювати за допомогою модулів Python YAML, таких як PyYAML або ruamel.yaml. Ці вразливості можуть використовувати уразливості в системах, які десеріалізують ненадійний ввід без належної санітаріїзації.