2013-08-29 2 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 или аналогичный.

Чтобы перенаправить/прокси запросить, вызовите PHP через HTTP: используйте LWP::UserAgent или аналогичный.

Смежные вопросы