Dieser Beitrag wurde von Christoph am 19. Februar 2010 verfasst.
19. Februar
Das Standard-TinyMCE-Modul aus REDAXO enthält einen Fehler, über den es möglich ist, (fast) beliebigen Code auszuführen. Der Inhalt des Editors wird über die HEREDOC-Syntax abgerufen. In dieser findet jedoch die Interpolation von bestimmten Elementen (bekanntestes Beispiel sind einfache Variablen) statt. Über die {${foo()}}-Syntax ist es nun möglich, Code auszuführen.
Folgende Eingaben sollte man im Backend lieber nicht tätigen:
$REX{${print("hallo")}}{${print_r($REX)}}{${mysql_query("UPDATE rex_user SET name = 'Pwned!' WHERE 1")}}hallo
EOD;
noch mehr text.Die ersten vier Eingaben sind noch relativ harmlos. Die letzte wird hingegen zu einem Parse Error führen (Achtung: Der Artikel kann dann auch nicht mehr ohne Weiteres im Backend bearbeitet werden!) und vermutlich nur bei deaktiviertem JavaScript funktionieren, da der TinyMCE sonst keine Zeilenumbrüche zulässt.
Bei Installationen mit nur einem Benutzer dürfte sich dieses Problem nicht äußern, da man sich eher selten selber hacked. Wenn allerdings in einem REDAXO mehrere Benutzer mit teilweise eingeschränkten Rechten existieren, kann es gut möglich sein, dass Alice und Bob nach ihrer Kündigung erstmal noch die halbe Datenbank löschen, bevor sie ihren Schreibtisch aufräumen. Immerhin können sie problemlos Datenbank-Queries ausführen lassen.
Unser Patch baut auf das TinyMCE-AddOn aus REDAXO 4.2.1 auf und verändert es so, dass zwei neue Variablen eingeführt: REX_SQ_VALUE für Single-Quoted-Strings und REX_DQ_VALUE für Double-Quoted-Strings. Diese neuen Platzhalter können, wenn das AddOn aktiv ist, in allen Modulen genutzt werden. Sie werden wie folgt genutzt:
$foo = 'REX_SQ_VALUE[1]'; $bar = "Mi nomo estas REX_DQ_VALUE[2].";
Durch die gesonderte Angabe des enthaltenen Strings ist es möglich, ein korrektes Escaping durchzuführen.
Der Patch ist unter MIT-Lizenz veröffentlicht und kann hier in Form einer Patchdatei (für die Nerds unter unseren Lesern) oder als gezip’tes AddOn heruntergeladen werden.
Das grundlegende Problem, Texte über HEREDOC-Syntax auszulesen, ist damit natürlich nicht behoben. Wer kann, sollte zur NOWDOC-Syntax aus PHP 5.3 greifen. Alle anderen sollten aufpassen, nicht aus Versehen Eingaben von Besuchern über HEREDOCs auszulesen.
Dieser Beitrag wurde von Christoph am 19. Februar 2010 verfasst.
1 Gregor am 20. Februar 2010um 15:13 Uhr
Krasse Sache! Das ist aber auch eine dreckige Syntax in PHP. Könnte man von mir aus gleich ganz abschalten, genauso wie diese “alternative” und vor allem undebugbare Syntax für Kontrollstrukturen..
2 Christoph am 20. Februar 2010um 19:06 Uhr
Ich habe eben noch einen Bug in unserem Patch gefunden: Wenn in der Eingabe des Benutzers die Platzhalter enthalten sind, werden sie mehrfach ersetzt.
Ich werde vermutlich morgen einen neuen Patch veröffentlichen, der das Problem behebt. Er ist schon fertig, ich hab nur gerade keine Zeit, ihn online zu stellen.
3 Christoph am 21. Februar 2010um 04:40 Uhr
So, der obige Beitrag ist aktualisiert.