powlfruit
Goto Top

SQL Injection - PHP Anwendung mit MSSQL Datenbank

Guten Tag Liebe Community,
ich habe zurzeit folgendes Problem, und da ich mich mit der Problematik noch nicht sonderlich auseinandergesetzt habe, wollte ich erst einmal die Profis hier fragen.

Die Frage ist eigentlich ganz kurz, ich habe eine PHP-Applikation (vom Hauseigenenden Programmierer geschrieben) die eine MSSQL Datenbank anspricht. Nun ist das Problem, dass ich mir sorgen um SQL Injections.
Ich habe mich schon einwenig im Netz darüber belesen, doch die meisten Tipps sind für MySql und daher nicht für mich nützlich. Des weitern habe ich auch viel von PHP Firewalls gelesen, hilft das wirklich was? Immerhin sollte ja einer Firewall vor dem zu schützenden Objekt sein und nicht auf derselben Ebene.

Was würdet Ihr machen, wie wären Eure Herrenangehensweisen?

Mit Freundlichen Gruß
Powl

Content-ID: 281082

Url: https://administrator.de/contentid/281082

Ausgedruckt am: 26.11.2024 um 05:11 Uhr

kaiand1
kaiand1 25.08.2015 um 11:01:50 Uhr
Goto Top
Nun du kannst im PHP Script einiges schon gegen Injections machen indem du die Aus/Eingaben prüfst.
Zb bei Namen/Passwort Felder wird es sehr unwarscheinlich sein das jemand ; dort verwendet...
Dazu kannst du auch die Eingaben als reinen Text behandeln, Speichern und Abfragen auch wenn dort Injections drin sind.
Aber durch Unsaubere Programierung kann auch die Eingaben als PHP Code weiter verwendet werden wodurch Angriffe relativ Einfach gemacht werden.
Aber dazu müsstes du ersmal den Code anschauen in wie weit dieser Angreifbar ist.
Eine Firewall mit den Regeln bzw Angriffsmustern kann auch einiges Abhalten jedoch wenn neue Fehler gefunden werden die der Firewall nicht bekannt sind kommt der ANgreifer trozdem durch.
Dazu kannst du mit Sessions und Prüfen auf welcher Seite er ist, die Wievielete EIngabe in X Minuten es ist, ruft er innerhalb von x Minuten die selbe Seit5e zum xten Mal auf ect.. erkennen ob es ein Angriff sein kann und per Script auch gleich SPerren sowie eine Infomail schicken lassen.
Aber auch ein Fehlerhafter Eingestellter Webserver stellt eine Gefahr dar...
Zudem kannst du ja auch Testweise selbst mal versuchen eure Scripte Anzugreifen und schauen was passiert.
Da du ja scheinbar Zugang zum Code hast kannst du so die Schwachstellen besser Finden und Patchen ;)
Dirmhirn
Dirmhirn 25.08.2015 um 12:16:55 Uhr
Goto Top
Hi Powl,

Prepared Statements sind zb eine Möglichkeit die Gefahr zu verringern. Grob gesagt erlaubt die Abfrage damit keine neuen Kommandos und sieht alle übergebenen Eingaben als Text.,

dazu kannst du zb den PHP Code für's erste einmal nach "prepare" durchsuchen. Wenn er Prepared Querries verwendet hat, dann besteht zumindest die Chance, dass er sich der Gefahr bewusst war. Sonst sind Eingabeprüfung, sauberes Programmieren und sinnvolle Einschränkung der Rechte (muss der web-DB-nutzer eine Tabelle löschen können?) wohl die wichtigsten Punkte.

hier eine gute Liste:
http://www.enterprisenetworkingplanet.com/netsecur/article.php/3866756/ ...

mit dem Programmierer kannst du nicht (mehr) sprechen?

sg Dirm
Dirmhirn
Dirmhirn 25.08.2015 um 12:23:05 Uhr
Goto Top
Zitat von @PowlFruit:

Des weitern habe ich auch viel von PHP Firewalls gelesen, hilft das wirklich was? Immerhin sollte ja einer
Firewall vor dem zu schützenden Objekt sein und nicht auf derselben Ebene.

Sieh es als Zusatzfeature. Wenn du einfach wild herum programmierst und hoffst, dass es die Firewall dann schon richtet... wirds wohl schief gehen. Aber also Absicherung gegen kleine Fehler, wieso nicht. Außerdem kannst du damit auch andere "Probleme" abseits von SQL Injections angehen.

meisten Tipps sind für MySql
PHP + MySQL ist halt (der?) Klassiker. PHP + MSSQL ist vermutlich weniger verbreitet. Alleine wegen den Lizenzkosten.

sg Dirm
SaschaRD
SaschaRD 25.08.2015 aktualisiert um 16:42:01 Uhr
Goto Top
Hallo Powl,

die einfachsten Wege um SQL-Injections hervorzurufen sind Text-, Eingabe- und Suchfelder. Dies sollten dann gezielt gesichert werden.
Zum Beispiel bei einem Login Dialog eine maximale Zeichenbegrenzung einführen. Des Weiteren immer das Semikolon verbieten über HTMLEntities, somit können keine SQL-Statements mehr abgeschlossen werden. Dies kann auch mit gewissen Schlüsselwörter durchgeführt werden, wie z.B. Insert etc.

Gruß, Sascha
PowlFruit
PowlFruit 31.08.2015 aktualisiert um 14:23:08 Uhr
Goto Top
Vielen Dank erstmal für euren Lösungsvorschlage, ich hab nun vielleicht eine Lösung. Meint ihr dies würde so Funktionieren?

<?php
$suchen   =array('!', '"', '§', '$', '%','{','[',']','}','´','`','*','+','~','#','_','-','.',':',',',';','?','--','/','>','^','°','<','|', '\',"select","from","or",'drop','Value','ID','0x','LOAD','dbo','1','2','3','4','5','6','7','8','0','Ä','Ü','Ö','ß');  
$text     = str_replace( $suchen, "", strtolower( $text ) );  


echo $text;
?>
kaiand1
kaiand1 31.08.2015 um 16:51:24 Uhr
Goto Top
Ist nur blöd wenn du Zeichen dafür in einer Eingabe brauchst ;)
aber wie währe es zb mit
htmlspecialchars
mysql_real_escape_string
PowlFruit
PowlFruit 01.09.2015 um 11:54:14 Uhr
Goto Top
Ich habe doch MSSQL da fällt doch "mysql_real_escape_string" schoneinmal raus. Diese Zeichen werden nicht für die eingabe gebraucht..
Oli-nux
Oli-nux 28.07.2016 um 13:37:07 Uhr
Goto Top
Hast du irgendwas erreicht oder hast du nichts unternommen?

Zuerst einmal solltest du dafür sorgen, dass der MSSQL-Server keine Fehlermeldungen und Informationen über selbigen ausgibt.
Das man diese ggf. dennoch bekommen kann ist ein anderes Thema.

Ich beschäftige mich auch gerade mit dem Thema, benötige es aber eher für MySQL (überspinge also das Thema MSSQL im Buch).
Leider bin ich selbst kein PHP-Programmierer, kleinere Dinge ok, aber das sind eher Grundlagen.

Und ja, PHP + MySQL ist der Klassiker, eben weil es viele Linux-Server gibt. *das nur erwähnen wollte*

Zum Thema empfehle ich dir ein aktuelles (2016) Buch, welches ich mir auch gekauft habe:
http://www.franzis.de/fachbuecher/internet-netzwerk/sql-hacking
Allerdings solltest du Grundlagen in Datenbanksprachen mitbringen, sonst sind das bömische Dörfer für dich.

Wenn ich mich recht entsinne, dann kannst du zwar, wie du es vorhast, Zeichen ersetzen, es ist aber dennoch möglich diese zu nutzen, da man sie anders schreiben kann.
Von irgendwelchen Tools die automatisch auf SQL-Injection testen wird im Buch abgeraten, da es keines gibt das alles finden kann. Einige nutzen auch nur GET. Es gibt bei den Tools auch Fehlalarme, so dass keine SQL-Injection möglich ist und da wo es möglich wäre, diese werden überhaupt nicht gefunden.

Heikles Thema...