参考文献:
CVE-2024-4577 PHP CGI 远程执行漏洞分析 - FreeBuf网络安全行业门户
PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现-CSDN博客
如何在 XAMPP 中使用 不同的 PHP 版本_xampp选择php版本-CSDN博客
1、漏洞原理
漏洞分析
PHP存在操作系统命令注入漏洞,该漏洞源于在特定条件下,Windows系统使用“Best-Fit”行为替换命令行中的字符,Windows系统中字符编码转换的Best-Fit特性是指Windows操作系统在处理不同字符编码集之间的转换时使用的一种匹配机制。当系统中存在无法直接映射到目标编码集的字符时,Best-Fit特性会尝试寻找一个在语义或外观上最接近的字符来进行替代显示或处理,CVE-2024-4577是依托于Windows系统中字符编码转换的Best-Fit特性对CVE-2012-1823的绕过,利用了%ad这个特殊字符,通过Best-Fit匹配到的是连字符("-")。
这可能导致PHP CGI模块错误地将这些字符解释为PHP选项,攻击者可以使用-d参数来指定配置项的值实现RCE
cgi.force_redirect选项如果被设置为Off或0,关闭必须默认使用重定向规则的请求来执行PHP CGI,从而可以实现直接访问;
allow_url_include选项如果被设置为On或1,PHP将允许包含(include)通过URL指定的文件;
auto_prepend_file=php://input:这个参数设置auto_prepend_file配置项,使其指向php://input流。php://input是一个可以读取通过POST方法发送到脚本的原始数据的流。通过设置这个配置,攻击者可以控制PHP脚本执行前自动包含的文件,这里实际上是包含了通过POST发送的数据。从而泄露脚本的源代码,在服务器上运行任意PHP代码等。
影响范围
8.1 > PHP > 8.1.29
8.3 > PHP > 8.3.8
8.2 > PHP > 8.2.20
2、漏洞复现
Windows 7虚拟机 192.168.94.150
环境搭建
查看已下载的XAMPP中php版本的方法:开启Apache服务-点击右侧Shell-输入“php -v”
如果发现不是受影响版本,可以参考这个如何在 XAMPP 中使用 不同的 PHP 版本_xampp选择php版本-CSDN博客
我改了半天没成功,就直接把原来的XAMPP卸载了,又下载了一个带有漏洞版本的XAMPP
官网地址:Download XAMPP (apachefriends.org)
这两个应该都可以,我下载的8.1.25
漏洞利用
下载好之后不用任何配置,开启Apache服务后,在浏览器上打开代理直接访问,使用burpsuit进行拦截之后发送到重放器修改请求
修改前:
修改后:
POST /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
%ADd 使用%ad代替常规连字符-,绕过原本应该阻止参数传递的安全机制
cgi.force_redirect=0或off 关闭使用重定向规则的请求来执行PHP CGI,进行直接访问
allow_url_include=1或on 可以使用使用include和require等方式包含远程文件,不管是包含本地php文件还是远程php文件,都会执行文件内容
auto_prepend_file=php://input 指定了包含的php脚本为POST输入
3、漏洞修复
将PHP升级到官方最新版本 8.3.9、8.2.21和8.1.29
官方补丁:PHP: Downloads