sqlinjection

Gesperrt
trixta
Beiträge: 165
Registriert: Di 26. Apr 2005, 12:53
Kontaktdaten:

sqlinjection

Beitrag von trixta »

hi,

habe auf 2 seiten im errorlog sql-syntax-fehler drinn, die auf ne sqlinjection hindeuten. beide stammen wohl von einem unsicheren suchmodul.

habe nun das suchwort mit mysql_real_escape_string behandelt, was hoffentlich reichen dürfte?

daneben habe ich noch am anfang der front_content (direkt nach den einzelnen includes) noch emergence code aus http://contenido.org/forum/viewtopic.ph ... tion#81712 eingefügt.

da ich noch steses modrewrite einsetze - allerdings für die 4.4.5 - habe ich seinen code ebenfalls am anfang der front_content geändert:

Code: Alles auswählen

if (isset ($catnames) && !empty ($catnames) && count($catnames) > 0 && !isset ($idcat)) {
	foreach ($catnames as $in => $catval) {     
      if (!is_numeric($catval)) {
       	$catnames[$in] = mysql_real_escape_string($catval);
   		}
    }
	$idcat = mr_get_idcat($catnames);
}

if (isset ($artname) && !empty ($artname) && !isset ($idart)) {
	if (!is_numeric($artname)) {
    	$artname = mysql_real_escape_string($artname);
   	}
	$idart = mr_get_idart($artname, $idcat);
}

if (isset ($langname) && !empty ($langname) && !isset ($lang)) {
	if (!is_numeric($langname)) {
    	$langname = mysql_real_escape_string($langname);
   	}
	$lang = mr_get_language_id($langname);
}
// end edit stese
dies sorgt allerdings auf einigen servern (1und1, nicht jedoch z.b. domainfactory) für warnmeldungen:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

nehme an, dass dies daran liegt, dass zuvor noch keine mysql verbindung aufgebaut wurde (allerdings wäre ja gerade die erste verbindung sicherheitskritisch) und bei domainfactory diese warnmeldung einfach unterdrückt wird. ein voranstellen von $db = new DB_Contenido; bringt leider auch nichts.

meine frage(n) hierzu:
wie kann ich das ohne fehlermeldung sicher machen? wird bei servern, wo keine warnung erscheint, mysql_real_escape_string durchgeführt oder ist einfach die warnung unterdrückt?

ausserdem nutze ich noch nen newslettermodul - glaube das von herrb - hier wird email und name mit urlencode und strtolower bearbeitet (dies dürfte eine sqlinjection ebenfalls unmöglich machen, oder???)

schlussendlich, was haltet ihr davon unter tipps & tricks eventuell einen beitrag mit ner liste mit maßnahmen zu schreiben, welche helfen soll erstmal contenido abzusichern sowie eventuell einen weiteren beitrag, mit hinweisen zum halbwegs sicheren schreiben von modulen?
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Re: sqlinjection

Beitrag von Halchteranerin »

trixta hat geschrieben:schlussendlich, was haltet ihr davon unter tipps & tricks eventuell einen beitrag mit ner liste mit maßnahmen zu schreiben, welche helfen soll erstmal contenido abzusichern sowie eventuell einen weiteren beitrag, mit hinweisen zum halbwegs sicheren schreiben von modulen?
Es spricht nichts dagegen, nur zu! :wink:
Bitte keine unaufgeforderten Privatnachrichten mit Hilfegesuchen schicken. WENN ich helfen kann, dann mache ich das im Forum, da ich auch alle Postings lese. PN werden nicht beantwortet!
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Halt schreiben, wir verlegen es nach Tips & Tricks.

Zu den Fehlermeldungen: mysql_real_escape_string benötigt eine mySQL-Link-ID. Die dürfte er aber vermutlich nicht finden.

Wenn ein $db verfügbar wäre, könntest Du

Code: Alles auswählen

$catnames[$in] = mysql_real_escape_string($catval, $db->Link_ID);
versuchen. Allerdings wird es das $db nicht geben, da die eigentliche DB-Verbindung von der jeweiligen mr_-Funktion/Methode ausgeführt wird. Eigentlich müsste das mysql_real_escape usw. in die mr_-Funktion eingebaut werden.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Dinkel
Beiträge: 565
Registriert: Di 22. Mär 2005, 14:52
Kontaktdaten:

Beitrag von Dinkel »

Ich finde es echt super, wenn jemand eine Sicherheitslücke macht, aber bitte nicht den gleichen Fehler machen wie die Joomla!-Entwickler, die jede Lücke genau auf der Website beschreiben und "alte" Systeme leichter kompromittiert werden können. Kann man nicht einen Bereich erstellen, in den jeder etwas schreiben kann (also nur Sicherheitslücken o.ä.), der aber nur von den Mods gelesen werden darf? Publik gemachte Sicherheitslücken sind eine Einladung für Hacker und Cracker ;)

Sagt bitte mal Eure Meinung dazu oder reißt mich jetzt einfach in Fetzen ;)
selbstentwickelte Module:
Downloads und Infos zu den Modulen: gibt es hier.
Modul: Forum | Version 0.9 | getestet: 4.6.24 MR, 4.8.11, 4.8.11 AMR
Modul: Galleriffic | Version: 0.3.4 BETA | getestet: 4.8.11, 4.8.11 AMR, 4.8.12, 4.8.12 AMR
Modul: Metadata | Version: 2.0 | getestet: 4.9.7, 4.9.7 AMR
Modul: Slider Gallery | Version: 1.0 | getestet: 4.9.12 AMR
Modul: Up- & Download | Version: 4.1 | getestet: 4.9.12 AMR
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

HerrB hat geschrieben:Zu den Fehlermeldungen: mysql_real_escape_string benötigt eine mySQL-Link-ID. Die dürfte er aber vermutlich nicht finden.
die link-id ist optional. ich lasse die in der regel weg. das dürfte eigentlich nicht zu einem fehler führen.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

Dinkel hat geschrieben:Ich finde es echt super, wenn jemand eine Sicherheitslücke macht, aber bitte nicht den gleichen Fehler machen wie die Joomla!-Entwickler, die jede Lücke genau auf der Website beschreiben und "alte" Systeme leichter kompromittiert werden können. Kann man nicht einen Bereich erstellen, in den jeder etwas schreiben kann (also nur Sicherheitslücken o.ä.), der aber nur von den Mods gelesen werden darf? Publik gemachte Sicherheitslücken sind eine Einladung für Hacker und Cracker ;)
da kann man nun geteilter meinung sein. die anwender sind in einem begrenzten rahmen auch immer entwickler. mindestens gilt das für die eigene site. ohne zu wissen, wo probleme liegen, sind die anwender ausserstande, das problem anzugehen. will heissen, eine publikation ist günstig. klar ist es auch ein problem, wenn alle welt weiss, wie man contenido hacken kann. aber dagegen hilft kein verstecken, sodern nur das lösen des problems.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
trixta
Beiträge: 165
Registriert: Di 26. Apr 2005, 12:53
Kontaktdaten:

Beitrag von trixta »

@dinkel
dem stimme ich - ähnlich wie kummer - nicht zu. ich will von sicherheitslücken erfahren und wissen wie ich sie schließen kann und nicht allein darauf vertrauen, dass die sicherheitslücke halbwegs unbekannt ist.

i.ü. es gibt genug webseiten da draussen die bis heute die sicherheitsupdates für die versionen unter 4.64 nicht eingepflegt haben.

hier kam übrigens zuerst der exploit und danach erst das bugfix (eine heimlichtuerei wäre also eher kontraproduktiv gewesen).
die schwachstelle(n) wurde benannt, der genaue hackingweg wurde dagegen, sofern er hier mal gepostet wurde, von den admins gelöscht. = guter mittelweg
trixta
Beiträge: 165
Registriert: Di 26. Apr 2005, 12:53
Kontaktdaten:

Beitrag von trixta »

@kummer

heisst das, dass ich bei dem oben geposteten code davon ausgehen kann, dass bei webseiten, bei denen die warnung nicht angezeigt wird mysql_real_escape_string korrekt ausgeführt wird (wie kann ich das im zweifelsfall überpürfen) und nur bei 1und1 aufgrund seltsamer servereinstellungen zuvor eine connection hergestellt bzw. der 2. para angegeben werden muss?
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

die link-id ist optional. ich lasse die in der regel weg. das dürfte eigentlich nicht zu einem fehler führen.
Jein.
www.php.net hat geschrieben:If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.
Und wir haben hier:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
Ich gebe ja zu, dass ich es ja irgendeine DB-Verbindung schon gegeben haben dürfte - warum es die Meldung gibt, weiß ich daher auch nicht (und kenne mich nicht aus... :wink: ).

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

ich gebe mich geschlagen... :oops: allerdings bleibt das problem dasselbe. man kann die link-id ohne probleme weglassen. wenn eine verbindung bestehen würde, dann würde keine warnung ausgegeben. wenn aber keine verbindung besteht, kann ich auch unmöglich eine id mitgeben.

ich denke, das ist nur von bedeutung, wenn man gleichzeitig mit mehr als einer db arbeiten würde. das ist ja bei contenido - mindestens im regelfall - nicht der fall.

es ist im übrigen durchaus nicht so, dass mysql_real_escape_string es grundsätzlich vollkommen unmöglich machen würde, eine injection vorzunehmen. es wird zwar nirgends darauf hingewiesen, wie man das trotzdem anstellen könnte; aber man muss davon ausgehen, dass findige köpfe einen weg finden werden. aber bestimmt ist es wesentlich schwieriger.

@trixta: eine verbindung mit mysql muss in jedem fall bestehen. das ist keine sonderbare regel deines providers. der aufruf von mysql_real_escape_string erfordert eine bestehende datenbankverbindung. aber ohne die, wäre die anwendung der funktion auch völlig nutzlos, nicht?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
Gesperrt