تجزیهگر URL
جزئی که یک URL را به اجزای آن (پروتکل، دامنه، مسیر و غیره) تجزیه میکند. تجزیهگرهای مختلف میتوانند یک URL را متفاوت تفسیر کنند و مشکلات امنیتی ایجاد کنند.
تعریف کوتاه
تجزیهگر URL یک URL را میخواند و آن را به تکهها (طرح، میزبان، مسیر) تقسیم میکند. مشکل: تجزیهگرهای مختلف در نحوه تقسیم یک URL اختلاف نظر دارند، بنابراین بررسی امنیتی شما و درخواست واقعی ممکن است مقاصد متفاوتی را ببینند.
تعریف کامل
تجزیهگر URL کدی است که یک رشته URL را تفسیر کرده و اجزای آن را استخراج میکند. هر زبان برنامهنویسی و کتابخانه تجزیهگر مخصوص خود را دارد و همیشه با هم توافق ندارند.
آنچه تجزیهگرها استخراج میکنند:
1https://user:pass@example.com:8080/path?query=1#fragment
تجزیهگر برمیگرداند:
- طرح: https
- نام کاربری: user
- رمز عبور: pass
- نام میزبان: example.com
- پورت: ۸۰۸۰
- مسیر: /path
- پرسوجو: query=1
- بخش: fragment
مشکل: URLهای مبهم
1http://evil.com@good.com
- برخی تجزیهگرها: username=evil.com, host=good.com
- برخی دیگر: host=evil.com, path=@good.com
- نتیجه: دور زدن امنیتی
چرا مهم است
- تصمیمات امنیتی بر اساس خروجی تجزیهگر
- ناسازگاری تجزیهگر = فرصتهای دور زدن
- فیلترهای SSRF اغلب به تجزیه URL وابسته هستند
- یک URL میتواند برای سیستمهای مختلف معانی متفاوتی داشته باشد
- آزمایش همه رفتارهای تجزیهگر سخت است
چگونه مهاجمان از آن استفاده میکنند
حمله سردرگمی تجزیهگر:
1# اعتبارسنجی امنیتی2parsed = urlparse(user_input)3if parsed.hostname == "trusted-site.com":4 fetch(user_input) # تأیید شد56# مهاجم ارائه میدهد:7"http://trusted-site.com@evil.com"89# اعتبارسنج میبیند: hostname = "trusted-site.com" ✓10# کتابخانه HTTP متصل میشود به: "evil.com" ✗
وکتورهای حمله واقعی:
۱. سردرگمی با علامت @:
1http://whitelisted.com@attacker.com2http://whitelisted.com%00@attacker.com
۲. بکاسلش در مقابل اسلش جلو:
1http://whitelisted.com\.attacker.com2http://whitelisted.com/...attacker.com
۳. دستکاری نقطه:
1http://whitelisted.com.attacker.com2http://whitelisted.com。attacker.com (نقطه تمامعرض)
۴. ترفندهای کدگذاری:
1http://whitelisted.com%2f%2f@attacker.com2http://whitelisted.com%09@attacker.com
چگونه تشخیص یا پیشگیری کنیم
راهبردهای پیشگیری:
۱. استفاده از تجزیهگر یکسان برای اعتبارسنجی و درخواست:
1# بد: تجزیهگرهای متفاوت2if urllib.parse.urlparse(url).hostname in whitelist: # تجزیهگر A3 requests.get(url) # تجزیهگر B - ممکن است اختلاف داشته باشد!45# بهتر: تجزیهگر یکسان6session = requests.Session()7parsed = session.prepare_request(Request('GET', url)).url8# اکنون URL آماده شده را اعتبارسنجی کنید
۲. حل و اعتبارسنجی IP:
1hostname = urlparse(url).hostname2ip = socket.gethostbyname(hostname)3if is_private_ip(ip) or ip == "169.254.169.254":4 block()
۳. استفاده از حالتهای تجزیه سختگیرانه:
1# در صورت وجود حالت سختگیرانه فعال کنید2parsed = urllib.parse.urlparse(url, allow_fragments=False)
۴. بررسی فرم متعارف:
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 در پایتون:
1# اعتبارسنج از urlparse استفاده میکند2url = "http://localhost%09@good.com"3urlparse(url).hostname # برمیگرداند: "good.com"45# کتابخانه requests متصل میشود به6# localhost (کاراکتر تب %09 تجزیهگر را گیج میکند)
SSRF در Shopify (۲۰۱۸)
1# Ruby URI.parse2url = "http://0x7f.1:22/"3URI.parse(url).host # برمیگرداند: "0x7f.1"45# اما هگز "0x7f.1" به 127.0.0.1 حل میشود6# مسدودیت localhost را دور زد
CVE تجزیه URL در Safari
1file:////evil.com/path
- Safari تجزیه کرد: پروتکل file، مسیر محلی
- در واقع از evil.com واکشی کرد
- امکان خواندن دلخواه فایل را فراهم کرد
اصطلاحات مرتبط
URL, SSRF, Bypass, Domain, HTTP Request