CVE2024-4577 成因梳理
CVE-2012-1823
提到PHP-CGI有关的漏洞 就不得不提起CVE-2012-1823 该漏洞利用php-cgi将用户传入的cgi数据中的query_string部分的-后参数当做了 脚本的处理参数处理
攻击者可以利用-d参数修改配置项 实现远程命令执行的效果 也可以-i读出源码
当时这个漏洞被apache修复了 修复的方式也很简单 就是将-后的参数不作为脚本参数解析 那实际上php-cgi还是能识别参数并执行的
if((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL)
{
/* we've got query string that has no = - apache CGI will pass it to command line */
unsigned char *p;
decoded_query_string = strdup(query_string);
php_url_decode(decoded_query_string,strlen(decoded_query_string));
for (p = decoded_query_string; *p && *p <= ' '; p++)
{
/* skip all leading spaces */
} if(*p == '-') {
skip_getopt = 1; // 就在这里 当检测到 - 后就会跳过解析
}
free(decoded_query_string);
}
CVE2024-4577
作为一个新的漏洞 其被我们祖国的台湾的orange老师发现
简单的说 这个漏洞就是绕过了-符号
在中间件为Unicode但操作系统使用的为中文 日文 繁体 等中南亚国家文字编码时 需要编码适配
编码适配时 会匹配best-fit 匹配后会将超出限度的编码适配到可表示的编码
详见:
https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt
有这么一条编码适配 现在我们只要使用0xad替换-进行测试
这个漏洞常见于 xampp xampp是国外常用的中间件 其中间件编码默认为Unicode 当安装主机使用中文编码后会触发最佳适配
但是这个漏洞的前提是 apache使用php-cgi解析cgi数据 但是一般中间件不会再使用php-cgi 而是使用效率更好的 php-mod php-fpm来解析
但是xampp会把php-cgi放在默认的cgi目录下 我们可以直接通过目录访问php-cgi
但是默认配置中php-cgi是不允许直接访问的
cgi.force_redirect=1
强制重定向选项 只接受重定向来的数据 对直接访问的数据不处理
但是 我们可以利用最新的漏洞 用-d选项把强制重定向给关闭了
如上图 添加选项并通过 phpinput伪协议 可以实现任意命令执行