Sunday, Mar 10, 2024 at 4:22 PM
March 10, 2024•2,239 words
Fingerprint Web Application Framework (fa-IR)
انگشت نگاری چارچوب برنامه وب (فارسی)
شناسه |
---|
WSTG-INFO-08 |
خلاصه
هیچ چیز جدیدی در زیر نور خورشید وجود ندارد و تقریباً هر برنامه وب که ممکن است به توسعه آن فکر کنید قبلاً توسعه یافته است. با وجود تعداد زیادی از پروژه های نرم افزاری رایگان و متن باز که به طور فعال در سرتاسر جهان توسعه یافته و مستقر شده اند، به احتمال زیاد یک آزمایش امنیتی برنامه با هدفی مواجه خواهد شد که به طور کامل یا تا حدی به این برنامه ها یا چارچوب (فریمورک) های شناخته شده (مثلاً WordPress، phpBB، Mediawiki و غیره) وابسته است. دانستن اجزای برنامه وب که در حال آزمایش هستند کمک قابل توجهی به فرآیند آزمایش می کند و همچنین تلاش مورد نیاز در طول آزمایش را به شدت کاهش می دهد. این برنامه های وب شناخته شده دارای هدرهای HTML، کوکی ها و ساختارهای دایرکتوری هستند که می توان آنها را برای شناسایی برنامه شمارش کرد. اکثر چارچوب های وب دارای چندین نشانگر (marker) در آن مکان ها هستند که به مهاجم یا آزمایش کننده کمک می کند تا آنها را تشخیص دهد. این اساساً کاری است که همه ابزارهای خودکار انجام می دهند، آنها به دنبال یک نشانگر از یک مکان از پیش تعریف شده می گردند و سپس آن را با پایگاه داده امضاهای شناخته شده مقایسه می کنند. برای دقت بهتر معمولا از چندین نشانگر استفاده می شود.
اهداف آزمایش
- انگشت نگاری اجزای مورد استفاده توسط برنامه های وب.
چگونه آزمایش کنیم
آزمایش جعبه سیاه (Black-Box Testing)
چندین مکان متداول (رایج) وجود دارد که باید به منظور شناسایی چارچوب ها یا مؤلفه ها در نظر گرفته شود:
- هدرهای HTTP
- کوکی ها
- کد منبع (سورس کد) HTML
- فایل ها و پوشه های خاص
- پسوند فایل
- پیغام خطا
هدرهای HTTP (HTTP Headers)
ابتدایی ترین شکل شناسایی یک چارچوب وب، نگاه کردن به فیلد X-Powered-By
در هدر پاسخ HTTP (HTTP response header) است. ابزارهای زیادی را می توان برای انگشت نگاری یک هدف استفاده کرد، ساده ترین آنها netcat است.
ا HTTP Request-Response زیر را در نظر بگیرید:
$ nc 127.0.0.1 80
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.0.14
[...]
X-Powered-By: Mono
از فیلد X-Powered-By
، می فهمیم که چارچوب برنامه وب احتمالاً Mono
خواهد بود. با این حال، اگرچه این رویکرد ساده و سریع است، اما این روش در 100% موارد کار نمی کند. این امکان وجود دارد که به راحتی هدر X-Powered-By
را با یک پیکربندی مناسب غیرفعال کنید. همچنین چندین تکنیک وجود دارد که به یک وب سایت اجازه می دهد هدرهای HTTP را مبهم کند (به یک مثال در بخش اصلاح مراجعه کنید). در مثال بالا همچنین می توانیم توجه داشته باشیم که نسخه خاصی از nginx
برای ارائه محتوا استفاده می شود.
بنابراین در همان مثال، آزمایش کننده می تواند هدر X-Powered-By
را از دست بدهد یا پاسخی مانند زیر دریافت کند:
HTTP/1.1 200 OK
Server: nginx/1.0.14
Date: Sat, 07 Sep 2013 08:19:15 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: close
Vary: Accept-Encoding
X-Powered-By: Blood, sweat and tears
گاهی اوقات هدرهای HTTP بیشتری وجود دارد که به یک چارچوب خاص اشاره می کنند. در مثال زیر، با توجه به اطلاعات درخواست HTTP، می توان مشاهده کرد که هدر X-Powered-By
حاوی نسخه PHP است. با این حال، هدر X-Generator
اشاره می کند که چارچوب استفاده شده در واقع Swiftlet
است، که به آزمایش کننده نفوذ کمک می کند تا بردارهای حمله خود را گسترش دهد. هنگام انجام انگشت نگاری، هر هدر HTTP را برای وجود چنین نشتی به دقت بررسی کنید.
HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Sat, 07 Sep 2013 09:22:52 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.16-1~dotdeb.1
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Generator: Swiftlet
کوکی ها (Cookies)
یکی دیگر از روش های مشابه و تا حدودی مطمئن تر برای تعیین چارچوب فعلی وب، کوکی های فریمورک خاص (framework-specific cookies) هستند.
درخواست HTTP زیر را در نظر بگیرید:
\
شکل 1-4.1.8: Cakephp HTTP Request
کوکی CAKEPHP
به طور خودکار تنظیم شده است، که اطلاعاتی در مورد چارچوب مورد استفاده ارائه می دهد. لیستی از نام های رایج کوکی ها در بخش کوکی ها ارائه شده است. هنوز محدودیت هایی در تکیه بر این مکانیسم شناسایی وجود دارد - امکان تغییر نام کوکی ها وجود دارد. به عنوان مثال، برای چارچوب CakePHP
انتخاب شده، این کار را می توان از طریق پیکربندی زیر انجام داد (گزیده ای از core.php
):
/**
* The name of CakePHP's session cookie.
*
* Note the guidelines for Session names states: "The session name references
* the session id in cookies and URLs. It should contain only alphanumeric
* characters."
* @link http://php.net/session_name
*/
Configure::write('Session.cookie', 'CAKEPHP');
با این حال، احتمال ایجاد این تغییرات نسبت به تغییرات هدر X-Powered-By
کمتر است، بنابراین این رویکرد برای شناسایی را می توان به عنوان قابل اعتمادتر در نظر گرفت.
کد منبع HTML (HTML Source Code)
این تکنیک بر اساس یافتن الگوهای خاصی در کد منبع صفحه HTML است. اغلب می توان اطلاعات زیادی پیدا کرد که به آزمایش کننده کمک می کند تا یک جزء خاص را تشخیص دهد. یکی از نشانگرهای رایج کامنت های HTML هستند که مستقیماً به افشای چارچوب منجر می شوند. اغلب مسیرهای خاص فریمورک (چارچوب) را می توان یافت، به عنوان مثال پیوند (لینک) هایی به پوشه های CSS یا JS مخصوص چارچوب. در نهایت، متغیرهای اسکریپت خاص نیز ممکن است به چارچوب خاصی اشاره کنند.
از اسکرین شات زیر به راحتی می توان چارچوب مورد استفاده و نسخه آن را با نشانگرهای ذکر شده یاد گرفت. کامنت ها، مسیرهای خاص و متغیرهای اسکریپت همگی می توانند به مهاجم کمک کنند تا به سرعت نمونه ای از چارچوب ZK را تعیین کند.
\
شکل 2-4.1.8: نمونه منبع HTML چارچوب ZK
اغلب چنین اطلاعاتی در بخش <head>
پاسخ های HTTP، در تگ <meta>
ها یا در انتهای صفحه قرار می گیرند. با این وجود، کل پاسخ ها باید تجزیه و تحلیل شوند، زیرا می تواند برای اهداف دیگری مانند بازرسی سایر کامنت های مفید و زمینه های پنهان مفید باشد. گاهی اوقات، توسعه دهندگان وب اهمیت زیادی به مخفی کردن اطلاعات مربوط به فریمورک )چارچوب) ها یا اجزای مورد استفاده نمی دهند. هنوز هم ممکن است به چیزی شبیه به این در پایین صفحه برخورد کنید:
\
شکل 3-4.1.8: صفحه پایین Banshee
فایل ها و پوشه های خاص (Specific Files and Folders)
رویکرد دیگری وجود دارد که به مهاجم یا آزمایش کننده کمک می کند تا برنامه ها یا اجزای سازنده را با دقت بالا شناسایی کند. هر جزء وب ساختار فایل و پوشه خاص خود را در سرور دارد. اشاره شده است که می توان مسیر خاصی را از منبع صفحه HTML مشاهده کرد اما گاهی اوقات آنها به صراحت در آنجا ارائه نمی شوند و همچنان در سرور قرار دارند.
برای کشف آنها از تکنیکی به نام مرور اجباری (forced browsing) یا "dirbusting" استفاده می شود. Dirbusting عبارت است از وادار کردن یک هدف با نام پوشه ها و فایل های شناخته شده و نظارت بر پاسخ های HTTP برای شمارش محتوای سرور. از این اطلاعات می توان هم برای یافتن فایل های پیش فرض و حمله به آنها و هم برای انگشت نگاری برنامه وب استفاده کرد. Dirbusting را می توان به روش های مختلفی انجام داد، مثال زیر یک حمله موفقیت آمیز dirbusting علیه یک هدف مبتنی بر وردپرس را با کمک لیست تعریف شده و عملکرد مزاحم Burp Suite نشان می دهد.
\
شکل 4-4.1.8: Dirbusting با Burp
ما می توانیم ببینیم که برای برخی از پوشه های خاص وردپرس (به عنوان مثال، /wp-includes/
و /wp-admin/
و /wp-content/
) پاسخهای HTTP به ترتیب 403 (ممنوع)، 302 (یافت، هدایت به wp-login.php
) و 200 (OK) هستند. این نشان دهنده خوبی است که هدف از وردپرس پشتیبانی می کند. به همین ترتیب می توان پوشه های پلاگین برنامه های مختلف و نسخه های آنها را پاکسازی کرد. در تصویر زیر می توانید یک فایل CHANGELOG معمولی از یک پلاگین Drupal را مشاهده کنید که اطلاعاتی در مورد برنامه مورد استفاده ارائه می دهد و یک نسخه آسیب پذیر افزونه را فاش می کند.
\
شکل 5-4.1.8: افشای Drupal Botcha
نکته: قبل از شروع پخش، ابتدا فایل robots.txt
را بررسی کنید. گاهی اوقات پوشه های خاص برنامه و سایر اطلاعات حساس را می توان در آنجا یافت. نمونه ای از چنین فایل robots.txt
در تصویر زیر ارائه شده است.
\
شکل 6-4.1.8: افشای اطلاعات ربات ها
فایل ها و پوشه های خاص برای هر برنامه خاص متفاوت است. اگر برنامه یا مؤلفه شناسایی شده منبع باز باشد، ممکن است راه اندازی یک نصب موقت در طول آزمایش های نفوذ برای درک بهتر زیرساخت ها یا قابلیت هایی که ارائه می شود و چه فایل هایی ممکن است روی سرور باقی بماند، ارزش داشته باشد. با این حال، چندین لیست فایل خوب در حال حاضر وجود دارد. یکی از مثال های خوب، فهرست واژه های FuzzDB از فایل ها/پوشه های قابل پیش بینی است.
پسوندهای فایل (File Extensions)
ا URL ها ممکن است شامل پسوندهای فایل باشند که می تواند به شناسایی پلتفرم یا فناوری وب نیز کمک کند.
به عنوان مثال، ویکی OWASP از PHP استفاده می کند:
https://wiki.owasp.org/index.php?title=Fingerprint_Web_Application_Framework&action=edit§ion=4
در اینجا برخی از پسوندهای رایج فایل های وب و فناوری های مرتبط آورده شده است:
.php
-- PHP.aspx
-- Microsoft ASP.NET.jsp
-- صفحات سرور جاوا
پیغام خطا(Error Messages)
همانطور که در تصویر زیر مشاهده می شود، مسیر فایل سیستم فهرست شده به استفاده از وردپرس (wp-content
) اشاره دارد. همچنین آزمایش کنندگان باید بدانند که وردپرس مبتنی بر PHP است (functions.php
).
\
شکل 7-4.1.8: خطای تجزیه وردپرس
شناسه های مشترک (Common Identifiers)
کوکی ها (Cookies)
چارچوب | نام کوکی |
---|---|
Zope | zope3 |
CakePHP | cakephp |
Kohana | kohanasession |
Laravel | laravel_session |
phpBB | phpbb3_ |
WordPress | wp-settings |
1C-Bitrix | BITRIX_ |
AMPcms | AMP |
Django CMS | django |
DotNetNuke | DotNetNukeAnonymous |
e107 | e107_tz |
EPiServer | EPiTrace, EPiServer |
Graffiti CMS | graffitibot |
Hotaru CMS | hotaru_mobile |
ImpressCMS | ICMSession |
Indico | MAKACSESSION |
InstantCMS | InstantCMS[logdate] |
Kentico CMS | CMSPreferredCulture |
MODx | SN4[12symb] |
TYPO3 | fetypouser |
Dynamicweb | Dynamicweb |
LEPTON | lep[somenumericvalue]+sessionid |
Wix | Domain=.wix.com |
VIVVO | VivvoSessionId |
کد منبع HTML (HTML Source Code)
برنامه | کلمه کلیدی |
---|---|
WordPress | <meta name="generator" content="WordPress 3.9.2" /> |
phpBB | <body id="phpbb" |
Mediawiki | <meta name="generator" content="MediaWiki 1.21.9" /> |
Joomla | <meta name="generator" content="Joomla! - Open Source Content Management" /> |
Drupal | <meta name="Generator" content="Drupal 7 (http://drupal.org)" /> |
DotNetNuke | DNN Platform - [http://www.dnnsoftware.com](http://www.dnnsoftware.com) |
نشانگرهای عمومی (General Markers)
%framework_name%
powered by
built upon
running
نشانگرهای خاص (Specific Markers)
چارچوب | کلمه کلیدی |
---|---|
Adobe ColdFusion | <!-- START headerTags.cfm |
Microsoft ASP.NET | __VIEWSTATE |
ZK | <!-- ZK |
Business Catalyst | <!-- BC_OBNW --> |
Indexhibit | ndxz-studio |
اصلاح
در حالی که می توان تلاش هایی برای استفاده از نام های مختلف کوکی ها (از طریق تغییر تنظیمات)، مخفی کردن یا تغییر مسیرهای فایل/دایرکتوری (از طریق بازنویسی یا تغییر کد منبع)، حذف هدرهای شناخته شده و غیره انجام داد. صاحبان/مدیران سیستم باید بدانند که این تلاش ها فقط باعث کاهش ابتدایی ترین دشمنان می شود. زمان/تلاش ممکن است برای آگاهی ذینفعان و فعالیت های تعمیر و نگهداری راه حل بهتر استفاده شود.
ابزارها
لیستی از ابزارهای عمومی و شناخته شده در زیر ارائه شده است. همچنین بسیاری از ابزارهای کاربردی دیگر و همچنین ابزارهای انگشت نگاری مبتنی بر چارچوب وجود دارد.
WhatWeb
وب سایت: https://github.com/urbanadventurer/WhatWeb
در حال حاضر یکی از بهترین ابزارهای انگشت نگاری موجود در بازار است. در یک ساخت پیش فرض کالی لینوکس (Kali Linux) گنجانده شده است. زبان: روبی (Ruby) مچ شده برای انگشت نگاری با:
- رشته های متنی (حساس به حروف کوچک و بزرگ)
- عبارات با قاعده
- پرس و جو های پایگاه داده گوگل هک (مجموعه محدودی از کلمات کلیدی)
- هش های MD5
- تشخیص URL
- الگوهای تگ HTML
- کد ruby سفارشی برای عملیات غیرفعال و تهاجمی
- خروجی نمونه در تصویر زیر ارائه شده است:
\
شکل 8-4.1.8: نمونه خروجی Whatweb
Wappalyzer
وب سایت: https://www.wappalyzer.com/
ا Wappalyzer در مدل های چندگانه موجود است که محبوب ترین آنها احتمالاً افزونه های Firefox/Chrome است. آنها فقط بر روی تطبیق عبارات معمولی کار می کنند و به هیچ چیز دیگری غیر از صفحه برای بارگذاری در مرورگر نیاز ندارند. به طور کامل در سطح مرورگر کار می کند و نتایج را در قالب آیکون می دهد. اگرچه گاهی اوقات دارای نکات مثبت کاذب است، اما این بسیار مفید است که بدانید چه فناوری هایی برای ساختن یک وب سایت هدف بلافاصله پس از مرور یک صفحه استفاده شده است.
نمونه خروجی یک افزونه در تصویر زیر ارائه شده است.
\
شکل 9-4.1.8: خروجی Wappalyzer برای وب سایت OWASP