php 漏洞-PHP 远程执行代码漏洞警告 (CVE

2019 年 9 月 26 日,PHP 正式发布漏洞公告,其中正式披露了一个远程代码执行漏洞,该漏洞是由 PHP-FPM 中 fpm_main.c 文件env_path_info溢出引起的。该漏洞存在于 PHP-FPM + Nginx 结合特定配置的情况下。PoC漏洞于2019年10月22日公布,PHP与Nginx广泛结合使用,允许攻击者远程执行任意代码,因此危害更大。

PHP-FPM 组件简介

PHP-FPM(FastCGI Process Manager)是另一个PHP FastCGI实现,具有一些附加功能,可用于各种规模的站点,尤其是繁忙的站点。

php代码漏洞扫描工具_php 漏洞_php网站漏洞检测工具

对于 PHP 5.3.3 之前的 PHP,PHP-FPM 是一个旨在将 FastCGI 进程管理集成到 PHP 包中的服务包。如果您使用的是 PHP 5.3.3 之前的 PHP,则必须将其修补到 PHP 源代码中并编译并安装 PHP,然后才能使用它。PHP 5.3.3 早已与 php-fpm 集成,不再是第三方软件包。PHP-FPM 提供了一种更好的方法来管理 PHP 进程,有效控制视频内存和进程,并平滑地重载 PHP 配置。

php代码漏洞扫描工具_php 漏洞_php网站漏洞检测工具

漏洞描述

php 漏洞_php网站漏洞检测工具_php代码漏洞扫描工具

该漏洞是由于 PHP-FPM 中 fpm_main.c 文件env_path_info下溢造成的,并且 sapi/fpm/fpm/fpm_main.c 文件中的第 1140 行包含指针算法,这些算法假定env_path_info的前缀等于 PHP 脚本的路径。但是,代码不会检测是否满足此假设,并且缺少检测会导致“path_info”变量中的针无效。

php网站漏洞检测工具_php 漏洞_php代码漏洞扫描工具

这些条件可以在标准的Nginx配置中实现。如果有这样的 Nginx 配置:

php代码漏洞扫描工具_php网站漏洞检测工具_php 漏洞

攻击者可以使用换行符(以 %0a 编码)破坏“fastcgi_split_path_info”指令中的正则表达式。正则表达式销毁将导致空PATH_INFO,从而触发错误。

此错误会导致代码执行漏洞。在上面的代码中php 漏洞,在调用 FCGI_PUTENV 之前将 path_info[0] 的值设置为 0。攻击者可以使用精心选择的 URL 路径宽度和查询字符串使path_info精确地指向_fcgi_data_seg结构的第一个字节。然后将 0 加载到其中,然后将 'char* pos' 字段向后连接,然后FCGI_PUTENV用脚本路径覆盖一些数据(包括其他快速 CGI 变量)。使用这些技术,攻击者可以创建伪PHP_VALUE fcgi 变量php 漏洞,然后使用一组精心选择的配置值执行代码。

冲击产品:

确定!使用“SplFileObject”读取非常大的文件可以避免将整个文件加载到视频内存中,而是使用迭代器逐行读取文件内容,从而减少内存占用。下面是一个可以读取非常大的文本文件的示例代码:“php$file = new SplFileObject('path/to/large/file.txt');将读取方法设置为迭代器模式 $file->setFlags(SplFileObject::READ_AHEAD |SplFileObject::SKIP_EMPTY |SplFileObject::DROP_NEW_LINE);// 逐行读取文件内容($file$line) {// 处理每行回显$line的内容; }''''在前面的代码中,我们首先使用 'SplFileObject' 类创建了一个文件对象,并使用 'setFlags' 方法将其设置为迭代器模式。接下来,我们使用 'foreach' 循环遍历文件对象,逐行读取文件内容并处理每一行。需要注意的是php内存,如果文件太大,可能会导致视频内存溢出。为了防止这些情况,您可以使用“SplFileObject::fread()”方法来读取固定大小的数据块,并在处理每个块后释放视频内存。下面是一个示例代码: '''php$file = new SplFileObject('path/to/large/file.txt');$chunkSize = 1024;读取:块大小 // 将读取方法设置为二进制模式 $file->setFlags(SplFileObject::READ_BINARY);while(!$file->eof()) {$data = $file->fread($chunkSize);// 处理读取数据块回显$data;// 释放内存 unset($data); }'''在前面的代码中php内存,我们使用 'SplFileObject::fread()' 方法来读取固定大小的数据块,并使用 'unset()' 函数在处理完每个块后释放视频内存。这样可以避免内存溢出问题。