KavLabs
خانهبلاگ
KavLabs

یادداشت‌هایی از ذهن‌های کاوشگر، برای ذهن‌های کنجکاو

پرهام·پرهام·زال·زال·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
نوشته‌هادسته‌بندی‌هاجستجوی پیشرفتهلاگ تغییرات

©۲٬۰۲۶ KavLabs — تمام حقوق محفوظ است

ساخته‌شده با عشق توسط پرهام و زال

واژه‌نامه
۰۷ اسفند ۱۴۰۴امنیت وبمتوسطزبان: فارسی

تجزیه‌گر URL

متوسطنسخه انگلیسی

جزئی که یک URL را به اجزای آن (پروتکل، دامنه، مسیر و غیره) تجزیه می‌کند. تجزیه‌گرهای مختلف می‌توانند یک URL را متفاوت تفسیر کنند و مشکلات امنیتی ایجاد کنند.

urlتجزیه‌گرssrfدور-زدنامنیت

تعریف کوتاه

تجزیه‌گر URL یک URL را می‌خواند و آن را به تکه‌ها (طرح، میزبان، مسیر) تقسیم می‌کند. مشکل: تجزیه‌گرهای مختلف در نحوه تقسیم یک URL اختلاف نظر دارند، بنابراین بررسی امنیتی شما و درخواست واقعی ممکن است مقاصد متفاوتی را ببینند.

تعریف کامل

تجزیه‌گر URL کدی است که یک رشته URL را تفسیر کرده و اجزای آن را استخراج می‌کند. هر زبان برنامه‌نویسی و کتابخانه تجزیه‌گر مخصوص خود را دارد و همیشه با هم توافق ندارند.

آنچه تجزیه‌گرها استخراج می‌کنند:

bash
1https://user:pass@example.com:8080/path?query=1#fragment

تجزیه‌گر برمی‌گرداند:

  • طرح: https
  • نام کاربری: user
  • رمز عبور: pass
  • نام میزبان: example.com
  • پورت: ۸۰۸۰
  • مسیر: /path
  • پرس‌وجو: query=1
  • بخش: fragment

مشکل: URLهای مبهم

bash
1http://evil.com@good.com
  • برخی تجزیه‌گرها: username=evil.com, host=good.com
  • برخی دیگر: host=evil.com, path=@good.com
  • نتیجه: دور زدن امنیتی

چرا مهم است

  • تصمیمات امنیتی بر اساس خروجی تجزیه‌گر
  • ناسازگاری تجزیه‌گر = فرصت‌های دور زدن
  • فیلترهای SSRF اغلب به تجزیه URL وابسته هستند
  • یک URL می‌تواند برای سیستم‌های مختلف معانی متفاوتی داشته باشد
  • آزمایش همه رفتارهای تجزیه‌گر سخت است

چگونه مهاجمان از آن استفاده می‌کنند

حمله سردرگمی تجزیه‌گر:

python
1# اعتبارسنجی امنیتی
2parsed = urlparse(user_input)
3if parsed.hostname == "trusted-site.com":
4 fetch(user_input) # تأیید شد
5
6# مهاجم ارائه می‌دهد:
7"http://trusted-site.com@evil.com"
8
9# اعتبارسنج می‌بیند: hostname = "trusted-site.com" ✓
10# کتابخانه HTTP متصل می‌شود به: "evil.com" ✗

وکتورهای حمله واقعی:

۱. سردرگمی با علامت @:

bash
1http://whitelisted.com@attacker.com
2http://whitelisted.com%00@attacker.com

۲. بک‌اسلش در مقابل اسلش جلو:

bash
1http://whitelisted.com\.attacker.com
2http://whitelisted.com/..​.attacker.com

۳. دستکاری نقطه:

bash
1http://whitelisted.com.attacker.com
2http://whitelisted.com。attacker.com (نقطه تمام‌عرض)

۴. ترفندهای کدگذاری:

bash
1http://whitelisted.com%2f%2f@attacker.com
2http://whitelisted.com%09@attacker.com

چگونه تشخیص یا پیشگیری کنیم

راهبردهای پیشگیری:

۱. استفاده از تجزیه‌گر یکسان برای اعتبارسنجی و درخواست:

python
1# بد: تجزیه‌گرهای متفاوت
2if urllib.parse.urlparse(url).hostname in whitelist: # تجزیه‌گر A
3 requests.get(url) # تجزیه‌گر B - ممکن است اختلاف داشته باشد!
4
5# بهتر: تجزیه‌گر یکسان
6session = requests.Session()
7parsed = session.prepare_request(Request('GET', url)).url
8# اکنون URL آماده شده را اعتبارسنجی کنید

۲. حل و اعتبارسنجی IP:

python
1hostname = urlparse(url).hostname
2ip = socket.gethostbyname(hostname)
3if is_private_ip(ip) or ip == "169.254.169.254":
4 block()

۳. استفاده از حالت‌های تجزیه سخت‌گیرانه:

python
1# در صورت وجود حالت سخت‌گیرانه فعال کنید
2parsed = urllib.parse.urlparse(url, allow_fragments=False)

۴. بررسی فرم متعارف:

python
1# رد URLهای دارای الگوهای مشکوک
2suspicious = ['@', '\\', '%00', '\t', '\n']
3if any(char in url for char in suspicious):
4 reject()

تشخیص:

  • ثبت URLها قبل و بعد از تجزیه
  • مقایسه خروجی تجزیه‌گر در کتابخانه‌های مختلف
  • هشدار در مورد URLهای دارای کاراکترهای غیرعادی
  • تست با بارهای سردرگمی تجزیه‌گر

باورهای غلط رایج

  • "تجزیه URL استاندارد شده است" - موارد لبه زیادی وجود دارد
  • "کتابخانه من آن را به درستی مدیریت می‌کند" - برای اطمینان تست کنید
  • "اعتبارسنجی + کدگذاری آن را حل می‌کند" - تجزیه‌گر اول اجرا می‌شود
  • "تجزیه‌گرهای مدرن ایمن هستند" - دور زدن‌های جدید مرتباً پیدا می‌شوند
  • "فقط دامنه را بررسی کنید" - استخراج دامنه بخش آسیب‌پذیر است

مثال واقعی

تحقیقات Orange Tsai (۲۰۱۷)

ناسازگاری تجزیه‌گر را در موارد زیر کشف کرد:

  • Python (urllib، urllib2، requests)
  • PHP (parse_url)
  • Java (Java.net.URL)
  • JavaScript (URL API)

دور زدن SSRF در پایتون:

python
1# اعتبارسنج از urlparse استفاده می‌کند
2url = "http://localhost%09@good.com"
3urlparse(url).hostname # برمی‌گرداند: "good.com"
4
5# کتابخانه requests متصل می‌شود به
6# localhost (کاراکتر تب %09 تجزیه‌گر را گیج می‌کند)

SSRF در Shopify (۲۰۱۸)

ruby
1# Ruby URI.parse
2url = "http://0x7f.1:22​/"
3URI.parse(url).host # برمی‌گرداند: "0x7f.1"
4
5# اما هگز "0x7f.1" به 127.0.0.1 حل می‌شود
6# مسدودیت localhost را دور زد

CVE تجزیه URL در Safari

bash
1file:///​/evil.com/path
  • Safari تجزیه کرد: پروتکل file، مسیر محلی
  • در واقع از evil.com واکشی کرد
  • امکان خواندن دلخواه فایل را فراهم کرد

اصطلاحات مرتبط

URL, SSRF, Bypass, Domain, HTTP Request

منابع و مراجع

  • www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf

مفاهیم مرتبط

نشانی وب(URL)

آدرس وب که مکان یک منبع را در اینترنت مشخص می‌کند، مانند https://example.com/page.

جعل درخواست سمت سرور(SSRF)

آسیب‌پذیری که به مهاجمان اجازه می‌دهد سرور را وادار به ارسال درخواست به آدرس‌های داخلی یا خارجی کنند.

دور زدن

تکنیکی برای دور زدن کنترل‌های امنیتی، فیلترها یا محدودیت‌هایی که برای مسدود کردن فعالیت مخرب در نظر گرفته شده‌اند.

نام دامنه

آدرس قابل خواندن برای انسان مانند example.com که به یک آدرس IP نگاشت می‌شود و به خاطر سپردن مکان وب‌سایت‌ها را آسان‌تر می‌کند.