Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na göz atın (https://github.com/sponsors/carlospolop)!
Yaml python kütüphaneleri aynı zamanda python nesnelerini serileştirmek için de yeteneklidir ve sadece ham verileri değil:
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
Kontrol et tuple'ın ham veri türü olmadığını ve bu nedenle serileştirildiğini. Ve aynı şey range ile de oldu (builtins'ten alındı).
safe_load() veya safe_load_all() SafeLoader'ı kullanır ve sınıf nesnesi deserializasyonunu desteklemez. Sınıf nesnesi deserializasyonu örneği:
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
Önceki kod, serileştirilmiş python sınıfını yüklemek için unsafe_load kullanıyordu. Bu, sürüm >= 5.1'de, load() içinde Loader belirtilmediğinde veya Loader=SafeLoader olarak belirtilmediğinde serileştirilmiş herhangi bir python sınıfını veya sınıf özelliğini deserialize etmeye izin vermemesinden kaynaklanmaktadır.
Not edin ki son sürümlerde artık .load()çagrılamazbir Loader olmadan ve FullLoader artık bu saldırıya duyarlı değil.
Uzaktan Kod Çalıştırma (RCE)
Özel yükler, Python YAML modülleri olan PyYAML veya ruamel.yaml kullanılarak oluşturulabilir. Bu yükler, güvenilmeyen girdileri doğru şekilde temizlemeden ayrıştıran sistemlerdeki zafiyetleri sömürebilir.