نشانی وب(URL)
آدرس وب که مکان یک منبع را در اینترنت مشخص میکند، مانند https://example.com/page.
تعریف کوتاه
URL متنی است که در نوار آدرس مرورگر میبینید و به مرورگر میگوید چیزی را کجا در اینترنت پیدا کند. https://example.com/products/123 میگوید: از پروتکل HTTPS استفاده کن، برو به example.com، بخش محصولات را پیدا کن، آیتم ۱۲۳ را بگیر.
تعریف کامل
URL (آدرس وب) آدرس کامل برای دسترسی به یک منبع در وب است.
ساختار URL:
1https://user:pass@www.example.com:443/path/to/page?key=value#section2│ │ │ │ │ │ │ │3│ │ │ │ │ │ │ └─ بخش4│ │ │ │ │ │ └─ پرسوجو5│ │ │ │ │ └─ مسیر6│ │ │ │ └─ پورت7│ │ │ └─ دامنه (نام میزبان)8│ │ └─ اعتبارنامه (منسوخ شده)9│ └─ پروتکل (طرح)10└─ https://
اجزا:
پروتکل: نحوه دسترسی (http، https، ftp، file)
دامنه: کجا برویم (example.com)
پورت: کدام سرویس (۸۰=HTTP، ۴۴۳=HTTPS)
مسیر: چه منبعی (/products/123)
پرسوجو: پارامترها (?color=red&size=large)
بخش: بخش صفحه (#reviews)
چرا مهم است
- هر درخواست وب با یک URL شروع میشود
- URLها کنترل میکنند داده کجا میرود
- ساختار URL بر امنیت تأثیر میگذارد
- موتورهای جستجو به URLهای تمیز وابسته هستند
- APIها از URLها به عنوان رابط استفاده میکنند
چگونه مهاجمان از آن استفاده میکنند
حملات مبتنی بر URL:
۱. تزریق/دستکاری URL:
1# اصلی2https://bank.com/transfer?to=user1&amount=10034# مهاجم تغییر میدهد5https://bank.com/transfer?to=attacker&amount=10000
۲. SSRF از طریق URL:
1# عادی2https://site.com/fetch?url=https://cdn.example.com/image.jpg34# مخرب5https://site.com/fetch?url=http://169.254.169.254/metadata
۳. تغییر مسیر باز:
1https://trusted.com/redirect?url=http://evil.com
۴. پیمایش مسیر:
1https://site.com/download?file=../../../etc/passwd
۵. سردرگمی تجزیهگر URL:
1http://evil.com@trusted.com ← کدام دامنه؟2http://trusted.com.evil.com ← ترفند زیردامنه
چگونه تشخیص یا پیشگیری کنیم
پیشگیری:
- URLها را به طور کامل اعتبارسنجی کنید
- از کتابخانههای تجزیه URL استفاده کنید (نه regex)
- لیست سفید دامنههای مجاز
- پس از جستجوی DNS، IP حل شده را بررسی کنید
- کاراکترهای خاص را به درستی کدگذاری کنید
- در صورت امکان از URLهای نسبی استفاده کنید
- اعتبارنامههای URL را در برنامههای مدرن غیرفعال کنید
به طور خاص برای SSRF:
1from urllib.parse import urlparse2import socket34def is_safe_url(url):5 parsed = urlparse(url)67 # بررسی پروتکل8 if parsed.scheme not in ['http', 'https']:9 return False1011 # بررسی لیست سفید دامنه12 if parsed.hostname not in ALLOWED_DOMAINS:13 return False1415 # بررسی IP حل شده16 try:17 ip = socket.gethostbyname(parsed.hostname)18 if is_private_ip(ip):19 return False20 except:21 return False2223 return True
تشخیص:
- ثبت تمام URLهای پردازش شده توسط برنامه
- هشدار در مورد الگوهای مشکوک:
- آدرسهای IP خصوصی
- IPهای سرویس متادیتا
- کدگذاری دوگانه
- پروتکلهای غیرعادی (gopher, file)
- طول بیش از حد URL
باورهای غلط رایج
- "اعتبارسنجی URL ساده است" - تفاوتهای تجزیهگر مشکل ایجاد میکند
- "URLهای HTTPS همیشه ایمن هستند" - همچنان میتوانند به محتوای مخرب اشاره کنند
- "دامنه در URL واضح است" - حملات سردرگمی تجزیهگر وجود دارد
- "کدگذاری URL از حملات جلوگیری میکند" - مهاجمان نیز از آن استفاده میکنند
- "URLها نمیتوانند اعتبارنامه داشته باشند" - میتوانند (منسوخ شده اما کار میکند)
مثال واقعی
SSRF در GitHub (۲۰۱۷)
پروکسی تصویر GitHub URLها را میپذیرفت:
1https://github.com/proxy?url=...
هدف: فقط تصاویر خارجی
آسیبپذیری: عدم اعتبارسنجی مقصد
بهرهبرداری:
1url=http://127.0.0.1:6379/
نتیجه: به سرور Redis داخلی دسترسی پیدا کرد، دستورات اجرا کرد.
سردرگمی تجزیهگر URL - موارد متعدد
کتابخانههای مختلف یک URL را متفاوت تجزیه میکنند:
1http://evil.com@good.com23PHP parse_url(): میزبان = good.com4Python requests: میزبان = evil.com
اعتبارسنج good.com را میبیند (عبور میکند)، فرستنده به evil.com متصل میشود (دور زده شد).
اصطلاحات مرتبط
URI, Domain, Endpoint, HTTP Request, URL Parser