PHP-fpm远程代码执行漏洞的影响及修复方法

  

本篇内容介绍了“PHP-fpm远程代码执行漏洞的影响及修复方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

漏洞复现

为了能更方便的复现漏洞,这里我们采用vulhub来构建漏洞环境。

https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043

git pull并docker-compose up -d

访问http://{your_ip}:8080/

PHP-fpm远程代码执行漏洞的影响及修复方法

下载github上公开的exp(需要go环境)。

go get github.com/neex/phuip-fpizdam

然后编译

go install github.com/neex/phuip-fpizdam

使用exp攻击demo网站

phuip-fpizdam http://{your_ip}:8080/

PHP-fpm远程代码执行漏洞的影响及修复方法PHP-fpm远程代码执行漏洞的影响及修复方法

攻击成功

漏洞分析

在分析漏洞原理之前,我们这里可以直接跟入看修复的commit

https://github.com/php/php-src/commit/ab061f95ca966731b1c84cf5b7b20155c0a1c06a#diff-624bdd47ab6847d777e15327976a9227

PHP-fpm远程代码执行漏洞的影响及修复方法

从commit中我们可以很清晰的看出来漏洞成因应该是path_info的地址可控导致的,再结合漏洞发现者公开的漏洞信息中提到

The regexp in `fastcgi_split_path_info` directive can be broken using the newline character (in encoded form, %0a). Broken regexp leads to empty PATH_INFO, which triggers the bug.

也就是说,当path_info被% 0 a截断时,path_info将被置为空,回到代码中我就不难发现问题所在了。

 PHP-fpm远程代码执行漏洞的影响及修复方法”>其中env_path_info就是变量path_info的地址,path_info为0则plien为0。</p> <p> slen变量来自于请求后url的长度</p> <>之前,,,,int  ptlen =, strlen (pt);
  ,,,int  slen =, len 作用;ptlen; </pre> <p>其中</p> <pre> int  len =, script_path_translated_len;
  len为url路径长度
  当请求url为http://127.0.0.1/index.php/123%0atest.php
  script_path_translated来自于nginx的配置,为/var/www/html/index . php/123 \ ntest.php
  ptlen则为url路径第一个斜杠之前的内容长度
  当请求url为http://127.0.0.1/index.php/123%0atest.php
  pt为/var/www/html/索引。null
  null
  null
  null
  null<h2 class=PHP-fpm远程代码执行漏洞的影响及修复方法