SQL injection

#1
Durch einfache SQL injections können sich Nutzer ein Login beschaffen oder
ein neues registrieren das "höhere" Rechte hat als die normalen User.

Durch simple Hochkommatas wird kann die Abfrage in einem "fehlerhaften/anfälligen" Script unterbrochen werden, hier zu ein anfälliges Script:

PHP:
<?php
    $eingeloggt = false;
    if (isset($_POST["name]) && isset ($_POST["password])) { 
      $verb = mysql_connect("localhost","root","") or  die("Connection 
       Failed"};
       mysql_select_db("sqlinject") or die("databsechoose failed");
      $abfrage = "SELECT * FROM nutzer WHERE nutzername = '" .     
      $_POST["name"] . "" AND passwort = '" . $_POST["passwort"] . "'";
     
      $ergebnis = mysql_query($abfrage, $verb) or die("Abfrage     
      gescheitert")
      if (mysql_num_rows($ergebnis) > 0 );
      {
      mysql_free_result($ergenis);
      mysql_close($verb);
      }
Nun könnte man im HTML formula "Name" eine IMMER wahre Bedingung eingeben und so sich zutritt verschaffen.
PHP:
' OR 0=0 /*
Das ' unterbricht die Abfrage und da durch wird die immer wahre Bedingung 'injeziert'.
Die Scripts sind jedoch mit der Zeit immer besser geworden wo durch es schwierig geworden ist eine SQLinjection durchzuführen.

Man muss dann recht lange Tüfteln :-D
Trotz aller schwierig keit habe ich es so z.B. geschafft kurz Zeitig auf hackthissite.org zu bekommen :)

Ich hoffen euch hat das kleine aber feine Tutorial gefallen.
Bei Fragen schreibt mich an oder schreibt ein Kommentar, bitte Bewerten nicht vergessen.
 
#2
Nett das du dir die Mühe gemacht hast diesen Beitrag zu schreiben, aber Informationen zu sqli basics existieren schon im Forum, dem HABO-Wikki und überall iim Netz ;)
Dennoch als kleine Ergänzung:
Zum verhindern von sql Injections kann man z.b. prepared Statments nutzen. Hierbei kann der SQL Befehl und die Werte (in diesem Fall Name und Passwort) einzeln übertragen werden.
Natürlich gibt es ansonsten auch noch die Möglichkeit Funktionen zum escapen zu nutzen.

LaVolpe hat gesagt.:
Trotz aller schwierig keit habe ich es so z.B. geschafft kurz Zeitig auf hackthissite.org zu bekommen
Wie meinen ? Du hast ein sqli Möglichkeit auf hackthissite gefunden, oder hast du dort die SQLi Challenges gelöst ?
 

LaVolpe

New member
#3
Ja ich habe die SQL Challenge gemeint.
Noch mal Entschuldigung für meine Rechtschreibfehler usw. mein Browser spackt nach 'nem Hookingtest :)
 
#5
Verzeiht meine Dummheit aber ich raffs nicht. Würde ich nun Theoretisch den oben genanten PHP Script nehmen, was genau macht man dan mit dem?
Und wie kannst du im Quellcode der Site dauerhaft was ändern damit NAME eine wahre Bedingung ist?

Wenn wir davon ausgehen das ich das PHP Script hätte wie weiter? Thx :D
 
#6
In dem Script gibt es eine Lücke, durch die man sich fälschlicherweise als Benutzer authentifizieren kann.

Das Script an sich kannst du dir mit den dann erlangten Rechten vielleicht holen, aber ich glaube das ist eher selten das Angriffsziel einer SQL-Injection.

Prinzipiell wird es meist benutzt, um sich Zugang zu Daten/Bereichen zu verschaffen, die man eigentlich nicht bekommen sollte.
 
#7
Öööö... irgendwie chek ich trozdem net.
Ist das Script also im Source-Code der Website oder ist das von uns gemacht?

Wie läuft eine solche Injektion überhaupt ab?

EDIT

Ich geh davon aus das es im Source Code ist... Wie können wir den dann verändern dass wir zugriff bekommen? Man hat ja kein Zugrif auf die FTP Dingens!
 
Zuletzt bearbeitet:

Chromatin

Moderator
Mitarbeiter
#8
Ich geh davon aus das es im Source Code ist... Wie können wir den dann verändern dass wir zugriff bekommen? Man hat ja kein Zugrif auf die FTP Dingens!
1. Beim Nickname vielleicht das nächste mal dezenter vorgehen
2. SQL Injection ist eine weitverbreitete Pest. Oft vorhanden und sehr einfach auszunutzen.
Lies Dich schlau - Du wirst jedenfalls nicht ohne grundlegende PHP Kenntnisse weiterkommen. Ich war so frei und hab Dir mal die ersten 3 Links, die Google dazu ausspuckt, aufgelistet. Kleine Info nebenbei: Das ist MINIMAL-Wissen, welches man haben muss um etwas damit anzufangen.
SQL-Injection
SQL Injection Attacks by Example
PHP: SQL Injection - Manual
 
#10
Zu Compilerjunges Frage :

Also den Code kannst du verändern indem du oben Taskleiste hinten an die Zeichen ketten den Code anhängst (also so geht's bei den meisten WebBrowsern) dann ENTER, der Webcode wird nur "für dich" temporär geändert.
 
Zuletzt bearbeitet:
#11
Zu Compilerjunges Frage :

Also den Code kannst du verändern indem du oben Taskleiste hinten an die Zeichen ketten den Code anhängst (also so geht's bei den meisten WebBrowsern) dann ENTER, der Webcode wird nur "für dich" temporär geändert.
"Der Code wird für dich temporär geändert" ist eher die falsche Ausdrucksweise. Dem (PHP-)Skript wird eine Variable über z.B. die Adresszeile oder einem Formular übergeben und aus dieser Variable bastelt sich das Skript einen String zusammen und schickt diesen zur Datenbank. Diese verarbeitet den String und schickt das Ergebnis in Form eines Arrays zurück an das Skript.

Die Datenbank erhält den kompletten String ohne zu wissen welcher Teil davon vom User stammt und damit für Injections anfällig ist.

Bei den bereits genannten prepared Statements wird der User-Input extra mitgeschickt, somit kann die Datenbank unterscheiden, welcher Teil des Strings als SQL-Code zu interpretieren ist und welcher nicht.
 
#12
Also muss ich den PHP Skript hinter die URL anhängen?

Habs mal beim HABO ausprobiert, allerdings kommt dan Page Not Found^^

Ich glaub ich stll grad ne dumme frage aber noch ne andere:

Dieser PHP Skript, wen ein Hacker den erstellet schaut er im Source Code nach wos ein fehler haben könnte und bindet dass so in den PHP dingens ein?

Und dass mit dem Source-Code ändern... Eifach hinter die URL den HTML Code eintippen der gewünscht wird?
 
#14
Also muss ich den PHP Skript hinter die URL anhängen?

Habs mal beim HABO ausprobiert, allerdings kommt dan Page Not Found^^

Ich glaub ich stll grad ne dumme frage aber noch ne andere:

Dieser PHP Skript, wen ein Hacker den erstellet schaut er im Source Code nach wos ein fehler haben könnte und bindet dass so in den PHP dingens ein?

Und dass mit dem Source-Code ändern... Eifach hinter die URL den HTML Code eintippen der gewünscht wird?
Da du offentlich nicht die geringste Ahnung hast was du da tust, lass dir gesagt sein: Das wird so nichts.
Man kann nicht einfach 3 Zeichen an ne eiURL hängen und ist plötzlich im System vom BND und n super Hacker. Das funktioniert so einfach nicht. Wenn dich das wirklich interessiert, dann lern PHP und beschäftige dich mit Datenbanken. Wenn du das getan hast, wirst du dir alle deine Fragen selbst beantworten können.
 
#15
Dieses Beispiel sollte eine kleine Einführung darbieten, natürlich kann ich solche Ergebnisse nicht durch irgendwelche immer wahre Bedingungen bieten
 

beavisbee

Member of Honour
#16
Generell kann man sagen:
um Lücken in einem System ausnutzen zu können (und damit meine ich NICHT, mit irgendwelchen fertigen T00lz wild um sich schießen, ohne die Funktionsweise auch nur ansatzweise zu kennen und zu verstehen!), muss man das Zielsystem sicher beherrschen und dessen Arbeitsweise kennen.

Im Falle SQL-Injections und andere Angriffs-Szenarien bei PHP-Seiten:
  • du solltest die Sprache (also in diesem Fall PHP) wirklich BEHERRSCHEN, also auch alle Schwächen der Sprache kennen. (incl. sämtl. Konfigurations-Möglichkeiten und deren Auswirkung auf die Sicherheit einer an sich möglicherweise unsicheren Web-Applikation - z.B. Stichwörter wie MagicQuotes, RegisterGlobals, ...)
  • dir sollten die typischen Anfänger-Fehler und fehler-anfällige Sprach-Konstrukte aus Zeiten, in denen die Sprache noch nicht so weit entwickelt war, geläufig sein.
  • speziell bei SQL-Injections: selbst komplexe SQL-Queries sollten für dich kein Problem sein und du solltest eine Vorstellung haben, wie du durch Manipulation von GET- oder POST-Parametern die Query an sich manipulierst.
 
#17
Anfällig für SQL-Injections sind natürlich nicht nur POST und GET, sondern alle Parameter die vom User manipuliert werden können.

Hier zum Beispiel ein häufig gemachter Fehler, beim Umgang mit dem X-Forwarded-For-Header:
PHP:
<?php
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) )
    $ip_adresse = $_SERVER['HTTP_X_FORWARDED_FOR'];
else
     $ip_adresse = $_SERVER['REMOTE_ADDR'];
 
$query = "INSERT INTO t_besucher (f_id, f_ip, f_timestamp) VALUES (NULL, '" . $ip_adresse . "', NULL)";
 
mysql_query($query);
?>
Code:
X-Forwarded-For: 127.0.0.1', NULL); DROP TABLE t_besucher; --
Das betrifft natürlich alle Header (Refferer, User_Agent, etc.).

Ebenfalls ein häufig gemachter Fehler ist die falsche Verwendung von Funktionen wie mysql_real_escape_string oder addslashes. Diese maskieren Anführungszeichen. Das ganze ist allerdings nutzlos wenn der Parameter selbst nicht durch Anführungszeichen begrenzt ist.
Beispiel:
PHP:
$query = "SELECT * FROM t_sites WHERE f_id = " . mysql_real_escape_string( $_GET['id'] );
Code:
/index.php?id=-1+union+select+user(),version(),database()
Im obigen Beispiel wird durch -1 sichergestellt, dass der erste Query kein Ergebnis liefert und anschließend wird mit "union" ein weiterer Query drangehängt.
 
#18
dafuq: mysql_query kann diesen speziellen Exploit aber nicht ausführen. mysql_query führt immer nur ein Statement aus.
Trotzdem kann man da natürlich noch viele lustige Sachen mit machen.

Allgemein lässt sich heutzutage (und auch schon vor zich Jahren) sagen, dass jemand, der heute noch im Regelfall SQL direkt nutzt, was falsch macht. Fast nie wird Funktionalität benötigt, die ein gegebener ORM nicht bieten kann.
Grundsätzlich falsch ist das Zusammenbauen von SQL-Queries mittels Stringmanipulation. Das ist nie korrekt.
 
#19
Stimmt, außer man benutzt die Funktion multi_queries (die gibts glaube ich aber nur für mysqli?), das war mir aber auch bewusst, soll ja nur ne Demo sein. ;)

Auch die zweite Injection ist so natürlich weniger sinnvoll, denn eigentlich sollten die Datenbankinformationen mit concat() verbunden werden und durch Herumprobieren und Einfügen von Platzhaltern dann am Ende den Inhalt der Seite o.Ä. ersetzen. Aber wie gesagt, soll nur der Demonstration dienen.
 
Oben