در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به Authentication Bypass در یک اسکریپت PHP می پردازیم.
Authentication Bypass in The Wild : C99 Backdoor
یک مثال از یک Backdoor وب شل C99 است. اگرچه هرگز استفاده از یک شل ناشناخته توصیه نمیشود، اما این یک مثال عالی از ایجاد یک درب پشتی به صورت پنهان در وب سایت است.
Backdoorاز یک تابع php به نام extract() استفاده میکند که متغیرها را به جدول نماد فعلی در حافظه وارد میکند. مهمتر از همه اینکه، اگر شما مقدار $_GET یا $_POST را به عنوان یک Extract در نظر بگیرید، میتوانید متغیرها را بدون هیچ گونه احراز هویت از پارامترهای GET و POST تغییر دهید. این موضوع خطرناک خواهد بود.
مرجع
us3.php.net/manual/en/function.extract.php
در این مثال، برای Bypass احراز هویت در C99 و عبور از یک متغیر (login) کافی است که مقدار c99shcook را به صفر تغییر دهیم.
C99 Backdoor Example Using Extract
در اینجا کدی که از پارامتری به نام c99shcook استفاده میکند و آن را برای Extract از هر مقدار $_REQUEST عبور میدهد، آورده شدهاست.
این به مهاجم این امکان را میدهد که متغیرهای خود را به هر چیزی که میخواهد منتقل کند. این فریبنده است زیرا اگر شما به چیزی مانند یک متغیر ورود به سیستم برای ارزیابی یک راه خاص نیاز دارید، مانند تنظیم آن بر روی ۰ یا ۱، این به شما این امکان را میدهد که این متغیر را به عنوان آن مقدار صحیح که از تمام منطق تصدیق و رمز عبور دور است، عبور دهید. در واقع، این یک Backdoor در یک Backdoor است.
C99 Authentication Logic
در این مورد، متغیر ورود باید قبلا بر روی یک مقدار در کد PHP تنظیم شود که همچنین برای ورود توسط کاربر به یک نام کاربری و رمز عبور نیاز دارد.
این برای مهاجم هوشمندانه است: او به مقایسههای آزادانه و دقیق دست یافت. همان طور که میبینید، او از !=$login و در همان زمان از === false استفاده نموده است. او از یک منطق جالب (تقریبا برعکس) استفاده میکند تا بررسی کند که آیا کسی به درستی وارد سیستم شدهاست یا نه. با این حال، او از یک لحاظ باهوش است که پنهانی است. او یک if به لاگین دارد اما else ای برای die تعریف نشده است. این مورد به “PHP” چه میگوید؟
اگر $login تنظیم شود، متغیر ورود به سیستم را بررسی میشود. متغیر ورود به سیستم را میتوان از طریق یک فرم لاگین از نوع post به سیستم یا از طریق یک $_GET بر روی URL اضافه کرد. با این حال، $login نیز با != که برابر منفی است بررسی می شود. چه میشود اگر مهاجم بتواند $login را کنترل کند و آن را به 0 برساند، که != اولیه را دور میزند اما در پایان توسط هیج else ای بررسی نمیشود.
پس بیایید منطق را دنبال کنیم.
اگر $login روی صفر تنظیم شدهباشد، رمز عبور وجود نخواهد داشت، بنابراین یک MD5از رشته خالی خواهیم داشت.
جمله بعدی در صورتی مقایسه میشود که PHP _ AUTH _ USER برابر با $login نباشد. از آنجا که $login صفر خواهد بود، این اعمال نمیشود.
سپس REST منطق نیز به کار نمیرود.
$login هنوز روی صفر تنظیم شده است.
هیچ منطق ورود دیگری برای انکار کاربر وجود ندارد زیرا else اصطلاحا Miss شده است، بنابراین اکنون به کاربر اجازه دسترسی داده میشود.