Korrigieren Sie die PHP-Benutzerregistrierung. Erstellen eines einfachen Benutzerregistrierungssystems in PHP und MySQL

Heute werfen wir einen Blick auf die Ausnutzung einer kritischen 1-Tages-Sicherheitslücke im beliebten CMS Joomla, die Ende Oktober im Internet explodierte. Wir werden über Schwachstellen mit den Nummern CVE-2016-8869, CVE-2016-8870 und CVE-2016-9081 sprechen. Alle drei stammen aus einem einzigen Codestück, das fünf lange Jahre lang in den Tiefen des Frameworks schmachtete und in den Startlöchern wartete, nur um sich dann zu befreien und Chaos, gehackte Websites und die Tränen unschuldiger Benutzer dieses Joomla mit sich zu bringen. Nur die tapfersten und mutigsten Entwickler, deren Augen vom Licht der Monitore gerötet waren und deren Tastaturen mit Brotkrümeln übersät waren, konnten sich den wütenden bösen Geistern entgegenstellen und ihre Köpfe auf den Altar der Korrekturen legen.

WARNUNG Alle Informationen dienen ausschließlich Informationszwecken. Weder die Herausgeber noch der Autor sind für mögliche Schäden verantwortlich, die durch die Materialien dieses Artikels verursacht werden. Wo alles begann

Am 6. Oktober 2016 erstellte Demis Palma ein Thema auf Stack Exchange, in dem er fragte: Warum gibt es in Joomla Version 3.6 eigentlich zwei Methoden zur Registrierung von Benutzern mit demselben Namen register()? Der erste befindet sich im UsersControllerRegistration-Controller und der zweite im UsersControllerUser-Controller. Damis wollte wissen, ob die Methode UsersControllerUser::register() irgendwo verwendet wurde oder ob es sich nur um einen evolutionären Anachronismus handelte, der von der alten Logik übrig geblieben war. Seine Sorge war, dass diese Methode, selbst wenn sie von keiner Ansicht verwendet wird, von einer gestalteten Abfrage aufgerufen werden kann. Darauf erhielt ich eine Antwort von einem Entwickler unter dem Spitznamen itoctopus, der bestätigte: Das Problem besteht tatsächlich. Und schickte einen Bericht an die Joomla-Entwickler.

Dann entwickelten sich die Ereignisse am schnellsten. Am 18. Oktober akzeptierten die Joomla-Entwickler den Bericht von Damis, der zu diesem Zeitpunkt einen PoC entworfen hatte, der die Benutzerregistrierung ermöglichen würde. Er veröffentlichte auf seiner Website eine Notiz, in der er allgemein über das von ihm festgestellte Problem und seine Gedanken zu diesem Thema sprach. Am selben Tag wird eine neue Version von Joomla 3.6.3 veröffentlicht, die noch anfälligen Code enthält.

Danach spinnt Davide Tampellini den Fehler so weit, dass kein einfacher Benutzer, sondern ein Administrator registriert wird. Und am 21. Oktober erreicht das Joomla-Sicherheitsteam einen neuen Fall. Es ist bereits von zunehmenden Privilegien die Rede. Am selben Tag erscheint auf der Joomla-Website die Ankündigung, dass am Dienstag, 25. Oktober, die nächste Version mit der Seriennummer 3.6.3 veröffentlicht wird, die eine kritische Schwachstelle im Systemkernel behebt.

25. Oktober Das Joomla Security Strike Team findet das neueste Problem, das durch den von Damis entdeckten Code verursacht wurde. Dann wird ein Commit vom 21. Oktober mit dem unauffälligen Namen Prepare 3.6.4 Stable Release in den Hauptzweig des offiziellen Joomla-Repositorys gepusht, der den unglücklichen Fehler behebt.

Nach der Veröffentlichung schließen sich zahlreiche Interessierte der Entwicklergemeinschaft an – sie beginnen, die Schwachstelle bekannt zu machen und Exploits vorzubereiten.

Am 27. Oktober lädt der Forscher Harry Roberts einen vorgefertigten Exploit in das Xiphos Research-Repository hoch, der eine PHP-Datei auf einen Server mit einem anfälligen CMS hochladen kann.

Einzelheiten

Nun, der Hintergrund ist vorbei, kommen wir zum interessantesten Teil – der Analyse der Schwachstelle. Ich habe Joomla 3.6.3 als Testversion installiert, daher sind alle Zeilennummern für diese Version relevant. Und alle Pfade zu den Dateien, die Sie unten sehen, werden relativ zum Stammverzeichnis des installierten CMS angegeben.

Dank der Entdeckung von Damis Palma wissen wir, dass es zwei Methoden gibt, die die Benutzerregistrierung im System durchführen. Die erste wird vom CMS verwendet und befindet sich in der Datei /components/com_users/controllers/registration.php:108. Der zweite (den wir aufrufen müssen) befindet sich in /components/com_users/controllers/user.php:293. Schauen wir es uns genauer an.

286: /** 287: * Methode zum Registrieren eines Benutzers. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: öffentliche Funktion register() 294: ( 295: JSession::checkToken("post") oder jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Formulardaten abrufen. . 315: $return = $model->validate($form, $data); 316: 317: // Auf Fehler prüfen. 319: ( ... 345: / / 346: $return = $model->register($data);

Hier habe ich nur interessante Zeilen hinterlassen. Die Vollversion der anfälligen Methode kann im Joomla-Repository eingesehen werden.

Lassen Sie uns herausfinden, was bei der normalen Benutzerregistrierung passiert: Welche Daten werden gesendet und wie werden sie verarbeitet? Wenn die Benutzerregistrierung in den Einstellungen aktiviert ist, finden Sie das Formular unter http://joomla.local/index.php/component/users/?view=registration.


Eine legitime Benutzerregistrierungsanfrage sieht wie im folgenden Screenshot aus.


Die Komponente com_users ist für die Arbeit mit Benutzern verantwortlich. Achten Sie auf den Aufgabenparameter in der Anfrage. Es hat das Format $controller.$method . Schauen wir uns die Dateistruktur an.

Die Namen der Skripte im Controller-Ordner entsprechen den Namen der aufgerufenen Controller. Da unsere Anfrage nun $controller = "registration" hat, werden die Datei „registration.php“ und ihre Methode „register()“ aufgerufen.

Achtung, Frage: Wie kann die Registrierungsverarbeitung an eine anfällige Stelle im Code übertragen werden? Sie haben es wahrscheinlich schon erraten. Die Namen der anfälligen und echten Methoden sind identisch (Register), wir müssen also nur den Namen des aufgerufenen Controllers ändern. Wo befindet sich unser anfälliger Controller? Genau, in der Datei user.php. Es stellt sich heraus $controller = "user" . Wenn wir alles zusammenfügen, erhalten wir task = user.register . Jetzt wird die Registrierungsanfrage mit der von uns benötigten Methode bearbeitet.


Als Zweites müssen wir die Daten im richtigen Format senden. Hier ist alles einfach. Legitimate register() erwartet von uns ein Array namens jform , in dem wir Registrierungsdaten übergeben – Name, Login, Passwort, E-Mail (siehe Screenshot mit der Anfrage).

  • /components/com_users/controllers/registration.php: 124: // Benutzerdaten abrufen. 125: $requestData = $this->input->post->get("jform", array(), "array");

Unser Kunde erhält diese Daten von einem Array namens user.

  • /components/com_users/controllers/user.php: 301: // Formulardaten abrufen. 302: $data = $this->input->post->get("user", array(), "array");

Daher ändern wir die Namen aller Parameter in der Anfrage von jfrom in user .

Unser dritter Schritt besteht darin, ein gültiges CSRF-Token zu finden, da ohne dieses keine Registrierung erfolgt.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") oder jexit(JText::_("JINVALID_TOKEN"));

Es sieht aus wie ein MD5-Hash und Sie können ihn beispielsweise dem Autorisierungsformular auf der Website /index.php/component/users/?view=login entnehmen.


Jetzt können Sie Benutzer mit der gewünschten Methode erstellen. Wenn alles funktioniert hat, dann herzlichen Glückwunsch – Sie haben gerade die Schwachstelle CVE-2016-8870 „Fehlende Berechtigungsprüfung für die Registrierung neuer Benutzer“ ausgenutzt.

So sieht es in der „funktionierenden“ register()-Methode des UsersControllerRegistration-Controllers aus:

  • /components/com_users/controllers/registration.php: 113: // Wenn die Registrierung deaktiviert ist – Weiterleitung zur Anmeldeseite. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: return false; 119: )

Und so in verwundbar:

  • /components/com_users/controllers/user.php:

Ja, auf keinen Fall.

Um das zweite, viel schwerwiegendere Problem zu verstehen, senden wir die von uns erstellte Anfrage und sehen, wie sie in verschiedenen Teilen des Codes ausgeführt wird. Hier ist der Teil, der für die Validierung der vom Benutzer übermittelten Daten in der Worker-Methode verantwortlich ist:

Die Fortsetzung steht nur Mitgliedern zur Verfügung. Option 1: Treten Sie der „Site“-Community bei, um alle Materialien auf der Site zu lesen

Durch die Mitgliedschaft in der Community innerhalb des angegebenen Zeitraums erhalten Sie Zugriff auf ALLE Hacker-Materialien, erhöhen Ihren persönlichen kumulativen Rabatt und können eine professionelle Xakep-Score-Bewertung erwerben!

Viele Websites verfügen über ein Registrierungsformular, mit dem sich Ihre Benutzer anmelden können, und können daher von gewissen Privilegien innerhalb der Website profitieren. In diesem Artikel erfahren Sie, wie Sie ein Registrierungsformular in PHP und MySQL erstellen.

Wir werden einfache Tags und auch Tabellen-Tags verwenden, um die Webseite „Sign-Up.html“ zu entwerfen. Lasst uns beginnen:

Listing 1: sign-up.html

Anmeldeformular

Name
Email
Nutzername
Passwort
Bestätige das Passwort


Abbildung 1:

Beschreibung der sing-in.html-Webseite:

Wie Sie in Abbildung 1 sehen können, gibt es ein Registrierungsformular, in dem nur wenige Daten zum Benutzer abgefragt werden. Dies sind die allgemeinen Daten, die jede Website von ihren Benutzern oder Besuchern zur Erstellung einer ID und eines Passworts verlangt. Wir haben das Tabellen-Tag verwendet, um die Formularfelder auf der Webseite in einer Anordnungsform anzuzeigen, wie Sie sie in Abbildung 1 sehen können. Es sieht so einfach aus, weil wir noch keinen CSS-Stil verwendet haben. Jetzt verwenden wir CSS-Stile und verknüpfen die CSS-Stildatei mit sing-up.html-Webseite.

Listing 2: style.css

/*CSS-Datei für die Anmeldewebseite*/ #body-color( background-color:#6699CC; ) #Sign-Up( background-image:url("sign-up.png"); background-size:500px 500px ;Hintergrundwiederholung:keine-Wiederholung;Hintergrund-Position:150px;Rand-Links:10px;Breite:100px;Hintergrund:#FF00FF; Schriftstärke:fett; Schriftgröße:20px;

Listing 3: Verknüpfen Sie style.css mit der Webseite sign-up.html



Figur 2:

Beschreibung der style.css-Datei:

In der externen CSS-Datei haben wir einige Stile verwendet, die für Sie neu aussehen könnten. Wir haben ein Bild im Hintergrund verwendet und es in der Mitte der Webseite platziert. Dies ist mithilfe des HTML-Div-Tags einfach zu verwenden. Da wir drei Div-Tag-IDs verwendet haben. #button, #sing-up und #body-color und wir haben alle CSS-Stile darauf angewendet und jetzt können Sie in Abbildung 2 sehen, wie schön und attraktiv es aussieht. Sie können darauf viele andere CSS-Stile wie 2D- und 3D-CSS-Stile verwenden. Es wird schöner aussehen, als es jetzt aussieht.

Nach all diesen einfachen Arbeiten erstellen wir nun eine Datenbank und eine Tabelle, um alle Daten in der Datenbank neuer Benutzer zu speichern. Bevor wir eine Tabelle erstellen, sollten wir wissen, was wir vom Benutzer benötigen. Während wir das Formular entworfen haben, erstellen wir die Tabelle entsprechend dem Registrierungsformular, das Sie in Abbildung 1 und 2 sehen können.

Listing 3: Abfrage nach Tabelle in MySQL

CREATE TABLE WebsiteUsers (userID int(9) NOT NULL auto_increment, fullname VARCHAR(50) NOT NULL, userName VARCHAR(40) NOT NULL, email VARCHAR(40) NOT NULL, pass VARCHAR(40) NOT NULL, PRIMARY KEY(userID) );

Beschreibung von Listing 3:

Eines sollten Sie wissen: Wenn Sie nicht über die MySQL-Funktion zur Verwendung dieser Abfrage verfügen, sollten Sie meinen vorherigen Artikel darüber befolgen. Über diesen Link können Sie die Installation und die Anforderungen verstehen. Und wie können wir es nutzen.

In der Listing-3-Abfrage haben wir alle Dinge verwendet, die wir für das Registrierungsformular benötigen. Da es Variablen für E-Mail, vollständigen Namen, Passwort und Benutzernamen gibt. In diesen Variablen werden Daten des Benutzers gespeichert, die er in das Registrierungsformular in Abbildung 2 für die Anmeldung eingibt.

Nach all diesen Arbeiten werden wir mit der PHP-Programmierung arbeiten, einer serverseitigen Programmiersprache. Deshalb muss eine Verbindung mit der Datenbank hergestellt werden.

Listing 4: Datenbankanbindung

Beschreibung von Listing 4:

Wir haben eine Verbindung zwischen der Datenbank und unseren Webseiten hergestellt. Wenn Sie jedoch nicht wissen, ob es funktioniert oder nicht, verwenden Sie dazu noch etwas in der letzten Checkliste 5.

Listing 5: Überprüfung der Verbindung der Datenbankkonnektivität

Beschreibung Listing 5:

Im Listing 5 habe ich nur versucht, Ihnen zu zeigen, dass Sie die Verbindung zwischen der Datenbank und PHP überprüfen und bestätigen können. Und noch etwas: Wir werden den Code aus Listing 5 auf unserer Anmeldewebseite nicht verwenden. Denn es dient lediglich dazu, Ihnen verständlich zu machen, wie Sie die MySQL-Verbindung überprüfen können.

Jetzt schreiben wir eine PHP-Programmieranwendung, um zunächst die Verfügbarkeit des Benutzers zu prüfen und dann den Benutzer zu speichern, wenn er/sie ein neuer Benutzer auf der Webseite ist.

Listing 6: connected-sign-up.php

Beschreibung von „connectivity-sign-up.php“.

In dieser PHP-Anwendung habe ich den einfachsten Weg verwendet, um eine Anmeldeanwendung für die Webseiten zu erstellen. Wie Sie sehen können, erstellen wir zunächst eine Verbindung wie in Listing 4. Und dann haben wir zwei Funktionen verwendet. Die erste Funktion ist SignUP(), die von der if-Anweisung aus der letzten Anwendung aufgerufen wird, wobei sie als erstes das Drücken der Anmeldung bestätigt Taste. Wenn es gedrückt wird, ruft es die SingUp-Funktion auf und diese Funktion verwendet eine SELECT-Abfrage, um die Daten abzurufen und sie mit dem Benutzernamen und der E-Mail-Adresse zu vergleichen, die aktuell vom Benutzer eingegeben wurden. Wenn der Benutzername und die E-Mail-Adresse bereits in der Datenbank vorhanden sind, wird die Meldung „Entschuldigung, dass Sie bereits registriert sind“ angezeigt

Wenn der Benutzer neu ist, da sein aktueller Benutzername und seine E-Mail-ID nicht in der Datenbank vorhanden sind, ruft die If-Anweisung NewUser() auf, wo alle Informationen des neuen Benutzers gespeichert werden. Und der Benutzer wird Teil der Webseite.



Figur 3

In Abbildung 3 gibt der Benutzer Daten ein, um sich anzumelden, wenn der Benutzer gemäß den Datenbankeinträgen ein alter Benutzer dieser Webseite ist. Wenn der Benutzer neu ist, wird auf der Webseite eine Meldung angezeigt, dass der Benutzer bereits registriert ist. Daher wird auf der Webseite eine Meldung angezeigt, dass die Registrierung des Benutzers abgeschlossen ist.



Figur 4:

Als wir Daten in das Registrierungsformular eingegeben haben (Abbildung 4), sind laut Datenbank bereits der Benutzername und die E-Mail-Adresse, die wir zur Anmeldung in das Registrierungsformular eingegeben haben, in der Datenbank vorhanden. Daher sollten wir einen neuen Benutzernamen und eine neue E-Mail-Adresse verwenden, um uns mit einer neuen ID und einem neuen Passwort anzumelden.



Abbildung 5

In Abbildung 5 wird uns bestätigt, welchen Benutzernamen und welche E-Mail-ID der Benutzer eingegeben hat. Beide sind in den Datenbankeinträgen nicht vorhanden. Nun werden eine neue ID und ein neues Passwort erstellt und der Benutzer kann sich beim nächsten Mal mit seiner neuen ID und seinem neuen Passwort anmelden.

Abschluss:

In diesem Artikel haben wir erfahren, wie man am einfachsten eine Anmeldeseite erstellt. Wir haben auch gelernt, wie es mit der Datenbank umgeht, wenn wir PHP und MySQL verwenden. Ich habe versucht, Ihnen grundlegende Kenntnisse über die Funktionalität der Anmeldewebseite zu vermitteln. Wie es im Backend funktioniert und wie wir sein Aussehen im Frontend ändern können. Bei Fragen zögern Sie nicht und kommentieren Sie.

Zuletzt geändert am 5. April 2018 von Vincy.

Die Benutzeranmeldung und -registrierung ist eine Grundvoraussetzung für alle CMS-Anwendungen. Dies ist die erste Arbeit beim Starten eines Projekts. Eine Anwendung mit Benutzer-Login-Authentifizierung bietet Sicherheit, indem sie anonymen Zugriff verhindert. Es gibt verschiedene Möglichkeiten, die Authentifizierung in unserer Anwendung zu aktivieren, z. B. durch die Aktivierung der OAuth-Anmeldung oder durch die Implementierung von Single Sign-on (SSO) und ähnliche andere Möglichkeiten. In einem früheren Tutorial haben wir gesehen, wie man es implementiert und auch darüber.

Dieses Beispiel umfasst sowohl die Anmelde- als auch die Registrierungsfunktionen. Ich habe die MySQL-Datenbank zum Speichern der registrierten Mitglieder verwendet. Die Benutzerregistrierung enthält Eingaben, um die Details vom Benutzer zu erhalten. Beim Absenden dieses Formulars werden die Formulardaten an PHP gesendet und in der Datenbank gespeichert. Das Benutzerkennwort wird vor der Speicherung in der Datenbank verschlüsselt. vor dem Posten im PHP-Code. Wenn der Benutzer mit den gültigen Anmeldeinformationen angemeldet ist, können der Benutzer und er fortfahren.

Benutzerregistrierungsformular

Dieser Code dient dazu, dem Benutzer das Anmeldeformular anzuzeigen. Wenn der Benutzer das Formular mit seinen Daten abschickt, wird die JavaScript-Funktion aufgerufen, um die Benutzereingaben zu validieren. Nach erfolgreicher Validierung liest der PHP-Code die bereitgestellten Formulardaten, um die Datenbankeinfügung auszuführen.

Auf vielen Seiten, die wir täglich im Internet durchsuchen, verfügen fast alle über eine Benutzerregistrierung. In dieser Lektion gehen wir auf die Grundlagen der Benutzerverwaltung ein und schließen mit einem einfachen Mitgliederbereich, den Sie auf Ihrer eigenen Website implementieren können.

Diese Lektion richtet sich an Anfänger im Erlernen von PHP, in der wir uns mit den Grundlagen der Benutzerverwaltung befassen.

Schritt 1

Erstellen wir eine Benutzertabelle in der Datenbank, in der wir Informationen über Benutzer in den Feldern der Tabelle 4 speichern

  • Benutzer-ID
  • Nutzername
  • Passwort
  • E-Mail-Adresse

Verwenden Sie die folgende SQL-Abfrage, um die Datenbank zu erstellen

CREATE TABLE `users` ( ​​`UserID` INT(25 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `Username` VARCHAR(65 ) NOT NULL , `Password` VARCHAR(32 ) NOT NULL , `EmailAddress` VARCHAR(255 ) NOT NULL );

Diese Datei ist für die Verbindung zur Datenbank verantwortlich und wird auf allen Seiten angezeigt. Schauen wir uns die Codezeilen genauer an

session_start();

Diese Funktion startet eine Sitzung für einen neuen Benutzer. Anschließend speichern wir darin Daten über den Verlauf der Sitzung, damit wir bereits identifizierte Benutzer wiedererkennen können

mysql_connect($dbhost, $dbuser, $dbpass) oder die("MySQL-Fehler: " . mysql_error());

mysql_select_db($dbname) oder die("MySQL-Fehler: " . mysql_error());

Jede dieser Funktionen führt separate, aber verwandte Aufgaben aus.

Die Funktion mysql_connect stellt eine Verbindung zum MySQL-Datenbankserver her. Die Parameter in Klammern sind Variablen, denen die entsprechenden Werte Host, Benutzername und Passwort zugewiesen sind. Wenn die Daten falsch sind, wird eine Fehlermeldung angezeigt

Die Funktion mysql_select_db wählt eine Datenbank aus, deren Namen wir der Variablen $dbname zugewiesen haben. Wenn sie die Datenbank nicht finden kann, wird eine Fehlermeldung angezeigt

Schritt 2: Erstellen Sie die Datei index.php

Ein sehr wichtiges Element auf unserer Seite ist die erste PHP-Zeile; Diese Zeile enthält die oben erstellte Datei (base.php) und ermöglicht uns im Wesentlichen den Zugriff auf alles aus dieser Datei in unserer aktuellen Datei. Wir werden dies mit der folgenden PHP-Codezeile tun. Erstellen Sie eine Datei mit dem Namen index.php und platzieren Sie diesen Code oben.

Erstellen Sie eine neue index.php-Datei und fügen Sie den folgenden Code ganz am Anfang ein

Diese Zeile verbindet die Datei, die wir oben erstellt haben (base.php), wodurch wir in unserer aktuellen Datei auf den Code dieser Datei zugreifen können.

Dies geschieht durch die Funktion include().

Nun erstellen wir eine externe Schnittstelle, über die der Benutzer seine Daten zur Registrierung eingibt und, falls er bereits registriert ist, die Möglichkeit gibt, die Daten zu ändern. Da dieses Tutorial auf PHP ausgerichtet ist, werden wir uns nicht mit dem HTML/CSS-Code befassen, wir werden das Erscheinungsbild später bei der Erstellung unseres CSS-Stylesheets übernehmen, aber vorerst werden wir diesen Code einfach nach der vorherigen Zeile einfügen.

Benutzerverwaltungssystem Fügen Sie hier den PHP-Code ein

Bevor wir uns nun mit dem PHP-Programm befassen, werfen wir einen Blick auf das Funktionsprinzip, das in einer bestimmten Situation auf dem Bildschirm angezeigt werden sollte:

  • Wenn der Benutzer bereits angemeldet ist, zeigen wir eine Seite mit verschiedenen Optionen an, die vor der Registrierung ausgeblendet waren.
  • Wenn der Benutzer noch nicht eingeloggt, aber registriert ist, zeigen wir ein Formular zur Eingabe von Login und Passwort an.
  • Sollten die Schritte 1 und 2 nicht abgeschlossen sein, zeigen wir Ihnen das Anmeldeformular an.
  • Es wird so aussehen:



    Verwandte Veröffentlichungen