Sicherheit: Parameterübergabe an Kommandozeilen Tool
Verfasst: Mittwoch 11. Januar 2006, 08:03
(Thema geteilt von http://www.python-forum.de/viewtopic.php?t=4368 )
Ich hab gerade den Artikel im "Linux Magazin" 01/06 Seite 68 gelesen... Dort wird darauf hingewiesen, das Programmaufrufe ('Standard C function system()' in unserem Fall also os.system) gefählich sein können, wenn ein Teil des Befehls vom Anwender eingegeben wurde...
z.B. Haben wir ein Skript, welches irgendwas mit einer lokalen Datei machen soll... Der Dateiname muß der Anwender vorher eingeben. Unter Linux tippt der Anwender also fröhlich "foobar; rm -rf /home" ein... Das wird nun in irgendein Befehl eingefügt und per os.system() ausgeführt...
Aber auch unter Windows dürfte eine Eingabe wie "foobar; rmdir /s /q %HOMEPATH%" ein wenig Schaden anrichten...
Es ist natürlich kein unmittelbares Problem mit Python... Aber wie kann man damit umgehen???
Ich hab z.B. in MySQLdump in PyLucid so eine Schwachstelle. Ich biete ein HTML-Formular an: http://pylucid.python-hosting.com/file/ ... format=raw (sieht man hier ohne Styles!) und baue die Eingaben so zusammen:
Nun kann man also auch damit schön unschöne Dinge machen (Allerdings kann das nur ein eingeloggter Admin tun, der wohl nicht seinen eigenen Server schrotten will)
In meinem Fall könnte ich natürlich hingehen und alle Parameter die mysqldump hat auflisten und nachsehen, ob die Eingaben auch wirklich ein gültiger Parameter ist... Aber das ist ziemlich eingeschränkt für den User, zumal es auch einige verschiedene Versionen von mysqldump gibt, mit unterschiedlichen parameter...
(btw. ich möchte das noch gern auf die Wiki Seite packen, möchte aber erstmal euer Feedback haben, damit ich keinen Mist verzapfe )
Ich hab gerade den Artikel im "Linux Magazin" 01/06 Seite 68 gelesen... Dort wird darauf hingewiesen, das Programmaufrufe ('Standard C function system()' in unserem Fall also os.system) gefählich sein können, wenn ein Teil des Befehls vom Anwender eingegeben wurde...
z.B. Haben wir ein Skript, welches irgendwas mit einer lokalen Datei machen soll... Der Dateiname muß der Anwender vorher eingeben. Unter Linux tippt der Anwender also fröhlich "foobar; rm -rf /home" ein... Das wird nun in irgendein Befehl eingefügt und per os.system() ausgeführt...
Aber auch unter Windows dürfte eine Eingabe wie "foobar; rmdir /s /q %HOMEPATH%" ein wenig Schaden anrichten...
Es ist natürlich kein unmittelbares Problem mit Python... Aber wie kann man damit umgehen???
Ich hab z.B. in MySQLdump in PyLucid so eine Schwachstelle. Ich biete ein HTML-Formular an: http://pylucid.python-hosting.com/file/ ... format=raw (sieht man hier ohne Styles!) und baue die Eingaben so zusammen:
Code: Alles auswählen
try:
compatible = self.CGIdata["compatible"]
except KeyError:
compatible = ""
else:
compatible = " --compatible=%s" % compatible
default_command = "mysqldump --default-character-set=%(cs)s%(cp)s %(op)s -u%(u)s -p%(p)s -h%(h)s %(n)s" % {
"cs" : self.CGIdata["character-set"],
"cp" : compatible,
"op" : self.CGIdata["options"],
"u" : self.config.dbconf["dbUserName"],
"p" : self.config.dbconf["dbPassword"],
"h" : self.config.dbconf["dbHost"],
"n" : self.config.dbconf["dbDatabaseName"],
}
In meinem Fall könnte ich natürlich hingehen und alle Parameter die mysqldump hat auflisten und nachsehen, ob die Eingaben auch wirklich ein gültiger Parameter ist... Aber das ist ziemlich eingeschränkt für den User, zumal es auch einige verschiedene Versionen von mysqldump gibt, mit unterschiedlichen parameter...
(btw. ich möchte das noch gern auf die Wiki Seite packen, möchte aber erstmal euer Feedback haben, damit ich keinen Mist verzapfe )