Yaml पायथन पुस्तकालय भी पायथन ऑब्जेक्ट्स को सीरियलाइज़ करने में सक्षम है और केवल कच्चे डेटा नहीं:
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
जांचें कि tuple कच्चे डेटा का प्रकार नहीं है और इसलिए इसे serialized किया गया था। और यही range के साथ हुआ (जो builtins से लिया गया है)।
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 का उपयोग किया ताकि सीरियलाइज्ड पायथन क्लास को लोड किया जा सके। इसका कारण यह है कि संस्करण >= 5.1 में, यह किसी भी सीरियलाइज्ड पायथन क्लास या क्लास एट्रिब्यूट को डीसिरियलाइज करने की अनुमति नहीं देता, जब लोड() में लोडर निर्दिष्ट नहीं किया गया हो या Loader=SafeLoader हो।
ध्यान दें कि हाल के संस्करणों में आप बिना Loader के .load()को अब नहीं बुला सकते और FullLoaderअब इस हमले के प्रति संवेदनशील नहीं है।
RCE
कस्टम पेलोड्स को PyYAML या ruamel.yaml जैसे Python YAML मॉड्यूल का उपयोग करके बनाया जा सकता है। ये पेलोड्स उन सिस्टम में कमजोरियों का फायदा उठा सकते हैं जो बिना उचित सफाई के अविश्वसनीय इनपुट को डेसिरियलाइज करते हैं।