sql 注入是指攻擊者通過惡意的sql命令插入到 web 表單的輸入域或頁面請求的查詢字串中,井且插入的惡意的sql命令會導致原有的 sql 語句作用發生改變,從而達到欺騙伺服器執行惡意的 sql 命令的一種攻擊方式。
因為它可實現任意資料查詢,如查詢管理員的密碼、使用者**值資料等 嚴重時會發生「脫庫」的高危行為 更有甚者,如果資料庫開啟了寫許可權,攻擊者可利用資料庫的寫功能及特定函式,實現木馬自動部署、系統提權等後續攻擊。
攻擊原理:**資料庫查詢功能基本流程。
使用者---傳送請求-
-- 》伺服器
伺服器拼接sql語句---
---》資料庫查詢
使用者《---
----
----
----
----
----
----
----
----
----
---查詢結果返還給使用者
sql注入的本質:是惡意攻擊者將 sql **插入或新增到程式的引數中,而程式並沒有對傳人的引數進行正確處理,導致引數中的資料被當做**來執行,並最終將執行結果返回給攻擊者。重點需關注的是業務流程中查詢功能中的拼接語句,修改當前查詢語句的結構,從而獲得額外的資訊或執行內容。
sql注人的產生原因通常有以下幾點:
1 )引數處理問題:
對使用者引數進行了錯誤的型別處理。
轉義字元處理環節產生遺漏或可被繞過。
2)服務配置問題:
不安全的資料庫配置。
web應用對錯誤的處理方式不當。
不當的型別處理。
不安全的資料庫配置。
不合理的查詢集處理。
不當的錯誤處理。
轉義字元處理不當。
多個提交處理不當
避免sql注入:
1)採用黑名單、白名單等形式對使用者提交的資訊進行過濾,一旦發現使用者引數**現敏感的詞或者內容,則將其刪除,使得執行失敗。
2)採用引數化查詢方式,強制使用者輸入的資料為引數,從而避免資料庫查詢語句被攻擊者惡意構造
回顯
盲注
典型:
1 )判斷web系統使用的指令碼語言,發現注入點,並確定是否存在sql注入漏洞。
2)判斷web系統的資料庫型別。
3)判斷資料庫中表及相應欄位的結構。
4)構造注入語句,得到表中資料內容。
5)查詢**管理員後台,用得到的管理員賬號和密碼登入。
6)結合其他漏洞,上傳webshell並持續連線。
7)進一步提權,得到伺服器的系統許可權。
回顯:尋找注入點,注入測試。
盲注:長度,+二分法ascii碼猜測結果。select asscii(user(),1,1)>>110根據返回結果進行測試。手工注入耗時長,可用sqlmap。
防護:包括引數過濾和預編譯處理
sql注入漏洞防護流程
常見防護手段及繞過方式:
引數型別檢測。嚴格檢查引數型別,
繞過方式:能使用某些技巧令資料庫報錯,如 is_numeric 支援 六進製制與十進位制 ,提交 0x0l 時它也會進行查詢,intval雖然預設只支援十進位制數字,但依然會有問題,比如提交 id= -1 會出錯 這些細微的差異可以幫助攻擊者識別後台的過濾函式。
引數長度檢測。限制引數長度,從而使得無法注入。可以先用短語句進行測試,如or 1=1,在有的情況下,可以利用注釋符對語句進行變更,
( 」 select count ( * ) f rom l ogin where username =』』 and pas sword= 』 』」, user name , pas sword ));
可採用:select count( * ) from l o g i n where username= 』 test 』 」 -』 and pa ssword=』』」;
由於注釋符的存在, 語句實際執行的內容變為
select count( * ) from l ogin where username= 』 test』,可見,只要 test 使用者存在,資料庫就會返回正確,則可利用當前使用者進行登入,也就不需要當前使用者的正確密碼
危險引數過濾和繞過
1)黑名單過濾:將一些可能用於注入的敏感字元寫入黑名單中,如 (單引號)、union select 等,也可能使用正 表示式做過濾,但黑名單可能會有疏漏
2)白名單過濾 例如,用資料庫中的已知值校對,通常對引數結果進行合法性校驗,符合白名單的資料方可顯示
引數轉義 :對變數預設進行 ddsalashes (在預定義字元前新增反斜槓),使得 sql注入語句構造失敗
繞過:黑名單過濾繞過:1,採用大小寫變種,啟動大小寫轉換就沒作用了,2,使用sql注釋,注釋代替空格,避免過濾。巢狀,過濾後重新組成新語句;用+實現對危險字元的拆分;利用系統注釋符截斷;替換可能的危險字元。
過濾繞過:
1
.尖括號過濾繞過:ord
,1,1
>>
111;可用替代為
between和greatest。between min
andmax。和
greatest<
ascii
,1,1
>
,140
>=
140。
2.逗號過濾繞過:逗號使語句失效。from x for y 繞過逗號,還可利
用數**算函式在子查詢中報錯,比如select exp (~(
select*
from
(select user(
))a)
),利用exp(
)超出範圍報錯,但查
詢會返回結果。
3.空格過濾繞過:/
**/代替空格符號。
引數化查詢:通過固定使用者輸入的引數作為直接的查詢內容。使得攻擊者無法修改。
在對抗 sql 注入攻擊方面,有效的措施是過濾 /轉義,或者將引數進行預編譯或進行引數化查詢 在實際 web 系統中,推薦從潛在的 sql 注入漏洞點對資料的限制進行入手,盡可能限制資料型別(如強制轉義為數字),限制提交查詢的字元型別;再者對各類注入中的特殊字元及敏感函式進行嚴格過濾 這種方法適合中小站點,開發成本小且易實現。
對大型站點,推薦利用預編譯方法或引數化查詢,可有效避免 sql 注人漏洞的產生防護方法設計方面,需綜合關注新增防護的代價與業務開展的正常與否,切不可過度防禦,以免對業務產生影響 漏洞修復適度即可,防護於段沒有絕對的好與壞。
sql注入原理,利用與防護
注入攻擊的本質就是把使用者輸入的資料當作 來執行。所以注入攻擊有兩個必要條件 1.使用者能夠控制的輸入。2.原本程式要執行的 拼接了使用者輸入的資料。按照請求方法可以分為 get請求 post請求 按照引數型別可以分為 數字型 字元型 按照資料返回結果分為 回顯 報錯 盲注 盲注又分為 布林盲注 延...
SQL注入 無法監測則無從防護
通過imperva的眾包威脅情報系統 社群防禦 community defense 對近期的應用攻擊速率進行了簡要分析。從今年5月8日至今,全球共發生了近32萬 319915 起sql注入攻擊事件。為了更好地理解這個數字之下的意義,我們將通過下圖來說明網路應用流量的基本構成,無論它們是基於雲端還是本...
python sql注入防護
sql注入防範 以前對 的安全程度不夠注重,其實也可以說是沒那麼多參考資料來指導,沒那麼嚴格的流程來要求。現在分享一下自己的 安全方面的收穫。sql注入指通過構造不符合預期的sql語句,來達到繞過防範的目的。例子就不舉例了。網上太多。說說python中的防範方法。orm框架 django模型提供了一...