PHP-FPM越界写入漏洞利用详解

本文详细分析了PHP-FPM中CVE-2019-11043漏洞的利用方法,该漏洞存在于特定nginx+php-fpm配置中,攻击者可通过越界写入实现远程代码执行,文章包含漏洞原理、利用条件和实际操作步骤。

PHuiP-FPizdaM - CVE-2019-11043漏洞利用工具

工具简介

这是一个针对php-fpm中漏洞(CVE-2019-11043)的利用工具。在特定的nginx + php-fpm配置中,该漏洞可以从外部触发。这意味着如果您的配置存在漏洞(参见下方),网站用户可能获得代码执行权限。

技术分析

虽然我们懒得写详细分析,但Orange Tsai在他的博客中发布了完美分析。同时,我在ZeroNights 2019的幻灯片也可获取

受影响环境

如果Web服务器运行nginx + php-fpm,并且nginx具有如下配置:

1
2
3
4
5
6
7
location ~ [^/]\.php(/|$) {
  ...
  fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  fastcgi_param PATH_INFO       $fastcgi_path_info;
  fastcgi_pass   php:9000;
  ...
}

同时缺少任何脚本存在性检查(如try_files),那么您可能可以使用此漏洞利用工具进行攻击。

完整前置条件列表

  1. Nginx + php-fpm,location ~ [^/]\.php(/|$)必须转发到php-fpm
  2. 必须存在通过fastcgi_param PATH_INFO $fastcgi_path_info;语句设置的PATH_INFO变量
  3. 必须存在将PATH_INFO设置为空值的方法
  4. 此特定漏洞利用假设在配置中PATH_INFOREQUEST_URI之后设置
  5. 没有文件存在性检查,如try_files $uri =404if (-f $uri)
  6. 此漏洞利用仅适用于PHP 7+

安装与运行

使用以下命令安装:

1
go get github.com/neex/phuip-fpizdam

如果遇到奇怪的编译错误,请确保使用go >= 1.13。运行程序使用phuip-fpizdam [url]

测试环境搭建

使用Docker

  1. 克隆此仓库并进入reproducer目录
  2. 创建docker镜像:docker build -t reproduce-cve-2019-11043 .
  3. 运行docker:docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043
  4. 现在您拥有http://127.0.0.1:8080/script.php,这是一个空文件
  5. 运行漏洞利用工具:phuip-fpizdam http://127.0.0.1:8080/script.php

关于PHP5

php-fpm中的缓冲区下溢在PHP 5版本中存在。但是,此漏洞利用利用了用于存储FastCGI变量的优化_fcgi_data_seg,该优化仅存在于php 7中。

许可证

此漏洞利用工具根据MIT许可证分发。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计