CVE-2022-31625 PHP内存未初始化导致RCE漏洞成因分析和复现

一颗小胡椒2022-06-11 22:49:56

漏洞信息

接上文:

CVE-2022-31626 PHP远程命令执行漏洞成因分析与复现
XCyber,公众号:且听安全CVE-2022-31626 PHP远程命令执行漏洞成因分析与复现

PHP 同时还通报了另一个高危漏洞信息,编号为 CVE-2022-31625:

在 `PHP_FUNCTION` 中分配在堆上的 `char*` 数组没有被清除,如果发生转换错误,将会调用 `_php_pgsql_free_params` 函数,由于数组没有初始化,导致可以释放之前请求的值,导致远程代码执行。漏洞影响版本:

  •  5.3.0 <= PHP 5.x <= 5.6.40
  •  7.0.1 <= PHP 7.x < 7.4.30
  •  8.0.0 <= PHP 8.0.x < 8.0.20
  •  8.1.0 <= PHP 8.1.x < 8.1.7

漏洞成因

在 `PHP_FUNCTION` 中,利用 `safe_emalloc` 申请指针数组 `params` ,但是没有进行初始化,导致 `params` 数组中包含有内存中残留的数据或指针。如果发生异常,代码会执行 `_php_pgsql_free_params` 函数对整个指针数组进行释放:

在 `_php_pgsql_free_params` 函数中,根据数组中元素的总数量 `num_params` 逐个释放非 0 的指针,但是这个指针可能尚未被未初始化,因此导致非预期的内存释放:

这是典型的内存未初始化漏洞,如果攻击者能够控制未初始化的内存内容,可以实现任意内存释放,进而实现释放后再引用 UAF ,最终实现远程代码执行。在最新的 PHP 版本中,已经对该漏洞进行修复,将原来的总数 `num_params` 改为了当前计数值 `i` ,以此来保证所有释放的指针都是初始化过的:

漏洞复现

修改 `php.ini`,启用 `pgsql` 扩展:

extension=pgsql

postgres 数据库安装:

sudo apt install postgresql postgresql-contribsudo /etc/init.d/postgresql start

postgres 配置密码并允许网络访问。重启服务:

sudo /etc/init.d/postgresql restartsudo /etc/init.d/postgresql status

利用 POC ( `test.php` )触发漏洞,可以看到 `efree` 释放了一个错误地址导致进程崩溃:

php.exe -f test.php

修复方式

该内存未初始化漏洞,容易转化成 UAF 漏洞,利用难度比 CVE-2022-31626 要简单。通过远程堆风水极有可能实现任意内存释放,进而通过 UAF 实现远程代码执行。受影响客户需要尽快做好补丁升级和防护。

目前官方已发布修复版本,用户可升级至以下安全版本:

  •  PHP 8.1.7
  •  PHP 8.0.20
  •  PHP 7.4.30
php初始化
本作品采用《CC 协议》,转载必须注明作者和本文链接
lmxcms代码审计学习
2023-03-30 09:40:23
前方多图预警,本文适合在wifi状态下查看前言最近学习php代码审计,lmxcms很适合去学习代码审计,因为比较简单。m=Book&a=reply&id=1) and updatexml--+前台SQL注入TagsAction.class.php中看不出来$data['name']的值是如何来的,查看的p的方法可以看到type=2的时候为GET传递,说明我们可以控制这个参数,继续看能不能利用查看getNameData的声明查看oneModel查看oneDB接着在这上面写个echo $sql;/index.php/?m=search&keywords=b&mid=1&tuijian=id%20or%20;%23这里0x6c对应的是l回显长度为8425,随便改个参数,返回包长度变为5403用remen参数回显为8422写一个简单的python脚本就可以测出值import requestsflag=""url="http://127.0.0.1/lmxcms1.4/index.php?
vulnhub 靶场 napping
2022-09-29 07:34:39
信息收集主机发现:sudo nmap -sn 192.168.56.1/24. -sC Performs a script scan using the default set of scripts. It is equivalent to --script=default. Some of the scripts in this category are considered intrusive and should not be run against a target network without permission.-sV Enables version detection, as discussed above. Alternatively, you can use -A, which enables version detection among other things.-p This option specifies which ports you want to scan and overrides the default. Individual port numbers are OK, as are ranges separated by a hyphen . The beginning and/or end values of a range may be omitted, causing Nmap to use 1 and 65535, respectively. So you can specify -p- to scan ports from 1 through 65535. Scanning port zero is allowed if
又一个 PHP 远程命令执行漏洞 CVE-2022-31625。在 PHP_FUNCTION中分配在堆上的数组没有被清除,如果发生转换错误,由于数组没有初始化,导致可以释放之前请求的值,导致远程代码执行。
FastCGI与PHP-FPM FastCGI 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使[服务器可以同时处理更多的网页请求。
利用SSRF渗透内网主机
2021-12-26 07:39:35
接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程。
0x00前言 接到任务,需要对一些违法网站做渗透测试…… 0x01信息收集 根据提供的目标,打开网站如下
0x00前言接到任务,需要对一些违法网站做渗透测试……最终定位到该系统为某网络验证系统下载最新版的代码到本地,开始审计。
PHP官方确认,于6月9日,PHP官网发布了该漏洞的修复方案。
这意味着如果变量名后面附加了圆括号,PHP 将寻找与变量求值结果同名的函数,并尝试执行它。除其他事项外,这可用于实现回调、函数表等。利用包装函数将这些构造中的任何一个用作变量函数。这可能是另一种规避阻止 PHP 函数名称的规则的方法。
一颗小胡椒
暂无描述