آسیب پذیری Directory Traversal چیست؟
همانطور که میدانید، کاربران یک وبسایت، از طریق واسطهای تحت عنوان سرور، با محتوای مدنظر در ارتباط هستند. اما این ارتباط بین کاربر و محتوا، لازم است که مدیریت شده انجام شود تا افراد، به محتوای درستی دسترسی داشته باشند. در غیر این صورت، ممکن است وبسایت گفته شده، در مقابل حملاتی مانند Directory Traversal، آسیب پذیر باشد. در صورت وجود این باگ، این امکان به نفوذگر داده میشود که به اطلاعاتی حیاتی از سرور وبسایت آسیب پذیر، دسترسی پیدا کند که به خودی خود، میتواند تهدید بزرگی برای امنیت وبسرور سایت، به شمار برود.
همراه ما باشید تا به طور کامل با آسیب پذیری Directory Traversal آشنا شویم.
آسیب پذیری Directory Traversal چیست؟
نام کامل این آسیب پذیری، Directory Traversal File Include (پیمایش پوشههای شامل پرونده) میباشد که به آن Path Traversal (پیمایش مسیر)، dot-dot-slash Attack (حملهی ../)،backtracking(بازگشت به عقب) یا Directory Climbing(پوشه نوردی) گفته میشود. ما در این نوشتار، بیشتر با نام Directory Traversal به آن اشاره میکنیم. Directory Traversal از جمله آسیب پذیری های Server-Side یا سمت سرور به شمار میرود و وجود این باگ، به معنی آسیب پذیری برنامه در مرحلهی Authorization یا اعطای دسترسی میباشد. وقتی که یک وبسایت، دچار این آسیب پذیری میشود، امکان دسترسی به مسیرها و پوشههای وبسرور، در سمت کاربر (Client-Side) به وجود میآید. با این شرایط، در صورتی که وبسایت توسط یک نفوذگر مورد حمله قرار بگیرد، به واسطهی وجود این باگ، نفوذگر دسترسی به پوشهها و مسیر هایی را پیدا میکند، که حاوی اطلاعاتی مهم از سرور سایت آسیبپذیر، میباشند و در بعضی شرایط، نفوذگر امکان ایجاد تغییر در این اطلاعات را هم خواهد داشت که میتواند موجب گرفتن دسترسی کامل توسط وی بشود. در ادامه به صورت دقیقتر به این حمله میپردازیم.
روش حمله Directory Traversal
همانطور که میدانید، برای اینکه ما یک وبسایت را در مرورگرمان مشاهده کنیم، ابتدا مرورگر، درخواستی به سمت سرور همان سایت ارسال میکند، سپس وب سایت گفته شده، بر اساس دستوراتی که توسط برنامهنویس بکاند(Back end) نوشته شده است، محتوای مورد نیاز را جمع آوری و ارسال میکند که در نهایت، وبسایت گفته شده، در مرورگر به نمایش در میآید. اما نکتهی قابل توجه در این روند، استفاده کردن سایتها، از یک ساختار درختی از پوشهها(Directories) برای جاگذاری و استفاده از دستورات منبع(Source) برنامه میباشد.
زمانیکه یک کاربر، درخواست رفتن به سایت www.example.com را دارد، در واقع، یک درخواست برای رفتن به مسیر “/” ، که اشاره به مسیر ریشه(Root) برنامه، که اشاره به پوشهی اصلی سایت دارد را، به سرور میفرستد. سرور بعد از دیدن این درخواست، محتوای مخصوص صفحهی اول را برای او ارسال میکند و کاربر، در مرورگر خود، سایت را میبیند.
پس میتوان گفت زمانی که، کاربر قصد رفتن به صفحهی محصولات را دارد، درخواستی برای رفتن به پوشه /product را ارسال میکند که محتوای مربوط به محصولات، در آن قرار گرفته است.
حال فرض کنید که یک وبسایت، محتوایی را به کاربر نمایش میدهد که شامل متن و تصاویر میباشد. این برنامه برای بارگیری تصاویر توسط مرورگر کاربر، از تگ Image به شکل زیر استفاده میکند:
<img src="/loadImage?filename=example.png">
در این حالت، زمانی که کاربر وارد صفحهی دارای تگ گفته شده میشود، مرورگر برای بارگیری و نمایش تصویر، سعی میکند آن را از مسیر /loadImage با پارامتر filename بخواند. وبسرور مربوط به برنامه، برای در اختیار گذاشتن عکس درخواست شده، عکسی را که نام آن برابر با مقدار پارامتر filename، یعنی example.png است را از مسیر /var/www/images/ یافته و در اختیار قرار میدهد.
حال اگر، وبسایت گفته شده، در برابر حمله Directory Traversal ایمن نباشد، نفوذگر میتواند از طریق مسیر زیر، به فایل سیستمی passwd، در وبسرور سایت آسیب پذیر، دسترسی پیدا کند:
https://example.com/loadImage?filename=../../../etc/passwd
همانطور که میدانید، وارد کردن مقدار (..)در سیستم عاملها، اشاره به بازگشت به پوشهی قبلی دارد.
زمانی که کاربر، عکسی را از وبسرور درخواست میکند، سرور از مسیر “/” که ابتدای مسیر است، وارد مسیر “/var/www/images/example.png ” شده و فایل را در اختیار میگذارد. اما زمانی که نفوذگر مسیر فایل passwd را درخواست میدهد، سرور به ازای هر تعداد ../ یک پوشه به عقب میرود و در نهایت، وارد پوشه /etc شده و فایل بسیار مهم passwd را، در اختیار نفوذگر قرار میدهد:
/var/www/images/../../../etc/passwd
این فایل حاوی اطلاعاتی از کاربران سیستم عامل را درخود جمع آوری میکند. البته مسیر گفته شده، مسیر فایل استاندارد موجود در سیستم عامل های بر پایهی Unix میباشد.
فایل معادل passwd در سیستم عامل ویندوز، win.ini میباشد که دسترسی به آن، از مسیر C:\Windows\win.ini امکان پذیر میباشد. پس نفوذگر برای حمله به سایت دارای وبسرور بر پایهی ویندوز، از مسیر زیر برای دسترسی به فایل گفته شده استفاده میکند:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
در نظر داشته باشید که در ویندوز، پیمایش به پوشهی بالایی از هر دو حالت ../ و ..\ امکان پذیر است.
مسیرهای مورد توجه در حمله Directory Traversal
همانطور که تا اینجا متوجه شدیم، در حملهی Directory Traversal، بیشتر از همه مسیرهایی مورد توجهاند که دارای محتوای مهمی میباشند. در ادامه به معرفی برخی از مسیرهای مهم در وبسرورهای یونیکسی و ویندوزی میپردازیم:
مثال مسیرهای مهم در سرورهای یونیکسی:
/etc/shadow /etc/passwd /etc/httpd/logs/access.log /usr/lib/php.ini /usr/local/cpanel/logs /var/log/mysql.log /etc/apache2/httpd.conf
مثال مسیرهای مهم در سرورهای ویندوزی:
C:/Windows/win.ini C:/php/php.ini C:/WINDOWS/System32/drivers/etc/hosts C:/Windows/debug/NetSetup.log C:/Program Files/MySQL/data/mysql.log C:/Program Files/FileZilla Server/FileZilla Server.xml C:/Program Files/Apache Group/Apache2/conf/httpd.conf C:/Program Files/Apache Group/Apache/logs/access.log
البته همانطور که اشاره شد، این ها فقط برخی از مسیرهای مورد توجه این حمله میباشند؛ مسیرهای زیادی در سیستم عاملها هستند که شامل اطلاعات یا کاربرد مهمی میباشند.
تست نفوذ در حمله Directory Traversal
برای تست نفوذ این آسیب پذیری، لازم است که مسیرهای مختلفی که با سورس برنامه در ارتباط هستند مورد ارزیابی قرار بگیرند. این مسیر ها عبارتند از:
از طریق درخواست
پارامتر های مختلفی در urlممکن است مسیر نفوذ برای حملهی directory traversal باشند. پارامترهای مربوط به یک صفحه، یک فایل، یک پنل کاربری و… که باید به درستی مورد ارزیابی قرار بگیرند. به مثال های مقابل توجه کنید:
http://example.com/getUserProfile.jsp?item=ikki.html http://example.com/index.php?file=content http://example.com/main.cgi?home=index.htm
برای تست آنها هم کافی است که مقدار داخل پارامترها را به مسیرهای مربوط به سرور، تغییر بدهیم. مانند ../../etc/passwd یا ../../windows/win.ini .همچنین مانند مثال گفته شده، ممکن است متوجه یک مسیر، در کد html سایت برای بارگذاری یک فایل بشویم که لازم است، آن را هم مورد ارزیابی قرار بدهیم.
در صورت آسیب پذیر بودن برنامه، احتمالا با تصویری شبیه به زیر مواجه میشوید:
از طریق کوکی ها
ممکن است که برنامه از کوکیهای مختلفی برای برقراری ارتباط با کاربر استفاده بنماید و همچنین ممکن است که در صورت آسیب پذیری برنامه به directory traversal، یکی از همین کوکیها، تبدیل به حفره ای برای تزریق مسیرهای سرور و بیرون کشیدن اطلاعات آن بشود. پس در این صورت، لازم است که کوکیهای مورد استفاده وبسایت مدنظر را هم مورد ارزیابی این حمله قرار بدهیم:
Cookie: USER=1826cc8f:PSTYLE=exampleValue Cookie: USER=1826cc8f:PSTYLE=../../../etc/passwd
ابزارهای تست Directory Traversal
در نظر داشته باشید که تست این آسیب پذیری، بدون ابزار و بصورت دستی هم قابل انجام است. اما برای دقت و سرعت بیشتر، میتوان از ابزار هایی که قابلیت آنالیز درخواست ها را دارند، برای یافتن ورودیهای مدنظر برای تست، و ابزارهایی که قابلیت بروت فورس دارند، برای تست اتوماتیک انواع مسیر ها روی ورودی های مدنظر، استفاده نمود. نمونههایی از ابزار های مفید برای تست این باگ عبارتند از:
- Burp Suite
- DotDotPwn
- DirSearch
بایپس سیستم امنیتی
اگر هنگام تست این حمله، بعد از تزریق پیلودهای مربوطه، نتیجهای حاصل نشد، نشان از امنیت کامل برنامه نمیباشد. ممکن است که برنامه، ورودیهای کاربر را بر اساس یک بلاک لیست (Block-List) مورد ارزیابی قرار دهد و در صورت عدم شباهت مسیر وارد شده، آنرا پردازش کرده و اطلاعات مدنظر را تحویل دهد.
به این منظور، برای تست این حمله، تزریق پیلودها، به شکل زیر میتواند مفید باشد:
URL Encoding
ممکن است با روش URL Encode یا Double encoding، پیلود تزریق شده توسط برنامه تشخیص داده نشده و پردازش بشود. مثلا به جای ../ یا ..\ ،مقادیر زیر را وارد کنیم.
../ %2e%2e/ ..%2f %2e%2e%2f
..\ %2e%2e\ ..%5c %2e%2e%5c
استفاده از علامات
بعضی از نشانگرها در نوشتن مسیر تاثیر گذار نیستند و توسط سیستم عامل در نظر گرفته نشده و پاک میشوند. اما برای گذراندن پیلود از سیستم امنیتی و رفتن به مسیر میتوانند مفید باشند:
../../file.txt<SPACE> ../../file.txt”””” ../../file.txt<<<>>>< ../../file.txt…
تغییر شکل مسیر
ممکن است برنامه فقط از مقادیری که ابتدای آن از ../ یا ..\ استفاده شده است، جلوگیری کند؛ در این صورت نوشتن مسیر به صورتی که مشابه آن نباشد ولی عملکرد مدنظر را برای ما انجام بدهد، میتواند موجب بایپس شدن سیستم امنیتی بشود:
file=<SPACE>..\..\file.txt file=….\\....\\file.txt file=./././file.txt file=nonexistent/../file.txt
امنیت در برابر حمله Directory Traversal
برای امن سازی برنامه، در برابر این حمله، دو گزینهی زیر توصیه میشود:
- اعتبار سنجی ورودیهای کاربر
ورودیهایی که از سمت کاربر به سمت برنامه درخواست میشوند، طبق یک لیست سفید(White List) از مقادیر مجاز، مورد ارزیابی قرار بگیرند تا مقادیر ورودی کاربر، به مقادیر اصلی برنامه محدود بشوند؛ برای مثال، برنامه به غیر از مقادیر عددی، ورودیهای دیگر را پردازش نکند.
- رعایت اصل حداقل دسترسی (Least Privilege)
برای امنیت بیشتر وبسرور، دقت شود که فقط دسترسیهای ضروری و مورد نیاز برنامه، به کاربران اعطاء بشود، تا از احتمال حمله و دسترسی نفوذگران، در امان باشد.
جمع بندی
سعی شد تا در این نوشتار به طور کامل با آسیب پذیری Directory Traversal، از دید نفوذ و امنیت به طور کامل پرداخته و اهمیت آن رسانده بشود. چرا که در صورت نادیده گرفتن آن، این آسیب پذیری میتواند به خودی خود، تبدیل به پلهای برای به خطر افتادن یک سامانه بشود.
عالی و جامع بسیار ممنون