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>