Perl CGI脚本向PHP传递请求

时间:2013-08-29 05:06:59

标签: 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;
  $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}`;
}

我的想法是可以使用GET参数切换PHP版本...当我使用phpversion()进行测试时,该部分似乎工作正常。

所以这个东西似乎“正在工作”但是一个带有简单<?php phpinfo(); ?>的测试文件输出一个纯字符串,而不是格式化的HTML。它给出了精确的输出,好像phpinfo()是从命令行运行的,因为这正是最新的。

所以问题的两个部分是

  1. 这实际上是个问题吗?
  2. 我如何“将请求”传递给PHP,而不是调用命令行?

1 个答案:

答案 0 :(得分:1)

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

QUERY_STRING='0=5;echo "fail_at_Web_security_forever";rm -rf /'

字符串比较为eq,而不是==。您必须验证用户输入,白名单可接受的输入并拒绝所有其他输入。缺少标准CGI参数解析库是典型的错误代码:使用CGI.pm或类似的。

要转发/代理请求,请通过HTTP调用PHP:使用LWP::UserAgent或类似的。