SQL注入防護

2021-10-08 20:02:21 字數 3389 閱讀 9925

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模型提供了一...