Heim  >  Fragen und Antworten  >  Hauptteil

Parsen und Umgang mit der Eval-Funktion in PHP

<p>Haftungsausschluss: Dies ist nur ein Beispiel für das Erlernen der PHP-Code-Injektion, kein Produktionscode, der in irgendeiner Weise verwendet werden soll. Mir ist völlig bewusst, dass dies keine gute Codierungspraxis ist. </p> <p>Ich habe das folgende PHP-Skript: </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="en"> <Kopf> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Beispielskript</title> </head> <Körper> <h1>Beispielseite</h1> <p>Jetzt zur Mathematik. Bitte geben Sie zur Berechnung eine Formel ein. Zum Beispiel: 1+1. </p> <form method="get"> <p>Formel: <input type="text" name="maths" /></p> <p><input type="submit" value="calculate" /></p> </form> <? if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") ) { echo "<p>Das Ergebnis ist:"; eval("echo(".$_REQUEST["maths"].");"); echo "</p>"; } ?> </body> </html></pre> <p>Dieses Skript ist anfällig für die Einschleusung von PHP-Code. Ich konnte es auf folgende Weise knacken (meist durch Versuch und Irrtum herausgefunden): </p> <pre class="brush:php;toolbar:false;">$a='1');phpinfo();echo($a</pre> <p>Allerdings verstehe ich die Begründung nicht ganz. Soweit ich weiß, muss ich die echo-Anweisung vervollständigen, meinen eigenen Code einfügen (z. B. phpinfo()) und dann eine andere Funktion (z. B. echo) schreiben, um die schließende Klammer zu verarbeiten. </p> <p>Ich dachte, Code wie dieser würde funktionieren: </p> <pre class="brush:php;toolbar:false;">");phpinfo();echo("</pre> <p>Dies funktioniert jedoch nicht, da phpinfo als Teil des Strings betrachtet wird und nicht von der eval-Funktion ausgewertet wird. Ich habe auch erfolglos versucht, den Anführungszeichen zu entkommen. </p> <p>Frage:</p> <ul> <li>Wie kann hier Code richtig eingefügt werden? </li> <li>Warum funktioniert<code>$a='1');phpinfo();echo($a</code>?</li> </ul><p><br /></p>
P粉476547076P粉476547076455 Tage vor565

Antworte allen(2)Ich werde antworten

  • P粉561749334

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

    问题在于这个语句是无效的:

    echo ();

    它会导致解析错误。所以你需要注入一些东西来避免这个错误。例如:

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

    Antwort
    0
  • P粉033429162

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

    当你使用那个输入时,替换变量的结果是:

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

    所以这里赋值了 $a='1',并且输出了该赋值的结果(即被赋给 $a 的值)。然后执行了 phpinfo()。最后再次输出了 $a

    如果你尝试使用 );phpinfo();echo(,它不会起作用,因为它试图执行 echo ()。但是 echo 至少需要一个参数。

    所以要在这里注入代码,你必须确保输入以在 echo ( 之后是有效的内容开头,并且以在 ); 之前是有效的内容结尾。将你想要注入的额外代码放在这两部分之间。

    Antwort
    0
  • StornierenAntwort