96SEO 2026-02-19 22:24 45
CVE-2024-4577是CVE-2012-1823这个老漏洞的绕过php

简单来说就是使用cgi模式运行的PHP根据RFC3875的规定Apache会将请求的QUERY_STRING作为命令行参数交给php-cgi执行。
攻击者利用这个特性就可以-d选项修改PHP的配置项最后执行任意代码。
strdup(query_string);php_url_decode(decoded_query_string,
strlen(decoded_query_string));for
}修复方式就是在获取到QUERY_STRING后检查其开头是否是横线-如果是-则跳过后面对参数的解析。
而Orange
这次发现的CVE-2024-4577实际上就是横线检查的绕过来说下原理。
Page非Unicode编码在main()函数获取argv的时候会自动执行编码的转换其中就会涉及到所谓的Best-Fit。
cp936
Best-Fit是一种字符映射策略用以解决源代码页中的字符在目标代码页中没有直接等价物时的问题。
在将Unicode代码页中字符转换成非Unicode代码页字符时如果无法找到对应的字符就会按照Best-Fit预定义的一个转换表进行转换。
Mapping转换表是https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit936.txt
其中有一些有趣的字符转换比如0xaa在转换后会变成a0xb2在转换后会变成20xad在转换后会变成-。
所以这里我们就可以利用Best-Fit这个特性使用%ad来代替横线-。
PHP在执行上述检查的时候会认为命令行的第一个字符是0xAD实际上main()函数的argv的第一个字符已经被Windows按照best-fit
我们可以编写下面这个简单的Python代码来复现best-fit这个trick
但我们多测试几次就会发现并不是所有程序的所有参数都会进行Best-Bit的转换我们测试下面几个命令
阅读PHP代码就会发现有一部分选项是直接使用的main()函数的argv另一部分选项是从Windows
GetCommandLineW()函数获取。
由GetCommandLineW()获取的这部分参数仍然保持原样没有转换成横线最后无法正确执行。
Orange在文章中提到XAMPP默认配置就可以被利用。
最初读到这里的时候我会以为XAMPP是以php-cgi模式运行的PHP服务器但下载安装XAMPP后我发现PHP实际上是以Apache
这时候就非常有趣了为什么XAMPP仍然可以在不修改任何配置文件的情况下直接利用呢为什么很多人在实际测试中会遇到500错误呢
比如默认情况下我们需要将php解释器放在cgi-bin目录下这样用户通过访问/cgi-bin/php/dir/script.php即可执行/dir/script.php。
这个操作是很危险的所以PHP增加了如下配置cgi.force_redirect1开启了这个选项默认开启以后只有经过了重定向规则请求才能执行。
Apache在重定向rewrite的时候会增加一个名为REDIRECT_STATUS的环境变量cgi.force_redirect就是依赖这个环境变量来判断是否经历了重定向。
如果非Apache服务器我们就需要设置一下cgi.redirect_status_env来指定php判断请求是否经历重定向的条件。
我们下载XAMPP后查看PHPINFO可以发现其运行PHP的模式是“Apache
Handler”。
在这个模式下PHP会被编译成Apache的一个模块dll动态链接库并由Apache来调用执行。
我们在apache/conf/extra/httpd-xampp.conf中可以找到相关的配置
/program/xampp/xampp/php/php8ts.dllLoadFile
/program/xampp/xampp/php/libpq.dllLoadFile
/program/xampp/xampp/php/libsqlite3.dllLoadModule
/program/xampp/xampp/php/php8apache2_4.dllFilesMatch
application/x-httpd-php/FilesMatchFilesMatch
application/x-httpd-php-source/FilesMatch可见这里所有的.php后缀文件会被交给php8apache2_4.dll来执行这和PHP
如果是部署基于脚本的CGI服务器我们需要将可执行文件放置在某个目录下比如/cgi-bin/hello.cgi。
这个hello.cgi脚本的第一行是“shebang”用以指定当前脚本的解释器比如
http://yourdomain.com/cgi-bin/hello.cgi。
事实上几乎没有PHP应用会这么编写代码相比于这种将脚本直接作为可执行文件的方法PHP另辟蹊径专门设计了一个SAPI就叫php-cgi。
调用php-cgi执行一个PHP文件时它会负责输出“Content-Type”头。
比如执行echo
所以类似于hello.cgi我们也可以直接将php-cgi这个可执行文件映射到/cgi-bin/目录下然后再使用Apache的Action指令将PHP相关请求“重定向”到php-cgi上最后执行PHP代码。
/program/xampp/xampp/php/Directory
/program/xampp/xampp/htdocsAddHandler
ScriptAlias指令的作用是将/php-cgi/路径指向/program/xampp/xampp/php/目录
Action指令的作用就是将所有对.php文件的请求都使用/php-cgi/php-cgi.exe也就是/program/xampp/xampp/php/php-cgi.exe来执行。
Apache在调用php-cgi的时候会设置环境变量REDIRECT_STATUS。
php-cgi为了确认这个请求确实是由Action指令执行的而不是用户直接请求的增加了一个开关“cgi.force_redirect”默认开启。
开启这个开关的情况下php-cgi会验证此次执行是否包含环境变量REDIRECT_STATUS。
了解了php-cgi正常的部署方式我们回来看下XAMPP。
虽然XAMPP执行PHP时使用的是Apache
CGI预留了一个口子就是使用ScriptAlias指令把php-cgi.exe映射到了Web目录下。
上述两个关键指令XAMPP中使用了ScriptAlias指令但是Action指令被注释了
这本身也没太大问题因为有cgi.force_redirect的限制在没有Action指令的情况下直接访问php-cgi.exeREDIRECT_STATUS环境变量不会被设置。
我们可以做个测试直接请求/php-cgi/php-cgi.exe会返回500错误查看日志会有Security
因为我们前面说到对于REDIRECT_STATUS环境变量的限制是cgi.force_redirect这个开关来决定的。
那么我们直接利用CVE-2024-4577漏洞添加-d
cgi.force_redirect0关闭这个开关即可绕过限制了。
值得注意的是因为在高版本PHP中allow_url_include这个开关已经被废弃所以会抛出一个警告导致Content-Type头输出失败也会返回500。
网上很多人没有注意到这一点我们需要添加一个-d
PHP没有修复的另一种cgi.force_redirect绕过
cgi.force_redirect0关闭PHP的检查实际上PHP中有另一个Bug也可以导致cgi.force_redirect的绕过而且最新版本仍然没有修复
我们查看PHP源码sapi/cgi/cgi_main.c中对于REDIRECT_STATUS环境变量的检查代码
!getenv(CGIG(redirect_status_env))))
{SG(sapi_headers).http_response_code
php_message_handler_for_zend:839
SG(request_info).path_translated
可见除了getenv(REDIRECT_STATUS)以外还有一个getenv(HTTP_REDIRECT_STATUS)这两个环境变量都可以用于cgi.force_redirect的检查。
而第二个环境变量HTTP_REDIRECT_STATUS是由HTTP_开头。
httpoxy漏洞就是因为很多HTTP客户端会使用HTTP_PROXY环境变量的值作为代理因为这个环境变量是HTTP_开头导致我们可以通过HTTP请求头控制造成漏洞
PHP这里也是一样的问题环境变量HTTP_REDIRECT_STATUS原本是为了兼容Netscape但它是由HTTP_开头所以用户可以直接控制。
PHP这里也是一样的问题环境变量HTTP_REDIRECT_STATUS原本是为了兼容Netscape但它是由HTTP_开头所以用户可以直接控制。
cgi.force_redirect0并添加一个HTTP头Redirect-Status:
虽然CVE-2024-4577漏洞在最新的PHP版本中已经修复了但这个环境变量HTTP_REDIRECT_STATUS仍然可以导致cgi.force_redirect的绕过。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback