one、概念
SQL注入(SQL Injection)就是攻擊者將SQL語句通過Web網頁注入到網站後臺的數據庫中,從而對數據庫進行控制或者破壞。SQL注入是一種主流的攻擊方式。在OWASP Top 10中,一直穩居第一。
two、原理
SQL注入攻擊的原理就是由於Web後臺對用戶輸入的數據不進行嚴格的檢查導致的,使得攻擊者可以通過在post/get等web表單、輸入域名或頁面請求的查詢字符串中插入惡意的SQL命令,並被web服務器執行,從而繞過PHP等腳本的不嚴謹導致的漏洞,與數據庫進行交互,而這些都不是設計者本來的設計意圖。
three、類型
1、按照注入點類型來分類
在進行SQL注入的時候我們需要判斷注入點的閉合條件,可將SQL注入點大致分爲三類:數字型注入點、字符型注入點、搜索型注入點。
a、數字型注入點
顧名思義就是輸入數據是數字的就是數字型注入,在使用帶關於ID啊,歲數啊!就是這種注入點,而由於在弱數據類型中,是沒有數據類型這一概念的(其實有但是不那麼嚴謹),就比如說,PHP中輸入的數據,PHP是可以自動推導出數據的數據類型的,而Python中是將輸入的數據全部轉換成字符串。
例如:
select * from 表名 where 數字型參數 = 1
b、字符型注入點
字符型注入點就是輸入的數據是字符型,字符型與數字型的區別就是有沒有引號括起來,但是一般情況下數字型也可以括起來,而字符型就行不行了,必須有引號。在使用帶關於姓名,地址,就是這種注入點。
例如:
select * from 表名 where 字符型參數 = 'text'
c、搜索型注入點
搜索型注入點是在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有"keyword=關鍵字",直接通過搜索框表單提交。
例如:
select * from 表名 where 字段 like '%關鍵字%'
2、按照數據提交的方式來分類
這種分類就是通過判斷向數據庫進行提交用到了那種提交方式,比較常用的有GET、POSH方式。
a、GET 注入
這種注入方式是通過GET請求方式向服務器提交數據,注入點位置在GET數據部分,在URL中顯示。
b、POST注入
使用了POST請求方式向服務器提交數據,注入點位置在POST數據部分,沒有在URL中顯示。
d、HTTP頭部注入
這種注入一般在在 HTTP 請求頭部的某個字段中,比如UA或者cooke都有可能。
3、按照執行效果來分類
我們可以通過注入後,對返回的執行效果進行分析,可分爲布爾型,時間型,報錯型。
a、基於報錯注入
基於報錯注入是沒有數據的回顯位,也就是說即使構造語句成功,我們也沒有辦法看到數據的顯示,但是這種注入型卻可以通過頁面執行後返回的錯誤信息顯示在頁面上,這時候我們可以利用這點來構造報錯顯示sql語句。
b、基於布爾的盲注
布爾的盲注就是說通過判斷執行後返回效果,即真假兩種答案進行語句猜測。
布爾型盲注是由於頁面提交數據在與數據交互是完全沒有在頁面上出現回顯數據,只會出現數據提交正確和錯誤兩種不同頁面(注意區別於報錯型,報錯會出現報錯信息,而布爾型不會)。
例如:A問一個啞巴事情,對就點頭,錯就搖頭。
場景如下:
A:“朋友,你是不姓張?”
啞巴:搖頭
A:“我知道了,你姓李嗎?”
啞巴:點頭
A:“原來姓李”
然後A開始了新一輪的猜測
c、基於時間的盲注
時間型的注入遇到的條件更爲苛刻,由於交互完成以後網站沒有錯誤和正確的頁面的回顯,這種情況我們可以利用條件語句與時間延遲語句進行判斷,關鍵函數是sleep()
。
4、按照組合查詢來分類
a、聯合查詢注入
聯合查詢注入是可以使用union all的情況下的注入。
b、堆查詢注入
堆查詢注入是說可以同時執行多條SQL語句。
c、寬字節注入
寬字節注入就是由於後臺機制會給特殊字符添加轉義字符來達到防禦的目的,即%--->\
等, 但是當我們輸入%5c%27,即(’),後臺對%5c添加轉義%df等於的我們輸入的%5c%27組合就被添加爲%df%5c%27,由於%df%5c是一個寬字節漢字,語句就會形成縗%27
-->縗'
。
four、危害
SQL注入作爲OWASP Top 10的第一名,說明其危害性是可以說顯而易見的。當攻擊者控制一個企業的數據庫的時候,可以想象下,我們如果在這個企業上有金額或者姓名、身份證等隱私數據將會被曝光,這是非常可怕的。
以下是說可能涉及到的危害:
- 1、數據庫信息泄露
- 2、網頁被篡改
- 3、管理數據庫後臺
- 4、盜取各類用戶帳號
- 5、控制網站服務器數據
- 6、盜竊所屬網站公司的商業價值資料
five、SQL注入攻擊流程
攻擊流程:
- 1、判斷交互方式
在進行SQL注入時,我們需要知道是客戶端使用什麼方式與服務器進行交互的,一般是get
,post
。 - 2、尋找注入點,進行猜測注入,打破構造
通過SQL語句進行測試注入,找出網頁的語言漏洞,個人感覺這是最關鍵的一步。
若不執行,說明注入是失敗;若報錯,說明語句可能有效;若執行語句並返回預計值,說明注入成功。
常見的閉合有:''
,""
,()
,('')
,("")
,[]
,{}
- 3、注入成功後,使用SQL語句進行數據庫信息採集
這一步就是需要熟悉SQL語句,從而查詢數據庫的基本信息。比如:尋找顯示數據多少、數據庫名稱、數據庫的表、數據庫的列等等。 - 4、當得到數據庫信息後,我們就可以開始撰寫報告了
到了這一步基本滲透測試就完成了,然後整理信息,提交漏洞報告。
測試SQL:
檢測SQL一般分兩種:手工檢查、全自動檢測
-
手工檢查
一般使用盲打的方式,就是不知道後臺代碼,靠自己的經驗去猜測,或者使用一些比較敏感的符號''
,""
,()
,('')
,("")
,[]
,{}
反正見到輸入框或者是URL參數就是加代碼。 -
全自動檢測
檢測工具:啊d注入工具、明小子、Pangolin、Sqlmap(推薦)
任何的檢測方式都有利有弊,所以真正厲害的大牛,都是使用半手工半自動。
常見函數:
select system_user()--系統用戶名
select user()--用戶名
select current_user()--當前用戶名
select session_user()--連接數據庫用的用戶名
select database()--數據庫名
select version()--mysql數據庫版本
select load_file(路徑)--mysql讀取本地文件的函數
select @@datadir--數據庫路徑
select @@basedir--mysql安裝路徑
select @@version_compile_os--操作系統
Six、防禦措施
- 過濾特殊字符
- 使用嚴謹的函數
- 儘量避免用戶輸入的數據與數據庫直接交互
- 多層驗證
- 對數據庫信息進行密文加密
- 儘量避免使用ROOT最高權限操作數據庫
做一個網絡的維護者,而不是攻擊者!