前置技能
1.瞭解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
當我們在輸入框中輸入1時sql語句為:
select Firstname, sunname from XXX where userid= '1'
但是當我們在輸入框中輸入如下內容時
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語句,哪麼數據庫裡的信息都會被攻擊者得到,造成數據洩露。
3.SQL注入的產生
動態字符串構建不正確的處理轉義字符(寬字節注入)不正確的處理類型(報錯洩露信息)不正確的處理聯合查詢不正確的處理錯誤(報錯洩露信息)不正確的處理多次提交(二次注入)4.SQL注入的作用
繞過登錄驗證(萬能密碼等)獲取敏感數據(獲取數據庫中的信息)文件操作(讀取、寫入文件等)執行系統命令等等5.常見的SQL注入分類
A.按照數據庫執行結果是否顯示到頁面上分類
a.SQL回顯注入(數據庫的執行結果直接顯示到頁面上)
SQL回顯注入又可以分為:
01:union聯合查詢注入
02:報錯注入
b.
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 是頭部的一個字段。