Perl CGI脚本将请求传递给PHP

Perl CGI脚本将请求传递给PHP,php,perl,cgi,fastcgi,Php,Perl,Cgi,Fastcgi,尝试制作一个简单的Perl脚本,查看GET参数以确定要使用哪个php版本,然后传递请求。以下是整个脚本: #!/usr/bin/perl use FCGI; $cnt = 0; local ($buffer, @pairs, $pair, $name, $value); while(FCGI::accept >= 0){ $php = "php"; $ENV{PHP_FCGI_CHILDREN}=3; $ENV{PHP_FCGI_MAX_REQUESTS}=5000;

尝试制作一个简单的Perl脚本,查看GET参数以确定要使用哪个php版本,然后传递请求。以下是整个脚本:

#!/usr/bin/perl
use FCGI;

$cnt = 0;
local ($buffer, @pairs, $pair, $name, $value);

while(FCGI::accept >= 0){
  $php = "php";

  $ENV{PHP_FCGI_CHILDREN}=3;
  $ENV{PHP_FCGI_MAX_REQUESTS}=5000;
  $buffer = $ENV{'QUERY_STRING'};
  @pairs = split(/&/, $buffer);
  foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    if($name == "php") {
      $php = "php".$value;
    }
  }
  print "Content-Type: text/html\r\n\r\n";
  print `$php $ENV{PATH_TRANSLATED}`;
}
这个想法是PHP版本可以通过GET参数进行切换。。。当我使用
phpversion()
进行测试时,该部分似乎工作正常

因此,这个东西似乎“起作用”,但是一个带有简单
的测试文件输出一个纯字符串,而不是格式化的HTML。它给出了确切的输出,就好像phpinfo()是从命令行运行的一样,因为这正是发生的事情

所以我的问题的两个部分是

  • 这真的是个问题吗
  • 如何将请求“传递”到PHP,而不是调用命令行

  • 您在那里构建的命令注入漏洞很好

    QUERY_STRING='0=5;echo "fail_at_Web_security_forever";rm -rf /'
    
    字符串比较是
    eq
    ,而不是
    =
    。您必须验证用户输入,白名单可接受的输入,并拒绝所有其他输入。缺少标准的CGI参数解析库对于像这样的错误代码来说是典型的:use或类似代码

    要转发/代理请求,请通过HTTP:use或类似方式调用PHP