【问题标题】:Perl CGI script pass request to PHPPerl CGI 脚本将请求传递给 PHP
【发布时间】:2013-09-01 09:34:51
【问题描述】:

尝试制作一个简单的 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,而不是调用命令行?

【问题讨论】:

    标签: php perl cgi fastcgi


    【解决方案1】:

    您在那里构建的不错的命令注入漏洞。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2011-03-29
      • 2011-12-03
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多