دوره تست نفوذ وب سطح متوسط – بخش بیستم و یکم

در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به آشنایی با برخی از قابلیت های زبان PHP می پردازیم.

Modern PHP

PHP نسخه 7 یک مفسر جدید PHP مدرن را به این صنعت می‌آورد که به طور قابل‌توجهی سریع‌تر از PHP ۵ است زیرا درس‌های آموخته‌شده از Facebooks HHVM را دریافت کرده است. همانند PHP نسخه 7، در حال حاضر مجموعه‌ای از استانداردهای PHP به نام PSR وجود دارد – اولین مورد، استاندارد autoloader.php PSR0* است. PHP Framework Interoperability Group یا PHP-FIG، بدنه حاکم برای این استانداردهای جدید است.

PHP نسخه 7 یک موتور Zend جدید (Zend۳) را پیش برد که شامل پشتیبانی جدید AST(Abstract Syntax Tree) Compilation بود.

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

توجه داشته باشید که PSR0 توسط PSR4 جایگزین شد که در آن autoloader به دلیل پیچیدگی فضای نام و همپوشانی در دایرکتوری‌ها تغییر کرد.

PHP Issues Still Present in Modern PHP

PHP مسائل بسیاری دارد که در PHP مدرن یافت می‌شود و می‌تواند مورد سو استفاده قرار گیرد تا امکان Bypass مکانیزم‌ها را برای مهاجم فراهم کند.
Zend Engine3، که آخرین موتور PHP در PHP نسخه 7 است، بسیار سریع‌تر از بازبینی قبلی است اما از نقص‌های زیادی نیز رنج می‌برد. به عنوان مثال، محققان Checkpoint، برای اجرای حملات به مفسر، از deserialization در PHP نسخه 7 استفاده می‌کنند

blog.checkpoint.com/wp-content/uploads/2016/08/Exploiting-PHP-7-unserialize-Report-160829.pdf

Comparisons در PHP همیشه به دلیل نوع استنتاج غیر معمول بوده‌است و همانطور که در چند تمرین بعدی خواهیم دید، لیست مسائل مربوط به Comparisons طولانی است.

Type Inference Issues in PHP

PHP مانند بسیاری از موتورهای اسکریپتی، Dynamic Type Inference را دارد. خود موتور دارای مقدار تخصیص بسیار آزاد است که گاهی اوقات بسیار مفید خواهد بود. در مثال زیر، PHP مقادیر Integer را قبل از تفسیر مقادیر String خواهد دید. سپس رشته‌ها را برای مقایسه یا عملیات ریاضی به اعداد صحیح تبدیل می‌کند.

به همین ترتیب،PHP اعداد صحیح را که با صفر شروع می‌شوند به عنوان مقادیر Octal در نظر می‌گیرد که تبدیل را حتی عجیب‌تر می‌کند زیرا PHP ابتدا تبدیل می‌کند و سپس عملیات مناسب را انجام می‌دهد.

مراجع

secure.php.net/manual/en/language.types.type-juggling.php
www.php.net/manual/en/language.types.integer.php

اگرچه ما تنها در این فصل به اضافه شدن توجه می‌کنیم، مهم است که توجه داشته باشید که هر عملیات ریاضی می‌تواند باعث رخ دادن این وضعیت شود. برای افرادی که واقعا در مورد این نوع تحقیقات جدی هستند، توصیه می‌کنم به کد اصلی که شامل عملیات‌های ریاضی است نگاه کنید تا ببینید چگونه این اتفاق می‌افتد.

مراجع

github.com/php/php-src/blob/master/Zend/zend_operators.c

این تابع به شرح زیر است:

Strings in PHP

در PHP، شرایط خاصی موجب Type Juggling خودکار می‌شود. یکی از این شرایط عملیات ریاضی و دیگری مقایسه‌های آزاد (Loose Comparisons) است.

شرط اولی که ما در اینجا نشان خواهیم داد این است که PHP یک رشته شامل یک عدد صحیح را تبدیل خواهد کرد و محتویات غیر صحیح را از بین می‌برد. مثال بالا را در نظر بگیرید:

$foo = “0” ;

در این مثال، هنوز هم $foo برابر با یک رشته است زیرا هیچ عملیات مقایسه‌ای یا عملیات جمع کردن وجود ندارد.

$foo = 5 + “10 little piggies” ;

در این حالت، ۵ به یک رشته “10 little piggies” اضافه می‌شود که در آن ۵ نگهداری می‌شود؛ رشته “10 little piggies” فقط به عدد صحیح ۱۰ تبدیل می‌شود. ۵ و ۱۰ اضافه می‌شوند و رشته دیگر در آن متغیر وجود ندارد. برخی از افرادی که این بخش را می خوانند ممکن است متوجه شده باشند که مشکلات از کجا می توانند در اینجا به وجود بیایند.

PHP Loose and Strict Comparisons

PHP Comparisonsمنطقه دیگری است که باید به آن توجه نمود. نه تنها مقایسه نوع رخ می دهد، بلکه سایر موارد عجیب و غریب نیز ممکن است رخ دهد.

یک مقایسه سست (Loose Comparisons) موردی است که در آن زبان PHP تلاش می‌کند تا استنباط کند که آیا یک توسعه دهنده یکی از اصطلاحات زیر را مد نظر داشته است:

• String
• Integer
• Boolean
• Float

از آنجا که هر یک از اینها می‌تواند ویژگی خاصی داشته باشد، Loose Comparisons سعی می‌کنند بهترین تطابق ممکن را ایجاد کنند و به همین دلیل، رشته‌ها به اعداد صحیح تبدیل خواهند شد تا به توسعه دهنده در ایجاد نرم‌افزار کمک کنند.

While = is an assignment like so:
$a = 1;

دو مساوی (‏==) ‏به عنوان Loose Comparisons استفاده خواهد شد، در حالی که یک آیتم حتی بیگانه مانند سه مساوی، موردی خواهد بود که باید مقایسه دقیقی انجام دهد. مقایسه دقیق موردی خواهد بود که در آن هیچ گونه تداخل Type رخ نخواهد داد و به همین دلیل هرگز برای تبدیل خودکار Type تلاش نخواهد کرد.

مراجع

php.net/manual/en/language.operators.comparison.php

درباره نویسنده: احسان نیک آور

ممکن است دوست داشته باشید