SQL注入 如何防禦(一)

2021-07-05 17:41:15 字數 1602 閱讀 9013

sql注入式攻擊是指利用設計上的漏洞,在目標伺服器上執行sql 命令以及進行其他方式的攻擊

string name = getuserinput("bookname");

string script = "select table_book where book_name? like? n'%" + name + runsql(script)

runsql(script);

如果name? = " ' select @@servername where '' = ' ";

這樣就可以得到db server的名字

//id和password直接來自使用者的輸入。未做處理

string id = getuserinput("userid");

string password = getuserinput("userpassword");

tring script = "select * from table_user where user_id = '" + id? + "' and user_password? = '" + password? + "' ";

runsql(script);

如果使用者輸入的password為「 or ''=' 」,那麼生成的script就為

select * from table_user where user_id = 'userid' and user_password? = ' ' or ''=' ' 

這樣一來,即使不知道使用者的密碼也可以察看該使用者的帳戶資訊了

再比如,入侵者會把一些巧妙偽裝的**嵌入到你動態生成的sql命令中,比如

delete table_book where 1 = 1? ...

use master--

上面的例子都是一些簡單的示例,攻擊者還可能通過sql的漏洞對作業系統進行攻擊,比如執行

[xp_cmdshell],[xp_regread]

當然實際上的攻擊沒有這麼簡單,攻擊者還會利用系統設計的其他漏洞。比如程式把資料庫返回的出錯資訊沒有進行轉換就直接輸出給使用者看,那麼攻擊者就設計一些sql語句誘導系統返回需要的資訊

從上面的這些例子可以看出,對資料庫訪問許可權的設計不當,給與每乙個資料庫連線太多的許可權,甚至dbo或sa的許可權,也是sql注入式攻擊利用的主要漏洞之一。

?最小許可權原則。特別是不要用dbo或者sa賬戶,為不同的型別的動作或者組建使用不同的賬戶,最小許可權原則適用於所有與安全有關的場合

對使用者輸入進行檢查。對一些特殊字元,比如單引號,雙引號,分號,逗號,冒號,連線號等進行轉換或者過濾;使用強資料型別,比如你需要使用者輸入乙個整數,就要把使用者輸入的資料轉換成整數形式;限制使用者輸入的長度等等。這些檢查要放在server執行,client提交的任何東西都是不可信的

使用儲存過程,如果一定要使用sq語句,那麼用標準的方式組建sql語句,比如可以利用parameters物件,避免用字串直接拼sq命令。

當sql執行出錯時,

不要把資料庫返回的錯誤資訊全部顯示給使用者,錯誤資訊經常會透露一些資料庫設計的細節

針對常用的sql注入式攻擊方式對症下藥

參考more advanced sql injection

SQL注入 SQL注入具體防禦方案

通常在開啟這兩個選項之後能防住部分sql注入漏洞被利用,因為我們之前也介紹了,在某些環境下存在繞過,在int型注入上是沒有多大作用的。通常資料汙染有兩種方式。在php5.4之前,可以利用魔術引號來解決部分sql注入的問題。而gpc在面對int型注入時,也無法進行很好的防禦。所以在通常的工作場景中,用...

sql注入繞過防禦

無waf方式已經在漏洞重溫sql注入中有描述,這裡就不多做贅述,有興趣的朋友可以去看看。內聯注釋 簡單理解 在進行演示之前,首先了解一下內聯注釋。內聯注釋通常用於繞過 安全狗,也就是俗稱的過狗。簡單來說,如果waf攔截的特徵是兩個關鍵字連線在一起,例如我們在判斷顯示位置時使用的order by,在聯...

SQL注入與防禦技術

sql注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。一 sql注入攻擊的簡單示例。statement select from users where value a variable 上面這條語句是很普通的一條sql語句,...