Exploit in Webseite finden?

SirN

Cadet 1st Year
Registriert
Jan. 2016
Beiträge
10
Hallo!

Im Vorraus:

Ich will die Seite nicht hacken, ich habe mich, weil meine Lehrer mich gefragt haben, ob ich ihnen helfen könnte, bereit erklärt, die Seite zu entwickeln. Sie ist noch relativ neu, und weil ich davor hauptsächlich in C und Java geschrieben habe, bin auch ich ein Neuling in diesem Gebiet. Ich will keine Fehler (oder möglichst wenige) machen, denn die Seite soll sicher sein und niemand soll in das Profil eines anderen Dinge schreiben, die nicht stimmen (und unangenehme, die stimmen, aber nicht jeder wissen sollte). Ich spreche aus Erfahrung, dass es welche an meiner Schule gibt, die sowas machen und es lustig finden.

Kommen wir zum Punkt:

Ich habe schon einen Fehler gemacht, denn man konnte sich per SQL-Injection (mit ' OR ''=') in beliebige Nutzerkonten einloggen, als ich das gemerkt habe, wurde das natürlich sofort gefixt. Allerdings verstehe ich nicht, wie. Kann mir das jemand erklären, ohne dass ich hier die (zum Teil vertraulichen) Dateien veröffentlichen muss? Und kann man noch andere Sicherheitslücken feststellen? Zum Beispiel, wenn man in Firefox "Q" drückt, dann sieht man ja ziemlich viel.

Vielen Dank im Vorraus für eure Hilfe!
SirN

PS: Link zur Seite, hätte ich fast vergessen :D
ht_tp://w_ww.pg-biberach.de/edu_beta/
Unterstriche entfernen, wegen Spamschutz :)
 
Zuletzt bearbeitet: (PS)
In der Regel gibts, vor allem wenn sie mit einem CMS gebaut wird, umfassende Tipps für Admins zur Absicherung auf der Entwicklerseite des CMS.
 
Zuletzt bearbeitet:
SirN schrieb:
Ich habe schon einen Fehler gemacht, denn man konnte sich per SQL-Injection (mit ' OR ''=') in beliebige Nutzerkonten einloggen, als ich das gemerkt habe, wurde das natürlich sofort gefixt.

Wie hast du das gefixt? Wenn du bisher noch nicht verstanden hast, wie SQL Injections funktionieren, dann ist die Chance hoch, dass der Fix auch nicht wasserdicht ist.

Webanwendungen sind eine verantwortungsvolle Sache. Wenn du da bisher noch gar keine Erfahrung mit hast tust du wahrscheinlich niemandem einen Gefallen damit, wenn du dich daran versuchst.

Was genau ist das denn eigentlich, was da realisiert werden soll? Leute sollen sich einloggen können, was passiert dann, wenn man im Account ist? Gibt es verschiedene Accountgruppen (Lehrer, Schüler, Admins)? Ich kann mir bisher noch nicht wirklich vorstellen, wie viel Arbeitsaufwand dahinter steckt.
 
ich nehme mal an es gibt einige web tools wo man seine eigene Seite testen kann.
Ich selbst kenne nur eine Seite, diese testet den SSL Zugang nach Schwachstellen.
Solltet ihr HTTPS eingerichtet haben könnt ihr dieses auf dieser Seite testen
https://www.ssllabs.com/ssltest/

Web Sicherheit ist sowieso immer eine Gradwanderung, man muss sich entscheiden will man den Server extrem sicher machen oder möglichst alle Browser supporten(ältere Versionen unterstützen oft gewisse Standards nicht). Oft macht man dann einen Kompromiss zwischen Sicherheit & User Freundlichkeit.

Ich denke es gibt bestimmt noch weitere Seiten wo man die Sicherheit testen kann....einfach mal googeln
 
tiash schrieb:
Wie hast du das gefixt? Wenn du bisher noch nicht verstanden hast, wie SQL Injections funktionieren, dann ist die Chance hoch, dass der Fix auch nicht wasserdicht ist.

Das ist ja mein Problem, ich habe das nicht gefixt, sondern ein Lehrer von unserer Schule. Ich kann nicht nachvollziehen, wie das funktioniert, und der Lehrer ist jetzt auf Fortbildung, deswegen frage ich hier, und nicht ihn.
 
Es geht hier nicht um eine einfache Website, sondern um datenschutzrechtlich relevante Daten, richtig?
Es ist äußerst fahrlässig hier jemand Unerfahreren ran zu lassen.
Ich rate daher dazu die Sache zu canceln und das einen Profi machen zu lassen.
 
Das widerspricht sich. Du willst Exploits finden, aber Du hast keine Ahnung von der Materie. Du kannst nur welche finden, wenn Du dich auch mit der Thematik auskennst.
 
Grundsätzlich ist es ja genau richtig, dass du dazu lernen willst, deshalb hier mal ein kleines How To SQLi:

Angenommen, wir haben folgende Datenbank, die Nutzerdaten speichert (Datenbankname users):

[table="width: 500"]
[tr]
[td]id[/td]
[td]username[/td]
[td]pw_hash[/td]
[/tr]
[tr]
[td]1[/td]
[td]admin[/td]
[td]12A4E95B0... (was auch immer)[/td]
[/tr]
[tr]
[td]...[/td]
[td]...[/td]
[td]...[/td]
[/tr]
[tr]
[td]42[/td]
[td]testuser[/td]
[td]ABCDEF123...[/td]
[/tr]
[/table]

Ein einfacher Login könnte wie folgt funktionieren (Pseudocode):
Code:
execute_sql("SELECT * FROM users WHERE username='" + $POST['name'] + "' AND pw_hash='" + hash($POST['password']) + "';");

Liefert das SQL-Statement ein Ergebnis zurück, dann gibt es einen Eintrag in der Datenbank, zu dem die eingegebenen Daten passen.
Was passiert jetzt, wenn ein "Hacker" statt eines Nutzernamens gültige SQL Syntax eingibt?

Zum Beispiel:
Code:
$POST['name']="admin' AND 1=1;#"

Das einfache Anführungszeichen schließt den String, der für den Nutzernamenvergleich erwartet wird und alles danach wird als SQL-Syntax interpretiert. Die # am Ende ist ein Kommentarzeichen, die dafür sorgt, dass der restliche Query nicht betrachtet wird, da die Syntax sonst ungültig werden würde.
Durch Einsetzen in das ursprüngliche SQL-Statement wird das Ganze vielleicht etwas deutlicher:

Code:
execute_sql("SELECT * FROM users WHERE username='admin' AND 1=1;");

Durch die SQL Injection wird das Statement auf jeden Fall die Zeile mit dem Adminbenutzer zurückliefern, das Passwort wird überhaupt nicht mehr überprüft werden. Das ganze geht natürlich beliebig kompliziert und in verschiedensten Varianten für leicht ähnlich aufgebaute SQL-Queries. Für genauere Informationen bitte hier SQL Injection in einer Suchmaschine der eigenen Wahl recherchieren.

Regel Nr. 1 der Websicherheit lautet deshalb: Jeder Input, der vom Nutzer kommt, muss besonders sorgsam behandelt und 'gereinigt' (im Englischen to sanitize) werden!

Die einzig wirklich saubere Variante für sichere SQL-Abfragen ist die Verwendung von prepared Statements.
Allein dadurch wird eine Webseite aber noch lange nicht sicher. Ebenso kann
  • XSS (Klauen von Cookies durch JavaScriptinjection)
  • RCE (Remote Code Execution; das Einschleusen von ausführbaren Skriptcode, z.B. PHP)
  • LFI/RFI (Locale/Remote File Inclusion; das Einbinden von Dateien aus dem Dateisystem des Servers, z.B. /etc/passwd)
  • oder das versehentliche Einbauen logischer Lücken
zum Problem werden.

Und damit zurück zum Thema: Das sichere Erstellen einer Webseite erfordert viel Übung und Erfahrung. Frameworks können dabei helfen, letztendlich ist man aber immer selbst der Schuldige, wenn etwas Lücken hat. Wenn es um ernsthafte Daten geht (das dürfte wohl bei fast allem, wo es um einen Login geht der Fall sein), dann sollte da jemand mit Erfahrung ran. Wenn die Schulseite gehackt wird endet das im Extremfall in Cybermobbing, dem Entwenden von Klassenarbeitsentwürfen, Notenmanipulation oder auch einfach nur in so schlechten Streichen wie "Die Schule bleibt wegen des aktuellen Schneechaos geschlossen. -Der Direktor".
Die aufgebrachten und gegebenenfalls mit Anwalt drohenden Eltern wollt ihr nicht ausbaden. Mach das auch deinem Lehrer klar!
 
Großen Dank an tiash für die Mühe! Ich habe es jetzt einigermaßen verstanden. Ich werde (weil ihr Recht habt - das muss ich einsehen) auch nicht mehr an der Webseite aktiv mithelfen, nurnoch passiv, oder mir den Code angucken, um zu lernen. Vielen Dank für eure Hilfe. :)

An den Admin: Thema kann (denke ich) geschlossen werden.
 
Schön, dass es dir geholfen hat:). Wenn du mehr Fragen oder Interesse an Websicherheit hast, kannst du dich gerne auch per PN melden.

Ganz grundsätzlich ging unsere Kritik aber nicht nur an dich als (ich vermute mal) Schüler, sondern auch an den Lehrer, der das betreut. Lehrer sind in erster Linie Pädagogen und keine Webprofis. Eine schlecht gemachte Webseite kann auch für ihn viel Ärger bedeuten. Für unsere statische Webseite, auf der ein paar kleinere Beiträge eingestellt wurden, hatten wir damals auch eine Webseiten-AG, die sich drum gekümmert hat. Sobald es aber um etwas mit Login geht und man Vertretungspläne o.ä. einstellen (und ggf. auch fälschen) kann, gehört das nicht mehr in die Hände von Schülern und Lehrern.
 
Mit großer Wahrscheinlichkeit hat er es gefixt indem er es so programmiert hat das die Eingaben geprüft werden noch bevor diese in der Datenbank landen!

Auch zusätzlich möglich, dass Daten welche nicht in das Feld gehören, escaped (gestrippt; also entfernt) werden.

Beschäftige mich auch gerade etwas damit (MySQL).:rolleyes:

Wer was eigenes mit Datenbankanbindung programmiert, der sollte zum einen die einzutragenden Daten prüfen lassen (in Feldern mit Zahlen gehören nur Zahlen; in Felder wie Name, Vorname gehören nur Buchstaben), zum anderen Tabellennamen in der Datenbank nutzen die nicht gleich zu erraten sind bzw. bei einem Angriff auch erstmal nur "Staunen" auslösen weil sie keine "Standardnamen" (user, password...) haben.
Da ist also mehr (Angriffs-)Aufwand notwendig um herauszufinden in welcher Tabelle die Benutzer und in welcher die Passwörter gespeichert werden.
Abzusehen davon ist auch diese Tabelennamen (user, password...) in anderen Sprachen zu nutzen!

Moe.Joe schrieb:
ich nehme mal an es gibt einige web tools wo man seine eigene Seite testen kann.
Ja, die gibt es, aber keines kann alles.;)
 
Ob der TE nach einem halben Jahr wohl noch mitliest? ;)

Vieles was du sagst ist grundsätzlich richtig, aber bei der Benennung der Tabellen und Spalten möchte ich dir widersprechen. Wenn mir die Namen nicht bekannt sind, dann mache ich halt eine SQL Injection mehr, um sie von der Datenbank abzufragen. Google mal nach "Information Schema".

Der Vorteil der guten Wartbarkeit und Übersichtlichkeit durch klare Bezeichnungen überwiegt mMn deutlich.
 
Ich bezweifel das es sich bei dem TE um den Autor der Software handelt. Die Software ist in PHP geschrieben, er selbst schreibt aber C und Java...
Das passt nicht zusammen....
 
Zuletzt bearbeitet:
Zurück
Oben