Padding Oracle
CBC - Cipher Block Chaining
In CBC mode the previous encrypted block is used as IV to XOR with the next block:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fdefuse.ca%2Fimages%2Fcbc_encryption.png&width=768&dpr=4&quality=100&sign=b64f8495&sv=1)
To decrypt CBC the opposite operations are done:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fdefuse.ca%2Fimages%2Fcbc_decryption.png&width=768&dpr=4&quality=100&sign=c360e6cd&sv=1)
Notice how it's needed to use an encryption key and an IV.
Message Padding
As the encryption is performed in fixed size blocks, padding is usually needed in the last block to complete its length.
Usually PKCS7 is used, which generates a padding repeating the number of bytes needed to complete the block. For example, if the last block is missing 3 bytes, the padding will be \x03\x03\x03
.
Let's look at more examples with a 2 blocks of length 8bytes:
byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | 0x02 | 0x02 |
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 0x03 | 0x03 | 0x03 |
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 0x05 | 0x05 | 0x05 | 0x05 | 0x05 |
P | A | S | S | W | O | R | D | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 |
Note how in the last example the last block was full so another one was generated only with padding.
Padding Oracle
जब एक एप्लिकेशन एन्क्रिप्टेड डेटा को डिक्रिप्ट करता है, तो यह पहले डेटा को डिक्रिप्ट करेगा; फिर यह पैडिंग को हटा देगा। पैडिंग की सफाई के दौरान, यदि एक अमान्य पैडिंग एक पहचानने योग्य व्यवहार को ट्रिगर करती है, तो आपके पास एक पैडिंग ओरेकल भेद्यता है। पहचानने योग्य व्यवहार एक त्रुटि, परिणामों की कमी, या एक धीमी प्रतिक्रिया हो सकती है।
यदि आप इस व्यवहार का पता लगाते हैं, तो आप एन्क्रिप्टेड डेटा को डिक्रिप्ट कर सकते हैं और यहां तक कि किसी भी स्पष्ट पाठ को एन्क्रिप्ट कर सकते हैं।
How to exploit
You could use https://github.com/AonCyberLabs/PadBuster to exploit this kind of vulnerability or just do
किसी साइट के कुकी की संवेदनशीलता का परीक्षण करने के लिए आप कोशिश कर सकते हैं:
Encoding 0 का मतलब है कि base64 का उपयोग किया गया है (लेकिन अन्य उपलब्ध हैं, मदद मेनू की जांच करें)।
आप इस कमजोरियों का दुरुपयोग करके नए डेटा को एन्क्रिप्ट भी कर सकते हैं। उदाहरण के लिए, कल्पना करें कि कुकी की सामग्री "_user=MyUsername_" है, तो आप इसे "_user=administrator_" में बदल सकते हैं और एप्लिकेशन के अंदर विशेषाधिकार बढ़ा सकते हैं। आप इसे paduster
का उपयोग करके -plaintext** पैरामीटर निर्दिष्ट करके भी कर सकते हैं:
यदि साइट कमजोर है तो padbuster
स्वचालित रूप से यह पता लगाने की कोशिश करेगा कि पैडिंग त्रुटि कब होती है, लेकिन आप -error पैरामीटर का उपयोग करके त्रुटि संदेश को भी इंगित कर सकते हैं।
सिद्धांत
संक्षेप में, आप सभी विभिन्न पैडिंग बनाने के लिए उपयोग किए जा सकने वाले सही मानों का अनुमान लगाकर एन्क्रिप्टेड डेटा को डिक्रिप्ट करना शुरू कर सकते हैं। फिर, पैडिंग ऑरेकल अटैक अंत से शुरू होकर सही मान का अनुमान लगाते हुए बाइट्स को डिक्रिप्ट करना शुरू करेगा जो 1, 2, 3, आदि की पैडिंग बनाता है।
कल्पना करें कि आपके पास कुछ एन्क्रिप्टेड टेक्स्ट है जो 2 ब्लॉक्स में फैला हुआ है जो E0 से E15 तक के बाइट्स से बना है। अंतिम ब्लॉक (E8 से E15) को डिक्रिप्ट करने के लिए, पूरा ब्लॉक "ब्लॉक सिफर डिक्रिप्शन" के माध्यम से जाता है जिससे मध्यवर्ती बाइट्स I0 से I15 उत्पन्न होते हैं। अंत में, प्रत्येक मध्यवर्ती बाइट को पिछले एन्क्रिप्टेड बाइट्स (E0 से E7) के साथ XOR किया जाता है। तो:
C15 = D(E15) ^ E7 = I15 ^ E7
C14 = I14 ^ E6
C13 = I13 ^ E5
C12 = I12 ^ E4
...
अब, यह संभव है कि आप E7
को संशोधित करें जब तक C15
0x01
न हो, जो एक सही पैडिंग भी होगी। तो, इस मामले में: \x01 = I15 ^ E'7
तो, E'7 को खोजकर, I15 की गणना करना संभव है: I15 = 0x01 ^ E'7
जो हमें C15 की गणना करने की अनुमति देता है: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7
C15 को जानकर, अब C14 की गणना करना संभव है, लेकिन इस बार पैडिंग \x02\x02
को ब्रूट-फोर्स करते हुए।
यह BF पिछले वाले के समान जटिल है क्योंकि यह E''15
की गणना करना संभव है जिसका मान 0x02 है: E''7 = \x02 ^ I15
इसलिए केवल E'14
को खोजने की आवश्यकता है जो C14
को 0x02
के बराबर बनाता है।
फिर, C14 को डिक्रिप्ट करने के लिए वही कदम उठाएं: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6
इस श्रृंखला का पालन करें जब तक आप पूरे एन्क्रिप्टेड टेक्स्ट को डिक्रिप्ट न कर लें।
भेद्यता का पता लगाना
एक रजिस्टर और खाता बनाएं और इस खाते से लॉग इन करें। यदि आप कई बार लॉग इन करते हैं और हमेशा एक ही कुकी प्राप्त करते हैं, तो संभवतः एप्लिकेशन में कुछ गलत है। कुकी हर बार लॉग इन करते समय अद्वितीय होनी चाहिए। यदि कुकी हमेशा एक सी है, तो यह संभवतः हमेशा मान्य होगी और इसे अमान्य करने का कोई तरीका नहीं होगा।
अब, यदि आप कुकी को संशोधित करने की कोशिश करते हैं, तो आप देख सकते हैं कि आपको एप्लिकेशन से एक त्रुटि मिलती है। लेकिन यदि आप पैडिंग को BF करते हैं (उदाहरण के लिए padbuster का उपयोग करते हुए) तो आप एक अन्य उपयोगकर्ता के लिए मान्य कुकी प्राप्त करने में सफल होते हैं। यह परिदृश्य padbuster के लिए अत्यधिक संभावित रूप से संवेदनशील है।
संदर्भ
Last updated