Name="Perl-Sicherheitslücken decken"
Stich="Perl Sicherheitslücke Angreifer ausfiltern erlaubt system() exec()"
Zeit="Fre Jun 22 15:20:00 MEST 2001"
Kurz="Perl kann fast alles. Gerade deshalb hat es auch einige
Sicherheitslücken, von denen dieser Artikel zwei decken will."
Lang="
- Der$esCodes system()$esCodee- bzw.$esCodes exec()$esCodee-Aufruf.
Angenommen, das
Perl-Skript fragt den Benutzer nach einem Namen, welcher dann
(umständlich) mittels von$esCodes system("echo \$Name")
ausgegeben werden soll. Wenn der Benutzer als$esCodes \$Name$esCodee$esCodes
| rm -rf /$esCodee eingibt, werden (Superuser-Rechte vorrausgesetzt) alle
Dateien abfragslos gelöscht. Besser:
`exCodes system\(\)`
system("/bin/echo", \$Name);
`exCodee`
Nun werden etwaige Metazeichen nicht mehr ersetzt.
- Um den bekannten ../-Trick (
bsp. http://www.sourceforge.net/../../../../etc/passwd - die Anzahl der
dotdotslashes hängt vom Server ab) abzuwehren, ist es unratsam, nur die
Slashes bzw. Punkte auszufiltern. Es bleit dann nähmlich noch die
Möglichkeit,$esCodes %2E$esCodee als Punkt zu benutzen. Oder man
könnte die Shell-Metazeichen ausnutzen (${esCodes}| rm -rf /*$esCodee).
Besser ist es, nur die erlaubten Zeichen durchzulassen, alle anderen
auszufiltern:
`exCodes ../`
{ print "Nice try"; exit; } unless (\$eingabe =~
/[a-zA-Z0-9,.äüöÄÖÜ]/);
`exCodee`
"
case $1 in
Name) echo $Name; exit;;
Stich) echo $Stich; exit;;
Zeit) echo $Zeit; exit;;
Kurz) echo $Kurz; exit;;
Lang) echo $Lang; exit;;
esac
# if [ "$1" = "Name" ]; then echo $Name; fi
mself_vA="txt/0031.txt txt/0039.txt txt/0023.txt txt/0049.txt txt/0051.txt
txt/0053.txt txt/0089.txt"