2013-08-29 22 views
0

試圖製作一個簡單的Perl腳本,查看GET參數以確定要使用哪個php版本,然後傳遞請求。這裏是整個腳本:Perl CGI腳本將請求傳遞到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()測試工作正常。

所以這件事似乎是「工作」,但一個簡單的<?php phpinfo(); ?>測試文件輸出一個純字符串,而不是格式化的HTML。它給出了確切的輸出,就像phpinfo()從命令行運行一樣,因爲這正是發生的事情。

所以兩個部分,我的問題是

  1. 難道這實際上是一個問題嗎?
  2. 我該如何「將請求傳遞給PHP」,而不是調用命令行?

回答

1

你在那裏建立的漂亮的命令注入漏洞。

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

字符串比較eq,不==。您需要必須驗證用戶輸入,白名單可接受的輸入和拒絕所有其他。缺乏標準的CGI參數解析庫對於類似這樣的錯誤代碼是很典型的:使用CGI.pm或類似的代碼。

要轉發/代理請求,請通過HTTP調用PHP:使用LWP::UserAgent或類似方法。