Maison  >  Questions et réponses  >  le corps du texte

Analyser et gérer la fonction eval en PHP

<p>Avertissement : Ceci est juste un exemple pour apprendre l'injection de code PHP, et non du code de production à utiliser de quelque manière que ce soit. Je suis pleinement conscient que ce n'est pas une bonne pratique de codage. </p> <p>J'ai le script PHP suivant : </p> <pre class="brush:php;toolbar:false;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <tête> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Exemple de script</title> ≪/tête> <corps> <h1>Page d'exemple</h1> <p>Maintenant, passons aux mathématiques. Veuillez entrer une formule pour calculer. Par exemple : 1+1. </p> <form method="get"> <p>Formule : <input type="text" name="maths" /></p> <p><input type="submit" value="calculate" /></p> </formulaire> <? if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") ) { echo "<p>Le résultat est :" ; eval("echo (".$_REQUEST["maths"].");"); echo "</p>"; } ?> </corps> </html></pre> <p>Ce script est vulnérable à l'injection de code PHP, j'ai pu le casser en procédant comme suit (principalement découvert par essais et erreurs) : </p> <pre class="brush:php;toolbar:false;">$a='1');phpinfo();echo($a</pre> <p>Cependant, je ne comprends pas entièrement la raison. D'après ce que j'ai compris, je dois compléter l'instruction echo, insérer mon propre code (par exemple phpinfo()), puis écrire une autre fonction (par exemple echo) pour gérer le crochet fermant. </p> <p>Je pensais qu'un code comme celui-ci fonctionnerait :</p> <pre class="brush:php;toolbar:false;">");phpinfo();echo("</pre> <p>Cependant, cela ne fonctionne pas car phpinfo est considéré comme faisant partie de la chaîne et n'est pas évalué par la fonction eval. J'ai également essayé d'échapper aux guillemets sans succès. </p> <p>Question :</p> <ul> <li>Quelle est la bonne façon d’injecter du code ici ? ≪/li> <li>Pourquoi<code>$a='1');phpinfo();echo($a</code> fonctionne-t-il ?</li> </ul><p><br /></p>
P粉476547076P粉476547076455 Il y a quelques jours567

répondre à tous(2)je répondrai

  • P粉561749334

    P粉5617493342023-08-14 11:40:29

    Le problème est que cette déclaration n'est pas valide :

    echo ();

    Cela provoque des erreurs d’analyse. Vous devez donc injecter quelque chose pour éviter cette erreur. Par exemple :

    $var = "1); phpinfo(); echo (1";
    eval("echo ($var);");

    répondre
    0
  • P粉033429162

    P粉0334291622023-08-14 09:44:22

    Lorsque vous utilisez cette entrée, le résultat de la substitution des variables est :

    eval("echo ($a='1');phpinfo();echo($a);");

    La valeur $a='1',并且输出了该赋值的结果(即被赋给 $a 的值)。然后执行了 phpinfo()。最后再次输出了 $a est donc attribuée ici.

    Si vous essayez d'utiliser );phpinfo();echo(,它不会起作用,因为它试图执行 echo ()。但是 echo, au moins un argument est requis.

    Donc, pour injecter du code ici, vous devez vous assurer que l'entrée se termine par quelque chose qui est valide avant echo ( 之后是有效的内容开头,并且以在 ); . Placez tout code supplémentaire que vous souhaitez injecter entre ces deux parties.

    répondre
    0
  • Annulerrépondre