George0Papasotiriou/CVE-2026-2020-SSRF-via-URL-Parser-Differential
GitHub: George0Papasotiriou/CVE-2026-2020-SSRF-via-URL-Parser-Differential
该项目复现了 CVE-2026-2020 SSRF 漏洞,演示 Python 中 urllib.parse 与 requests 两个 URL 解析器差异导致白名单绕过的完整攻击链。
Stars: 0 | Forks: 0
## CVE-2026-2020 – 通过 URL Parser Differential 触发的 SSRF
### **程序代码 (Python)**
```
# vulnerable_service.py - 使用 urllib.parse 验证 URL,使用 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)
```
# CVE-2026-2020 – 通过 URL Parser Differential 触发的 SSRF

## 概述
某服务使用 Python 的 `urllib.parse.urlparse` 来验证 URL,但随后却使用 `requests` 库来获取它们。这两个解析器在处理特殊字符(如 `@`)时的差异,允许攻击者绕过白名单并访问内部资源。
## 漏洞详情
- **类型:** Server‑Side Request Forgery (SSRF) – Parser Differential
- **影响:** 访问内部服务,云元数据泄露。
- **根本原因:** `urlparse` 将 `localhost@evil.com` 的主机名视为 `localhost`(`@` 之前的部分为用户名),而 `requests` 则将 host 解释为 `evil.com`。
## 漏洞利用演示
1. 启动易受攻击的服务:
pip install flask requests
python vulnerable_service.py
2. 运行漏洞利用:
python exploit_ssrf_parser_diff.py
标签:CISA项目, Flask, Maven, Python, Syscall, Web开发, 安全, 无后门, 服务端请求伪造, 漏洞验证, 超时处理, 逆向工具