چگونه توانستم آسیب‌پذیری CRLF Injection را بر روی PayPal کشف کنم؟

چگونه توانستم آسیب‌پذیری CRLF Injection را بر روی PayPal کشف کنم؟

۸۰۴

آن‌چه می‌خوانید، رایتاپ عباس هیبتی، محقق امنیتی، کارشناس تست نفوذ در حوزه‌ی بانکی و شکارچی آسیب‌پذیری، از فرآیند کشف آسیب‌پذیری بر روی یک برنامه‌ی باگ‌بانتی PayPal در پلتفرم باگ‌بانتی هکروان است.

داخل پرانتز:

عباس هیبتی گزارش مربوط به این آسیب‌پذیری‌ را حدود ۲ ماه قبل بر روی برنامه‌ی باگ‌بانتی PayPal ثبت کرده و در حال حاضر این آسیب‌پذیری رفع شده است.

برویم سراغ اصل مطلب؛ رایتاپ

سلام خدمت همه‌ی دوستان با رایتاپ CRLF Injection در خدمتتون هستیم. من یک نکته را ابتدای کار بگم: " من سعی می‌کنم روان بنویسم و خیلی عامیانه تایپ کنم تا جنبه‌ی کتابی نداشته باشه. "

قبل هر چیزی یه مقدار راجع به CRLF توضیح بدم:

طبق توضیح acunetix.com حمله‌ی تزریق CRLF یکی از انواع attack injection است که می‌توان از آن برای افزایش حملات مخرب مانند Cross-Site Scripting (XSS) ، page injection, web cache poisoning, cache-based defacement گونه‌های Stored، DOM-Based و Reflected و موارد دیگر استفاده کرد. اگر مهاجم بتواند کاراکترهای CRLF را به یک برنامه وب تزریق کند، به عنوان مثال با استفاده از فرم ورودی کاربر یا درخواست HTTP، می‌توان نتیجه گرفت که آسیب‌پذیری تزریق CRLF وجود دارد.

کلمه‌ی CRLF به مخفف Carriage Return و Line Feed اشاره دارد. CR و LF نویسه‌های خاصی هستند ( به‌ترتیب به آن‌ها ASCII 13 و 10 \ r \ n نیز گفته می‌شود) که برای نشان‌دادن پایان خط (EOL) استفاده می‌شوند. توالی CRLF در سیستم‌عامل‌هایی از جمله (Windows Linux/UNIX ) و پروتکل‌های اینترنتی از جمله HTTP استفاده می‌شود.

دو مورد متداول از حملات تزریق CRLF وجود دارد:

log poisoning و HTTP response splitting در حالت اول، مهاجم با درج انتهای یک خط و یک خط اضافی، ورودی‌های فایل log را جعل می‌کند. این می‌تواند برای مخفی‌کردن حملات دیگر یا سردرگم‌کردن مدیران سیستم استفاده شود. در مورد دوم ، تزریق CRLF می‌تواند برای افزودن هدرهای HTTP به پاسخ HTTP و برای مثال انجام یک حمله‌ی XSS که منجر به افشای اطلاعات می‌شود، استفاده شود. یک تکنیک مشابه ، به نام تزریق SMTP headers، نیز ممکن است برای افزودن هدرهای SMTP به ایمیل‌ها یا تنظیم‌کردن یک کوکی در هدر برگشت، استفاده شود که در این رایتاپ خواهید دید.

HTTP Response Splitting چیست؟

پروتکل HTTP از دنباله CRLF برای نشان‌دادن جایی که یک Header پایان می‌یابد و سرآمد (line) دیگری شروع می‌شود، استفاده می‌کند. هم‌چنین از آن برای نشان‌دادن جایی که Headerها پایان می‌یابد و محتوای وب‌سایت شروع می‌شود، استفاده می‌کند.

اگر مهاجم یک CRLF وارد کند، می تواند یک سرصفحه‌ی جدید اضافه کند. برای مثال به وسیله‌ی یک سربرگ location، مهاجم می‌تواند کاربر را به وب‌سایت دیگری هدایت کند. مهاجم ممکن است از این تکنیک برای phishing یا defacing و حتی SSRF استفاده کند. این تکنیک HTTP header injection نامیده می‌شود.

اگر مهاجم یک double CRLF وارد کند، می‌تواند هدرهای HTTP را زودتر خاتمه دهد و محتوا را قبل از محتوای واقعی وب‌سایت تزریق کند. محتوای تزریق‌شده می‌تواند حاوی کد جاوااسکریپت باشد. هم‌چنین می‌توان آن را به گونه‌ای پیلود کرد که محتوای واقعی وب‌سایت که از سرور وب آمده است، توسط مرورگر وب نادیده گرفته شود. به این ترتیب HTTP response splitting در ترکیب با Cross-site Scripting (XSS) استفاده می‌شود. (اگر ساده‌تر بخوام بگم :"ما با اینترکردن به صورت دو بار در هدر به قسمت body میایم حالا می‌تونیم تو body کد بزنیم و اجرا کنیم .")

به عنوان مثال به گوگل که سرچ کردم نگاه کنید:

Image

با تکرار دو بار CRLF پیلود XSS جاوااسکریپت در body قرار داده است .

این یک نمای کلی بود از حمله CRLF Injection که برای مقدمه من توضیح دادم. بریم سر بحث اصلی CRLF که بنده روی PayPal زدم.

من روی PayPal چی کار کردم؟

اولین قدم کل ساب‌دامین‌های PayPal رو استخراج کردم و توی یه فایل ذخیره کردم، برای این که بتونم تست خودم رو به صورت اسکریپت انجام بدم. خب منطقی نیست من دستی بشینم رو تمام دامنه‌ها و پارامترها attack رو چک کنم!

بعد از تست لیست Payloadهای CRLF بر روی دامنه‌ها متوجه شدم روی دامنه‌ی اصلی Paypal.com آسیب‌پذیری CRLF وجود دارد. من لیست پیلودها رو هم براتون می‌ذارم استفاده کنید.

Link : https://raw.githubusercontent.com/infosec-au/fuzzdb/master/attack-payloads/http-protocol/crlf-injection.fuzz.txt

لیست‌های زیاد هست از پیلودها؛ بعضی‌هاشونم تکی هست که شما باید خودتون یه منبع درست کنین و این‌ها رو ذخیره کنید برای تست.

پیلودی که استفاده کردم روی دامنه این بود:

https://paypal.com/%0D%0ASet-Cookie:crlfinjection=abbas.heyabti

Image

من log برنامه burp رو هم برای شما قرار می‌دم تا دقیق‌تر بررسی کنیم. من وقتی این پیلود رو اجرا کردم در برگشت جواب کوکی Set-Cookie:crlfinjection=abbas.heyabtii ست شد.

Image

چرا این اتفاق افتاد؟

Line feed = \n (%0a) Carriage Return = \r (%0d)

ابتدای پیلود ما با %0D%0A شروع شده که براتون فرم کلیش رو بالا گذاشتم زمانی که این EOLها در هدر سربرگ بشینه یه اینتر می‌خوره میاد پایین و ادامه‌ی پیلود ما نوشته می‌شه که Set-Cookie:crlfinjection=abbas.heyabti بود و من دو مورد رو برای PayPal گزارش کردم که مورد POC بعدی به صورت چندگانه یا همون Multiple CRLF Injection بود.

Image

کاری که تو این پیلود انجام دادم بیش‌تر این بود که بگم هر تعداد هدر می‌شه ست کرد و حتی می‌شه با تعداد زیاد این نوع درخواست اختلال ایجاد کرد در سرویس. توضیح‌های تکمیلی‌ای که براشون گفتم این بود که PayPal یه بانک هست و این نوع از آسیب‌پذیری‌ها برای این تیپ از سازمان خیلی خطرناک هست.

ولی در کل این باگ بسته به نوع سازمان و موقعیت باگ بین High و Medium بسته می‌شه.

با آرزوی سلامتی و موفقیت

سایر رایتاپ‌های منتشرشده:

چگونه توانستم با تغییر آدرس action در فرم، Form Action Hijacking انجام بدم؟

چگونه توانستم با پارامتر refurl بر روی وب‌سایت ‌Digikala.com آسیب‌پذیری‌های XSS Stored و XSS Reflected را کشف کنم؟

حمله‌ی HTTP Flooding در تایید ایمیل برای سوءاستفاده بدون دخالت کاربر

بلاگ‌پست‌های مرتبط:

آسیب‌پذیری iframe Injection؛ پیدای پنهان

آسیب‌پذیری Command Injection؛ دربست تا دروازه‌ی بزرگ دسترسی

SQL Injection؛ راهبردها و ترفندها