Thread Resultat einer DB-Abfrage mit allen Variablen im Skript matchen/replacen
(9 answers)
Opened by tx556 at 2014-08-20 18:07
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 "$\\"" |