در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به ادامه آشنایی با برخی از قابلیت های زبان PHP می پردازیم.
PHP Comparison Oddities
این تصویر از خود وب سایت php.net گرفته شدهاست. مقایسههای برجسته شده در بالا مثالی از چگونگی نشان دادن عجیب و غریب بودن Loose Comparisons در PHP هستند. به عنوان مثال:
“php” == 0
-1 == TRUE
0 == NULL
array() == NULL
نمونه بالا جامع نیست، اما جالب است که مقادیر خاصی در PHP مبهم هستند زیرا این چیزی نیست که یک توسعه دهنده انتظار آن را داشته باشد. یک مثال دیگر از این موضوع عجیب و غریب:
-1 == TRUE
1 == TRUE
1 != -1
دلیل برخی از این شگفتیها این است که PHP چگونه مقادیر را تبدیل میکند.
ممکن است ابتدا -1 را به عنوان یک مقدار رشته در نظر بگیرد و قبل از مقایسه آن با true، – را حذف کند.
با این حال در مقایسه با یک عدد صحیح به عنوان یک مقدار منفی در نظر گرفته میشود.
Zero is Evaluated in Unexpected Ways
Simple Machine Forum این مساله را داشت. در این مثال، تابع بازیابی کلمه عبور نشان داده شد:
این ساختار میتواند یک رمز عبور ۱۰ رقمی و یک one-time password با هر کاراکتر از صفر تا 9 و از a تا f ایجاد کند، زیرا به یک تابع هشMD5 منتقل میشود. اکنون، چیزی که جالبتر است “!=” یا “==” میباشد. کاری که به مهاجم اجازه میدهد انجام دهد این است که صبر کند تا 0e نشان داده شود، که به عنوان یک توان (عدد) 0 ارزیابی میشود، که به یک عدد صحیح (0) تبدیل میشود و اجازه دور زدن احراز هویت هر کاربر (از جمله مدیر) را میدهد.
در نمونه انجمنی (Simple Machine Forum) که ما توضیح میدهیم، فرآیند کاری میتواندبه صورت خودکار انجام شود، به طوری که کدهای “forget password” مربوط به بازنشانی رمز عبور میتوانند در یک فرآیند حدود 5000 تا 10000 درخواستی (Brute Force) به 0e (0) یا 1e (1) برسد.
ارسال این درخواستها، در نسخه اصلی انجمن، ممکن بوده و حدود یک ساعت زمان برای آن نیاز است. بعد از اعمال Patch، آنها توانایی درخواست این توکنها را به حدود ۲۰ ثانیه برای هر ۵ درخواست کاهش دادند. این کار هنوز هم به مهاجمان این امکان را میدهد که ظرف چند ساعت این حمله را انجام دهند.
www.ptsecurity.com/ww-en/analytics/threatscape/pt-2012-29/
Null and Zero
زبان PHP، Null و صفر را در نظر میگیرد تا هر دو با هم ارزیابی شوند و به عنوان true در نظر گرفته شوند. اگرچه این مساله در ظاهر ممکن است مساله بزرگی به نظر نرسد، اما در واقع میتواند به این دلیل باشد که بسیاری از توسعه دهندگان انتظار خطا یا شرایط NULL را در برنامه کاربردی خود ندارند. شما باید به این مساله باور داشته باشید که توسعه دهندگان این کار اشتباه را انجام خواهند داد. به طور معمول، شرایط NULL به شیوهای کاملا متفاوت به سیستم منتقل میشود که باعث میشود توسعه دهندگان انتظار نداشته باشند که این خطاها را نشان دهند.
Type Juggling Example Using the PHP Interactive Shell
در این مثال، ما از پوسته تعاملی جدید PHP استفاده میکنیم. این پوسته تعاملی میتواند شما را قادر به تست، Build و بررسی نحوه رفتار PHP کند. موضوع بعدی ویژگی var_dump در PHP است. این ویژگی به شما این امکان را میدهد تا هر Expression، Evaluations و متغیرهایی که به آن منتقل میکنید را Dump کنید.
به مثال زیر توجه کنید:
$a = 1; <- This should be an integer of 1.
$b = 2; <- This should be an integer of 2.
$c = ‘1’; <- This should be a string of 1.
Causing Null Conditions
تنها چند راه وجود دارد که ما میتوانیم شرایط NULL را در PHP تحتتاثیر قرار دهیم. یکی از عملیترین راههای انجام این کار این است که پارامترهای موجود را تحتتاثیر قرار دهیم تا نه تنها به عنوان رشته یا اعداد صحیح بلکه به عنوان آرایه عمل کنیم. PHP شما را قادر میسازد که این کار را انجام دهید، به شرط اینکه شما بدانید چگونه باید این کار انجام شود. یکی از راههای ایجاد NULL این است که فقط دو نوع را که نباید با هم مقایسه شوند، مقایسه کنید. نه تنها PHP، بلکه بسیاری از زبان ها این نقص را دارند و آنچه PHP را منحصر به فرد می کند چند چیز است:
• NULL ها به صورت صفر بازگردانده میشوند.
• مقایسه رشتهای که با شکست مواجه میشود و به صورت NULL ارزیابی خواهد شد.
یک راه ساده برای انجام این کار، الحاق براکت ها [ ] پس از پارامترها است. این دقیقا روشی است که میتوانید رفتارهای غیر منتظره در برنامه ایجاد کنید.