Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Webmaster-Security Fragen zur richtigen Serverkonfiguration oder Absicherung dynamischer Scripte gehören hier hinein.

SQL Injections

Diskussion: SQL Injections im Forum Webmaster-Security, in der Kategorie Security Area; Anzeige Hi, heute bin ich wieder über etwas gestolpert, was ich nicht nachvollziehen kann: ?id=-54+union+select+concat_ws(0x3a,version(),database( ),user()),2,3,4 Mir ist klar, daß ...

Antwort
Alt 25.06.10, 00:58   #1 (permalink)
 
Registriert seit: 23.05.10
Flashkobb Leistung: Facit NTK
Likes: 0
Standard SQL Injections

Anzeige

Hi,

heute bin ich wieder über etwas gestolpert, was ich nicht nachvollziehen kann:

?id=-54+union+select+concat_ws(0x3a,version(),database( ),user()),2,3,4

Mir ist klar, daß diese Injection die MySQL Version den Datenbanknamen und den User ausgibt... aber warum?

Ich habe dieses Ding auf russischen Seiten gefunden, die eine Vielzahl an Internet Seiten gehackt haben und die Ergebnisse dort veröffentlichen...

Ich möchte diese Links nicht posten, da dort Passwörter etc aufgelistet worden sind und die Sicherheitslücken nach wie vor auf den meisten Seiten bestehen. Die Webmaster haben diese Lücken scheinbar noch nicht entdeckt.

Flashkobb ist offline   Mit Zitat antworten
Alt 25.06.10, 01:06   #2 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 443
Standard

Das sind die Daten, die man zum Raussuchen eines versionsspezifischen Exploits und zum durchführen eines möglichst klein gehaltenen Bruteforce mindestens braucht.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist gerade online   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 04.11.10, 00:40   #3 (permalink)
 
Benutzerbild von happytreefriend
 
Registriert seit: 13.12.09
happytreefriend Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Zitat von Flashkobb Beitrag anzeigen
Hi,

heute bin ich wieder über etwas gestolpert, was ich nicht nachvollziehen kann:

?id=-54+union+select+concat_ws(0x3a,version(),database( ),user()),2,3,4

Mir ist klar, daß diese Injection die MySQL Version den Datenbanknamen und den User ausgibt... aber warum?

Ich habe dieses Ding auf russischen Seiten gefunden, die eine Vielzahl an Internet Seiten gehackt haben und die Ergebnisse dort veröffentlichen...

Ich möchte diese Links nicht posten, da dort Passwörter etc aufgelistet worden sind und die Sicherheitslücken nach wie vor auf den meisten Seiten bestehen. Die Webmaster haben diese Lücken scheinbar noch nicht entdeckt.

Was genau möchtest du jetzt wissen? Wieso SQLi funktionieren?

?id=-54+union+select+concat_ws(0x3a,version(),database( ),user()),2,3,4

Ich spalte mal die Abfrage auf

So würe sie normal ausschauen:?id=-54

Mit dem Befehl UNION kann man bei SQL abfragen verbinden+union+

danach kommt halt die Abfrage wenn dafür noch Felder für die Ausgabe Vorhanden sind.

select+concat_ws(0x3a,version(),database(),user()) ,2,3,4

Und so würde es im Quellcode ausschaue

Nur als Beispiel
$sql = "SELECT * FROM tabelle where id = '$_GET['id']'"

Und somit schließt er mit union noch eine Abfrage hinten an
happytreefriend ist offline   Mit Zitat antworten
Alt 15.11.10, 16:14   #4 (permalink)
 
Benutzerbild von Vyger
 
Registriert seit: 04.12.03
Vyger Leistung: Z3
Likes: 11
Standard

Mich würden mögliche Gegenmaßnahmen interessieren, vielleicht direkt am obigen Beispiel.
Vyger ist offline   Mit Zitat antworten
Alt 15.11.10, 17:32   #5 (permalink)
 
Registriert seit: 12.08.10
mime Leistung: Pentium Imime Leistung: Pentium I
Likes: 30
Standard

Zitat:
Zitat von Vyger Beitrag anzeigen
Mich würden mögliche Gegenmaßnahmen interessieren, vielleicht direkt am obigen Beispiel.
Na ja...der Entwickler muss den Inhalt der per GET-Request übergebenen Variable "id" mit den Mitteln der von ihm benutzen Sprache "aufräumen".

In php z.B.

PHP-Code:
$id intval$_GET['id'] );

if( 
$id ) { 
  
$sql "SELECT bar,foo FROM tabelle where id = " $id;
} else {
  
// ERROR_HANDLING...

Micha
__________________
http://www.openvas.org
mime ist offline   Mit Zitat antworten
Alt 15.11.10, 17:51   #6 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

Zitat:
Zitat von Vyger Beitrag anzeigen
Mich würden mögliche Gegenmaßnahmen interessieren, vielleicht direkt am obigen Beispiel.
ganz allgemein gesagt:
Never trust an user-input!!!
  • Werte, wo Zahlen erwartet werden, explizit als int oder float (was eben erwartet wird) casten
  • Wahrheitswerte (boolean) ebenfalls explizit casten
  • Zeichenketten escapen (z.B. mit mysql_real_escape_string())
beavisbee ist gerade online   Mit Zitat antworten
Alt 15.11.10, 19:36   #7 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

Zitat:
Zitat von beavisbee Beitrag anzeigen
  • Werte, wo Zahlen erwartet werden, explizit als int oder float (was eben erwartet wird) casten
  • Wahrheitswerte (boolean) ebenfalls explizit casten
IMHO sollte nicht versucht werden irgendwelchen ungültigen Userinput nachträglich zu validieren. Wenn da ungültige Daten reinkommen, dann sind diese zu verwerfen.
Das heißt, wird eine Zahl erwartet, und man bekomme einen String, dann sollte man nicht versuchen diesen in eine Zahl zu casten.
In PHP gibts dafür z.B. is_numeric() und Strings kann man mit Regulären Ausdrücken über z.B. preg_match() prüfen. Ein mysql_real_escape_string() sollte natürlich trotzdem nicht fehlen
Thunderb0lt ist offline   Mit Zitat antworten
Alt 15.11.10, 23:09   #8 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

Zitat:
Zitat von Thunderb0lt Beitrag anzeigen
In PHP gibts dafür z.B. is_numeric() und Strings kann man mit Regulären Ausdrücken über z.B. preg_match() prüfen.
Das ist IMO zum Teil Geschmackssache und hängt zum anderen Teil vom Einsatzgebiet ab.
Wenn es eine ehr unwichtige numerische Eingabe ist, bei der ein "0" im Zweifelsfall keinen Schaden anrichtet, dann brauche ich ja nicht unbedingt zusätzliche Rechenleistung für Fehler-Routinen beanspruchen.
Beispiel: Wenn eine Bildergallerie bei manipuliertem Start-Bild-Wert eben als Wert 'ne 0 annimmt und somit die erste Seite der Gallerie anzeigt, dann ist das ja nicht weiter tragisch.

Wenn die Zahl natürlich 'nen wichtigen Einfluss hat und nicht vernachlässigt werden darf (meinetwegen 'ne Postleitzahl bei der Adress-Eingabe), dann hast du Recht - da sollte man abfragen und gegebenen Falls 'ne Fehlermeldung bringen.
beavisbee ist gerade online   Mit Zitat antworten
Alt 16.11.10, 00:44   #9 (permalink)
 
Registriert seit: 05.10.05
Inliferty Leistung: 8086
Inliferty eine Nachricht über ICQ schicken
Likes: 5
Standard

Weil ich das Schlagwort nochnicht gehört habe werfe ich einfach mal prepared Statements in den Raum

http://de.wikipedia.org/wiki/Prepared_Statement
Dabei werden die Daten als _DATEN_ interpretiert und haben nichts mit dem SQL-Statement zu tun.

Für PHP gibts dazu eine schöne Klasse(PDO):
http://php.net/manual/de/pdo.prepared-statements.php

MfG
Inliferty
Inliferty ist offline   Mit Zitat antworten
Alt 16.11.10, 11:42   #10 (permalink)
 
Registriert seit: 12.08.10
mime Leistung: Pentium Imime Leistung: Pentium I
Likes: 30
Standard

Zitat:
Zitat von Thunderb0lt Beitrag anzeigen
Das heißt, wird eine Zahl erwartet, und man bekomme einen String, dann sollte man nicht versuchen diesen in eine Zahl zu casten.
PHP-Code:
<?php
print gettype($_GET['id']) . "\n";
?>
Code:
mime@kira:~ %  GET http://localhost/x.php?id=1
string
Eine GET-Variable ist immer vom Typ String.

Micha
__________________
http://www.openvas.org
mime ist offline   Mit Zitat antworten
Alt 16.11.10, 12:00   #11 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

Zitat:
Zitat von mime Beitrag anzeigen
Eine GET-Variable ist immer vom Typ String.
wenn der String jedoch nur aus Zahlen besteht, gibt is_numeric() trotzdem true zurück und somit das von Thunderb0lt gewünschte Ergebnis.

PHP-Code:
<?php
function getinfo($num)
{
    echo 
'Typ         : ' gettype($num) . chr(10);
    echo 
'numeric     : ' . (is_numeric($num)?'ja':'nein') . chr(10);
    echo 
'cast to int : ' . (int)$num chr(10) . chr(10);
}
getinfo('123');
getinfo(123);
getinfo('12a3b');
getinfo(null);

?>
Code:
martin@lenotux:~$ php test.php 
Typ         : string
numeric     : ja
cast to int : 123

Typ         : integer
numeric     : ja
cast to int : 123

Typ         : string
numeric     : nein
cast to int : 12

Typ         : NULL
numeric     : nein
cast to int : 0

martin@lenotux:~$
ich persönlich handhabe das meist so:
Wenn ich irgendwelche Model-Klassen programmiere, wird dort (mit wenigen Ausnahmen) hart gecastet - eine Klasse soll schließlich Funktionalität darstellen und nicht Dummheit oder Böswilligkeit des Users anmeckern.
Wenn eine Fehler-Behandlung stattfinden soll, dann werden die Daten, bevor sie an das Model gegeben werden, im Controller validiert und dort wird dann für die Ausgabe einer Fehlermeldung oder dergleichen gesorgt.
beavisbee ist gerade online   Mit Zitat antworten
Alt 16.11.10, 13:25   #12 (permalink)
 
Registriert seit: 12.08.10
mime Leistung: Pentium Imime Leistung: Pentium I
Likes: 30
Standard

Zitat:
und somit das von Thunderb0lt gewünschte Ergebnis.
Ja, ich habe nichts anderes behauptet...

Ich persönlich bin kein Freund von is_numeric. Das akzeptiert mir zu viel. Ich will z.B. keine Hex Values in meinen Querys. Und sowas auch nicht.

PHP-Code:
<?php

include("db.inc");

if(
is_numeric($_GET['id'])) {
  
db_query("SELECT id FROM results WHERE id = " $_GET['id']);
}  
?>
Code:
mime@kira:~ %  GET http://localhost/x.php?id=123e4567
1367 - Illegal double '123e4567' value found during parsing -- SELECT id FROM results WHERE id = 123e4567
Das ist doch Mist...

Micha
__________________
http://www.openvas.org
mime ist offline   Mit Zitat antworten
Alt 16.11.10, 13:43   #13 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

Zitat:
Zitat von mime Beitrag anzeigen
Das ist doch Mist...
FullACK! Deshalb wird bei mir auch alles gecastet
beavisbee ist gerade online   Mit Zitat antworten
Alt 16.11.10, 18:38   #14 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

Zitat:
Zitat von mime Beitrag anzeigen
Ich persönlich bin kein Freund von is_numeric. Das akzeptiert mir zu viel. Ich will z.B. keine Hex Values in meinen Querys.
Ein interessanter Punkt, den ich zugegebenermaßen bisher gar nicht auf meiner Liste hatte. Danke für den Hinweis!
Thunderb0lt ist offline   Mit Zitat antworten
Alt 11.10.11, 15:38   #15 (permalink)
 
Benutzerbild von Hackse
 
Registriert seit: 31.07.06
Hackse Leistung: 8086
Likes: 32
Standard

Bei Usereingaben überprüfe ich min. und max. Länge, sowie Definitionsbereich (zulässige Zeichen) und Zeichenmuster via regular Expression. Hierzu schrieb ich folgende Funktion:
PHP-Code:
/*
function check_user_input(): validation of user input by length check and regex-check

$value:     user input to be checked
$len_min:   allowed min. length
$len_max:   allowed max. length
$regex:     allowed regex. pattern for $value

return values:
-1 : $value too short
+1 : $value too long
+2 : $value doesn't match regex pattern
 0 : $value is O.K.

*/

function check_user_input($value$len_min$len_max$regex) {
  
$len=strlen($value);
  if (
$len $len_min) return -1;
  if (
$len $len_max) return  1;
  return (
preg_match($regex$value)) ? 2;

Gibt es Einwände?
Hackse ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Security Area » Webmaster-Security » SQL Injections
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61