SQL注入最易懂系列教程(1.原理和分類)

前置技能

  1. 1.瞭解SQL語言、語法、操作、常用函數
  2. (基本的SQL數據庫操作是進行SQL注入攻擊的基礎)
  3. 2.瞭解PHP語言,以及PHP+SQL的常用組合操作

1.什麼是SQL注入

所謂SQL注入,就是通過把SQL命令插入到 Web表單提交 或 URL 或 頁面請求等的查詢字符串中,最終達到欺騙服務器執行惡意的SQL命令。

注:從這句話看出常見的注入點在

a. web表單

b. URL鏈接中

c. 登錄框(頁面請求查詢)

2.SQL注入原理

SQL注入(SQLInjection)是這樣一種漏洞:當我們的Web app 在向後臺數據庫傳遞SQL語句進行數據庫操作時。如果對用戶輸入的參數沒有經過嚴格的過濾處理,那麼攻擊者就可以構造特殊的SQL語句

直接輸入數據庫引擎執行,獲取或修改數據庫中的數據。

SQL注入漏洞的本質是把用戶輸入的數據當做代碼來執行,違背了“數據與代碼分離”的原則。

SQL注入漏洞有兩個關鍵條件,理解這兩個條件可以幫助我們理解並防禦SQL注入漏洞:

  • 用戶能控制輸入的內容
  • Web應用執行的代碼中,拼接了用戶輸入的內容

我們以DVWA漏洞演示環境舉列子

我們在輸入框中輸入1,點擊submit,頁面返回如圖紅框中數據。

這裡有經驗的滲透老司機就知道,是web應用查詢了數據庫,獲取了useid為1的數據。

這裡我們大膽猜測一下這裡的SQL語句長什麼樣子呢

select Firstname, sunname from XXX where userid= 我們輸入的ID

SQL注入最易懂系列教程(1.原理和分類)

當我們在輸入框中輸入1時sql語句為:

select Firstname, sunname from XXX where userid= '1'

由回顯數據我們得到Id為1的firstname,sunname的字段內容

但是當我們在輸入框中輸入如下內容時

1' union select 1,database()%23(‘%23’為’#’的url編碼,’#’為mysql註釋符,註釋掉後面的語句)

此時執行的數據庫命令是:

select Firstname, sunname from XXX where userid= '1' union select 1,databsae()#

不僅可以得到id為1的firstname,sunname字段內容,還可以得到當前數據庫名

SQL注入最易懂系列教程(1.原理和分類)

這樣如果攻擊者構造更多的SQL語句,哪麼數據庫裡的信息都會被攻擊者得到,造成數據洩露。

3.SQL注入的產生

  • 動態字符串構建
  • 不正確的處理轉義字符(寬字節注入)
  • 不正確的處理類型(報錯洩露信息)
  • 不正確的處理聯合查詢
  • 不正確的處理錯誤(報錯洩露信息)
  • 不正確的處理多次提交(二次注入)
  • 不安全的數據庫配置
  • 默認預先安裝的用戶
  • 以root、SYSTEM 或者Administrator權限系統用戶來運行
  • 默認允許很多系統函數(如xp_cmdshell, OPENROWSET 等)

4.SQL注入的作用

  • 繞過登錄驗證(萬能密碼等)
  • 獲取敏感數據(獲取數據庫中的信息)
  • 文件操作(讀取、寫入文件等)
  • 執行系統命令
  • 等等

5.常見的SQL注入分類

A.按照數據庫執行結果是否顯示到頁面上分類

a.SQL回顯注入(數據庫的執行結果直接顯示到頁面上)

SQL回顯注入又可以分為:

01:union聯合查詢注入

02:報錯注入

b.SQL盲住不顯示到頁面上)

SQL 盲住又可以分為:

01:布爾盲住

02:時間注入

B.按照注入點類型來分類

  • 數字型注入點
  • 在 Web 端大概是 http://xxx.com/news.php?id=1 這種形式,其注入點 id 類型為數字,所以叫數字型注入點。這一類的 SQL 語句原型大概為 select * from 表名 where id=1。
  • 字符型注入點
  • 在 Web 端大概是 http://xxx.com/news.php?name=admin 這種形式,其注入點 name 類型為字符類型,所以叫字符型注入點。這一類的 SQL 語句原型大概為 select * from 表名 where name='admin'。有時候是是雙引號:where name="admin",注意多了引號。
  • 搜索型注入點
  • 這是一類特殊的注入類型。這類注入主要是指在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有“keyword=關鍵字”,有的不顯示在的鏈接地址裡面,而是直接通過搜索框表單提交。 此類注入點提交的 SQL 語句,其原形大致為:select * from 表名 where 字段 like '%關鍵字%'。

C.按照數據提交的方式來分類

這種分類其實只是 HTTP 傳遞數據的方式不同,嚴格來講和 SQL 沒多大關係,但是在編寫 PoC (漏洞驗證程序)的時候,這會影響到我們的代碼中發送數據的形式,所以我在這裡提出來了。

  • GET 注入
  • 提交數據的方式是 GET , 注入點的位置在 GET 參數部分。比如有這樣的一個鏈接 http://xxx.com/news.php?id=1 , id 是注入點。
  • POST 注入
  • 使用 POST 方式提交數據,注入點位置在 POST 數據部分,常發生在表單中。
  • Cookie 注入
  • HTTP 請求的時候會帶上客戶端的 Cookie, 注入點存在 Cookie 當中的某個字段中。
  • HTTP 頭部注入
  • 注入點在 HTTP 請求頭部的某個字段中。比如存在 User-Agent 字段中。嚴格講的話,Cookie 其實應該也是算頭部注入的一種形式。因為在 HTTP 請求的時候,Cookie 是頭部的一個字段。


分享到:


相關文章: