TomL, mein letzter Post war eigentlich die Antwort auf inne, in dessen Post ich die Frage interpretiert habe, ob die gequotete Aussage von mir auch in dem von thoerb verlinkten Tutorial vorhanden ist – deswegen habe ich es rausgesucht und gepostet.
TomL hat geschrieben: 04.07.2020 23:29:42
Es bleibt also die Frage offen, nach welche Kriterien ich den übergebenen Text überhaupt validieren kann, wenn der einzige Anspruch ist, dass der String etwas ist, was sich aus beliebigen Zeichen zusammensetzt?
Ich denke nicht, dass es ein Szenario gibt, in dem wirklich
beliebige Zeichen auf
diesem Weg übergeben werden müssen. Und selbst, wenn man’s, warum auch immer, trotzdem macht, kann man die potentiell gefährlichen Zeichen entschärfen, bevor man die Variable auf irgendeine potentiell gefährliche Weise weiterverarbeitet (etwa in ’ne Datei oder gar in eine Datenbank schreibt¹).
TomL hat geschrieben: 04.07.2020 23:29:42
Ich denke immer noch, die richtige Frage wäre, ob ein übergebener Inhalt als Anweisung ausgeführt werden kann. […] Solange es sich bei dem Parameter jedoch nur um Buchstabensalat handelt, der als Buchstabensalat behandelt wird, ist das working as intended ... auch dann, wenn der Buchstabensalat den Text (i.ü.S.) "format c:" oder "rm -rf /*" beinhaltet.
Und ich denke immer noch, dass genau das passiert ist. Es scheint zwar nicht mehr so einfach zu sein, wie ganz früher™, als Variablen durch ihren Inhalt ersetzt wurden, und das durch den Interpreter geschoben wurde – da hätte etwas in der Art ›
"; böserCode; ?> ‹ gereicht², aber ich denke weiterhin, dass das zum Angriff verwendete Script hier den Interpreter dazu gebracht hat, die Variable eben nicht nur als Zeichenkette zu handhaben, sondern Teile davon zu verarbeiten, oder in die Datei zu schreiben, und diese dann auszuführen. Möglicherweise hat die verwendete PHP-Version dabei mit einer bekannten Schwachstelle geholfen – deswegen fragte ich nach dieser Version, dann hätte man mal schauen können, ob da was bekannt ist. Vielleicht
hat das zweite Script auch einen Punkt, den du übersehen hast. Auf jeden Fall aber ist in meinem mentalen Syntax-Highlighting die Variable $url, die ungeprüft aus GET übernommen, und ungefiltert in eine Datei geschrieben wird, fett grellrot markiert und mit vielen Ausrufezeichen versehen.
Leider ist meine PHP-Phase lange her, und es fehlt mir wirklich an Zeit und anderen Ressourcen, mich da wieder reinzufinden und die aktuellen Methoden zu recherchieren. Interessant zu wissen, was nun tatsächlich passiert ist, wär’s allemal – deswegen meine Anregung, das Ganze quasi als Honigtopf wieder draufzutun, und dann, nachdem dein Alarm für erstellte Dateien ausgelöst wurde, mal im Log zu schauen, was denn nun eigentlich passiert ist. Möglich ist allerdings auch, dass im März ein Bug in PHP genutzt wurde, der das Ausnutzen deines Handlings von nutzerübergebenen Daten erst ermöglicht hat, und dass dein Anbieter zwischenzeitlich ’n Update gefahren hat. In dem Fall würde da natürlich nichts weiter passieren – umschreiben würde ich das Script aber auf jeden Fall.
¹)
tatsächlich dürfte so eine SQL-Injektion, bei der Zeichenfolgen übergeben werden, die zwar der PHP-Interpreter nicht ausführt, das DBMS dann allerdings schon, auch heute noch einer der häufigsten Angriffsvektoren sein
²)
minimal umständlicher war’s schon noch – aber immer noch nix, was man nicht hätte scripten können