
يوضح استغلال SSRF عبر الاختلاف في محلل عناوين URL بين urllib.parse وrequests، بما في ذلك الخدمة القابلة للاستغلال وسكربت استغلال PoC.
# vulnerable_service.py - Validates URL with urllib.parse, fetches with requests
from flask import Flask, request
import requests
import urllib.parse
app = Flask(__name__)
def is_allowed_url(url):
parsed = urllib.parse.urlparse(url)
# Only allow http://localhost and http://127.0.0.1
return parsed.hostname in ('localhost', '127.0.0.1')
@app.route('/fetch')
def fetch():
url = request.args.get('url')
if not is_allowed_url(url):
return "Blocked", 403
# Fetch with requests (different parser)
r = requests.get(url, timeout=5)
return r.text
if __name__ == '__main__':
app.run(port=5000)
تستخدم الخدمة دالة urllib.parse.urlparse في بايثون للتحقق من الروابط، لكنها تجلبها لاحقًا باستخدام مكتبة requests. تؤدي الاختلافات في طريقة تعامل المحللين مع الأحرف الخاصة (مثل @) إلى تمكين المهاجم من تجاوز القائمة البيضاء والوصول إلى الموارد الداخلية.
urlparse مع [email protected] على أن اسم المضيف هو localhost (الجزء قبل @ هو اسم المستخدم)، بينما يفسر requests المضيف على أنه evil.com.pip install flask requests
python vulnerable_service.py
python exploit_ssrf_parser_diff.py