2013-08-29 10 views
0

Essayant de faire un script Perl simple qui regarde un paramètre GET pour déterminer quelle version de php à utiliser, puis passer à la demande. Voici le script tout:Perl requête de script CGI passer à 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}`; 
} 

L'idée est que la version PHP peut être commuté avec un paramètre GET ... cette partie semble fonctionner très bien quand je test avec phpversion().

Donc, cette chose semble fonctionner, mais un fichier de test avec un simple <?php phpinfo(); ?> sort une chaîne pure, PAS le format HTML. Il donne la sortie exacte comme si phpinfo() était exécuté à partir de la ligne de commande, parce que c'est exactement ce qui se passe.

Ainsi, les deux parties à ma question sont

  1. Est-ce vraiment un problème?
  2. Comment devrais-je "passer la requête" à PHP, au lieu d'invoquer la ligne de commande?

Répondre

1

Vulnérabilité d'injection de commande que vous avez créée ici.

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

Comparaison de chaînes est eq, pas ==. Vous devez valider l'entrée de l'utilisateur, l'entrée acceptable de la liste blanche et rejeter tous les autres. L'absence d'une bibliothèque d'analyse de paramètres CGI standard est typique pour un mauvais code comme celui-ci: utilisez CGI.pm ou similaire.

Pour transférer/proxy une demande, appelez PHP via HTTP: utilisez LWP::UserAgent ou similaire.