Thread Resultat einer DB-Abfrage mit allen Variablen im Skript matchen/replacen (9 answers)
Opened by tx556 at 2014-08-20 18:07

clms
 2014-08-21 00:29
#176932 #176932
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
Man sollte da schon eine vertrauenswürdige Datenbank haben, aus der man $text holt.

Andererseits: Welche Manipulationsmöglichkeiten bestehen?
Solange $text von eval als Inhalt des Strings interpretiert wird und nur Variablen ersetzt werden, sollte es sicher sein (oder übersehe ich da etwas?)

Bleibt das Problem, das ein Angreiffer, der $text kontrollieren kann, den String zwischenzeitig abbricht und der nachfolgene Text dann als normaler Perl-Code ausgeführt wird - so wie Du es in Deinem Beispiel vormachst.
Dazu muss ein normales " als Stringende in $text vorkommen.
Das kann man verhindern, indem man die " ausreichend escaped.

Ein einfaches $text =~ s/\"/\\\"/g reicht leider nicht, weil der Angreifer ja auch $text = '\";do_evil();\"' setzen könnte. Dann würde man mit dem obigen Replacement, das Unheil erst auslösen weil die vorher escapten " plötzlich wieder unescaped sind. Man muss also sicherstellen, dass man zum Escapen eine ungerade Anzahl von Backslashes vor dem " hat. Komplizierter wird es noch dadurch, dass man auch die Variablen $\ und $$ berücksichtigen muss, die man verwenden könnte um ein Backslash zu "konsumieren".
Ich komme dann auf folgende Zeile zum Escapen der Quotes:
$text =~ s/(^|[^\\\$])((\\\\|\$\\|\$\$)*)\"/$1$2\\\"/g;


Das sollte funktionieren.

Allerdings ist in Perl 5.18.2 anscheinend ein Bug bei "$\\""

View full thread Resultat einer DB-Abfrage mit allen Variablen im Skript matchen/replacen