漏洞信息
漏洞影响版本如下(XAMPP默认安装的配置下可以直接利用):
PHP 8.3 < 8.3.8
PHP 8.2 < 8.2.20
PHP 8.1 < 8.1.29
简要说明
CVE-2012-1823
简要概括就是,当将PHP的环境设为CGI模式下运行时,请求参数部分就会带入作为php-cgi.exe的参数,因此可以通过-d来设定参数allow_url_include、auto_prepend_file(勾起N年前学文件包含的回忆),将完整的参数信息(需要URL编码)带入到请求参数中,发送请求达到代码执行的目的。
CVE-2024-4577
补丁分析
根据PHP漏洞修复的Commit提交信息来看,在cgi_main.c文件中,原有的逻辑新增了对Windows环境的单独逻辑判断,并且其中对请求参数使用了WideCharToMultiByte函数,即宽字节的转换。
因此结合已知的漏洞信息,确认此处是编码问题导致的。也就表示我们需要绕过的逻辑是if(*p == '-'),即请求参数第一个字符不能为-。
结合补丁信息我们知道在带入参数拼接前,宽字节会被转换。所以,以简体中文的Windows版本(在Windows中使用Page 936表示GBK编码)为例,对应的编码表信息,我们可以在该链接中找到:https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt
通过搜索我们得知0x00ad可以被解码为0x002d也就是上文中提到的-符号。
漏洞复现
基于CVE-2012-1823将请求参数中的-替换为%ad,带入尝试发现漏洞成功复现,也就验证了我们之前的分析。
总结
最后引用猪猪侠的话:知识面决定攻击面。
PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析:https://www.leavesongs.com/PENETRATION/php-cgi-cve-2012-1823.html