دوره SEC542 – بخش نهم

دوره آموزشی SEC542

آشنایی با URL و کدهای وضعیت

Uniform Resource Identifier (URIs)

آشنایی با URL و کدهای وضعیت در HTTP بسیار حائز اهمیت می باشد که در این بخش به آن ها خواهیم پرداخت.

URI در واقع آدرس یک منبع می باشد که شامل چگونگی نحوه بازیابی آن است. البته عبارت URL که مخفف Uniform Resource Locator می باشد که در حال حاضر توسط مردم دچار تغییر شده است و همان مفهوم آدرس وب سایت را متصور می سازد.URI دارای بخش های مختلفی است که در زیر به آن پرداخته شده است:
پروتکل: که شامل نوع پروتکل است که می توانند HTTP یا HTTPS و یا پروتکل های دیگر باشد.
نام کاربری و کلمه عبور: ترکیب نام کاربری و رمز عبور برای احراز هویت استفاده می شود که این مورد در اغلب مرورگرهای مدرن مسدود شده است.

نام هاست یا دامنه: در این بخش نام دامنه مشخص می گردد.
شماره پورت: این بخش نمایانگر شماره پورتی است که مورد استفاده قرار می گیرد و اگر مشخص نشده باشد به صورت پیش فرض برای پروتکل HTTP پورت 80 و برای پروتکل HTTPS از پورت 443 استفاده می شود.
منابع: در این بخش منابعی که در سرور قرار دارد و باید نمایش داده شود مشخص می شود.
البته در ادامه آدرس منبع یک علامت سوال وجود دارد که در ادامه آن پارامتر مشخص شده در صفحه منبع و همچنین مقدار آن مشخص می شود.

protocol://[username:password@]host.domain[:port]/resource?param=value

Query String

به صورت معمول یک برنامه وب از قالب پارامتر و مقدار (?param=value) استفاده می نمایند.

Index.php?id=42&name=test

اما با توجه به دلایل مختلف در طراحی برنامه از ماژول هایی مانند mod_rewrite استفاده می شود تا این پارامترها به فرمت های مختلفی ظاهر شوند. به عنوان مثال از ماژول mod_rewrite که از ماژول های وب سرور Apache می باشد برای بازنویسی URL جهت بهینه سازی برای موتورهای جست و جو استفاده می شود.

Index.php/id/42/name/test

البته فرمت های دیگری هم وجود دارد که در مثال زیر کل رشته را به منطق برنامه یا Application Logic اصطلاحا Pass می دهد تا توسط آن تجزیه و تحلیل شود که این روی می تواند منجر به حملات تزریق کد منجر شود.

Index.php/id=42$name=text

نمونه دیگری کمی قدیمی تر می باشد اما هنوز هم مورد استفاده قرار می گیرد. در این روش نرم افزار وب پارامترها را دریافت نموده و آن ها را به یک برنامه در حال اجرا بر روی سرور منتقل می نماید.

Index.php?param=id:42&param=name:text

HTTP Request Methods

کلاینت های وب می توانند از انواع مختلفی از درخواست ها هنگام دسترسی به یک سرور استفاده نمایند که به آن ها Request Methods گفته می شود. در ادامه به این متدها می پردازیم. این متدهاا توسط اکثر مرورگرها پشتیبانی می شوند و سرورها می توانند به گونه ای پیکربندی شوند تا متدهای خاص را بپذیرند.

متدهای GET و POST

GET و POST دو متد رایج HTTP هستند که در وب استفاده می شوند که هر دوی آن ها صفحات را از سرور درخواست می کنند. مهمترین تفاوت بین این دو متد این است که GET از URL برای انتقال پارامترها به برنامه استفاده نموده و POST برای انتقال پارامترها از HTTP Payload استفاده می نماید. هنگامی که از متد GET استفاده می کنید، نتایج قابل نشانه گذاری یا Bookmark هستند و دسترسی به پارامترهای آن نسبت به متد POST ساده تر می باشد.

گرچه در حال حاضر ابزارهایی نیز برای شناسایی پارامترهای متد POST نیز طراحی شده اند. دلیل دیگری که برنامه های کاربردی وب از متد POST استفاده می کنند این است که پارامترها در یک وضعیت معمول وارد ثبت یا Log نمی شوند. این امر موجب می شود تا از اطلاعات حساسی که به سرور ارسال می گردند، تا حدودی محافظت شود.

متد HEAD

متدی دیگر، HEAD می باشد که هنگام درخواست آن، تنها هدرهای HTTP پاسخ داده می شوند. این روش مهاجم را قادر می سازد تا درخواست ها را بدون انتظار برای Payload انجام دهد.

متد OPTIONS

متد دیگر، OPTIONS است که به منظور ارسال درخواست به سرور برای پیدا کردن متدهای پشتیبانی شده در آن است.

متد TRACE

متدی بعدی، TRACE است. در این روش سرور، اطلاعات ارسال شده را عینا به کلاینت باز می گرداند. از این متد برای بررسی تغییراتی که رابط های شبکه بر روی بسته می گذارند، استفاده می شود. با استفاده از این متد باعث می شود که کاربر هر گونه اطلاعاتی را که توسط واسطه هایی مانند Load Balancer ها و پروکسی ها اضافه می شوند مشاهده نماید.

متد CONNECT

متد CONNECT نیز هنگام دسترسی برنامه از طریق یک پروکسی سرور و همچنین برای اتصال ارتباطات SSL مورد استفاده قرار می گیرد. این متد اغلب با WebSocket ها نیز استفاده می گردد.

متد Connect

متد PUT و DELETE

دو متد دیگر که PUT و DELETE نام دارند برای Web-based Distributed Authoring and Versioning یا به اختصار WebDAV استفاده می شوند و به طور کلی نباید در سرورهای وب عمومی مورد استفاده قرار گیرند. این متدها بیشتر در سایت های داخلی یا اینترانت به کار می روند. از متد PUT برای آپلود داده به یک سرور و متد DELETE برای حذف داده ها استفاده می شود.

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

کدهای وضعیت

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

کد وضعیت 1xx

کلاس 1xx، کدهای وضعیت اطلاعات یا Information هستند. این کد وضعیت در پروتکل HTTP 1.1 اضافه گردید و یک مثال از آن کد 101 که برای پروتکل سوییچینگ در اتصالات WebSocket استفاده می شود.
کد وضعیت 200 نشان دهنده یک نتیجه موفق است. در وب سایت های استاتیک، این کد بدین معنی بود که صفحه درخواست شده، یافت شد و شما مجاز به دسترسی به آن هستید.

کد وضعیت 3xx

کد وضعیت 300 به منظور انجام فرآیند Redirect استفاده می شود. این کد زمانی سرور نیاز دارد تا کلاینت را به جای دیگری هدات کند بسیار مفید خواهد بود. به عنوان مثال اگر شما سایت خود را تغییر داده باشید می توانید با استفاده از این کد وضعیت کاربرانی که به صحفات قدیمی هدایت می شوند را به صحفات مورد نظر خود در سایت فعلی هدایت نمایید. مورد استفاده دیگر این کد وضعیت هنگامی است که سایت کاربر را پس از تکمیل فرم هایی مانند صفحات ورود، به صحفه مورد نظر خود هدایت می کند.

یکی از مواردی که باید هنگام بررسی آسیب پذیری ها مراقب آن باشیم، دریافت یک کد وضعیت 304 و بارگیری محتوا از Cache می باشد. این موضوع در برخی موارد سبب می شود تا شما تصور کنید آسیب پذیری وجود ندارد.

کد وضعیت 4xx

کد وضعیت 4xx زمانی استفاده می شود که سرور یک درخواست را دریافت نموده ولی قادر به پردازش آن نمی باشد. به عنوان مثال اگر شما یک صفحه را درخواست کنید که وجود نداشته باشد، سرور یک کد وضعیت 404 را نمایش می دهد و اگر صفحه درخواستی شما دارای احراز هویت باشد، شما با کد وضعیت 401 روبرو می شوید که بیانگر وجود احراز هویت برای صفحه خواهند بود.

یک کد وضعیت جدید نیز با شماره 451 اضافه گریده است که مفهوم آن عدم دسترسی بنا به دلایل قانونی می باشد.این کد در RFC مربوط به دسامبر سال 2015 قرار دارد. برای اطلاعات بیشتر می توانید به لینک زیر مراجعه نمایید:

https://datatracker.ietf.org/doc/rfc7725/

کد وضعیت 5xx

کد وضعیت 5xx نیز زمانی دریافت می شود که سرور قادر به پاسخ مناسب و کامل به کلاینت نیست. به عنوان مثال اگر یک برنامه تلاش کند که متصل شود به یک پایگاه داده یا Data Store و نتواند، یک کد وضعیت 5xx مشاهده می نماید.

توجه داشته باشید که دراغلب موارد، صحفاتی که کدهای وضعیت را به نمایش می گذارند، دارای اطلاعات مفیدی از جمله مشخصات وب سرور، سیستم عامل و ماژول های به کار رفته در آن هستند که برای ادامه مراحل نفوذ بسیار مفید می باشند.

WebSocket

پروتکل Websocket یک فناوری نسبتا جدید است که از منظر مرورگر با ساختار HTML5 وارد شده است. یکی از قابلیت های کلیدی در پروتکل websocket این است که توسعه دهنده را قادر می سازد تا ارتباطات دو طرفه را بر روی یک سوکت TCP تنظیم کند. این قابلیت برای زمانی که یک برنامه نیاز دارد تا به صورت منظم و Real-time ارتباط برقرار کند بسیار عالی می باشد. این ویژگی همچنین کمک می کند تا از برنامه های کاربردی وب که امروزه توسعه یافته اند و دارای کاربران زیادی می باشند، پشتیبانی شود.

البته باید به یاد داشته باشید که W3C هنوز در حال استانداردسازی WebSocket API می باشد. همچنین اگرچه محبوبیت این پروتکل روز به روز در حال افزایش می باشد ولی هنوز به صورت عمومی در برنامه های تحت وب تست نشده است ولی انتظار می رود که این امر به زودی محقق شود.
ارتباطات webSocket به منظور ارتباط با یک Back End Server طراحی شده اند که امکان ارتباط طولانی مدت میان کلاینت و سرور را فراهم می سازند.
برای کسب اطلاعات بیشتر در خصوص وب سوکت می توانید به زیر مراجعه نمایید:

https://tools.ietf.org/html/rfc6455

پیاده سازی وب سوکت

هنگامی که ما قصد داریم تا از وب سوکت در برنامه وب مورد نظر خود استفاده نماییم، معمولا آن را در قالب یک فایل .js قرار می دهیم. البته می توان آن را در صفحه HTML خود، در یک بلوک script نیز قرار داد. ما می توانیم یک WebSocket Object جدید را با استفاده از کد زیر ایجاد نماییم:

Var connection = new WebSocket(‘ws://ws.sec542.org/echo’,[‘soap’, ‘xmpp’]);

بسیاری از ابزارهایی که ما در حال حاضر در تست نفوذ وب از آن ها استفاده می کنیم، ارتباطات WebSocket را درک نمی کنند و یا نمی توانند ارتباطات آن را اصطلاحا Handle نمایند. این بدین معنی است که ما نمی توانیم مسیر ارتباطی را رهگیری نماییم. البته دو ابزار برای آنالیز وب سوکت وجود دارد که اولین ابزار، وایرشارک است که ترافیک خام شبکه را Capture نموده و سپس می توان آن را تجزیه و تحلیل نماییم.

البته یکی از محدودیت های موجود در هنگام استفاده از وایرشارک این است که اغلب ارتباطات وب سوکت به صورت رمز شده انجام می شود.
ابزار دیگر ZAP می باشد و به دلیل اینکه به صورت MITM عمل می کند، رمزنگاری در این ابزار دیگر به عنوان یک محدودیت حساب نمی شود.

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

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