Web 安全漏洞之 SQL 注入

2021-09-11 09:03:55 字數 3005 閱讀 5879

「有人的地方就有江湖,有資料庫存在的地方就可能存在 sql 注入漏洞。」

在所有漏洞型別中,sql 注入可是說是危害最大最受大家關注的漏洞。簡單說來,sql 注入是通過在使用者可控引數中注入sql語法,破壞原有sql結構,達到編寫程式時意料之外結果的攻擊行為。還是以 thinkjs 為例,假設我們寫了如下乙個介面(實際情況肯定不會這麼寫的):

// user.js

module.exports = class

extends

think.controller

= this.post();

const user = await

this.model().query(

`select * from user where name = "$" and password= "$"`

);if (think.isempty(user))

return

this.success(user);

}}複製**

當使用者提交的usernameadmin"; --的話,最終執行的 sql 語句就會變成

select * from user where name = "admin"; --" and password= "111"

複製**

最終攻擊者就可以成功登入 admin 賬號了,這就是最簡單的 sql 注入了。從上面這個簡單示例中,我們發現漏洞成因可以歸結為以下兩個原因疊加造成的:

程式編寫者在處理應用程式和資料庫互動時,使用字串拼接的方式構造sql語句。

未對使用者可控引數進行足夠的過濾便將引數內容拼接進入到sql語句中。

sql注入根據攻擊者獲取資料的方式分為回顯注入報錯注入以及盲注。剛才演示的直接從返回結果中獲取資料則為回顯注入,當然也可以通過 mysql 執行的報錯結果中嗅探到資料庫的結構和內容,這就是報錯注入。盲注則是根據資料庫執行的延時等操作來判斷是否接近正確值,簡單的說來有點像是拿著聽診器試探保險箱的密碼的感覺。

不同的分類原則會有不同的分類,也有按照注入位置及方式不同進行分類分為post注入get注入cookie注入盲注延時注入搜尋注入base64注入等。不過大家都支援分類形式不同,原理還是一致的,這裡就不一一細說了。

跳過賬戶許可權驗證達到越權

獲取資料庫關鍵資訊從而進行脫庫

在特別情況下還可以修改資料庫內容或者插入內容到資料庫,如果資料庫許可權分配存在問題,或者資料庫本身存在缺陷,那麼攻擊者可以通過sql注入漏洞直接獲取webshell或者伺服器系統許可權。

從文章開頭可以看到,其實漏洞的主要原因還是沒有對使用者輸入的資料進行過濾,所以對來自使用者的資料(get, post, cookie 等)最好做到以下兩種過濾校驗

檢查輸入的資料是否具有所期望的資料格式。這種在引數是數字的時候特別有效,如果攻擊者選擇在引數中插入內容的話則會被轉換成nan導致攻擊失敗。在 thinkjs 中我們提供了強大的 logic 功能可以方便的對資料進行格式校驗。

使用資料庫特定的敏感字元轉義函式把使用者提交上來的非數字資料進行轉義。在 thinkjs 中封裝了 escapestring() 方法可以對敏感字元進行轉義,其原理則和 php 的 mysql_escape_string() 方法是一致的。

// user.js

module.exports = class

extends

think.controller

= this.post();

const user = await

this.model('user').where().find();

if (think.isempty(user))

return

this.success(user);

}}複製**

當我們構造如name=admin&password=!%3d&password=的請求引數時,最終執行的 model 語句就會變成

this.model('user').where();

複製**

由於 http 請求的自動合併陣列的特性造成了我們的 sql 語句並非是我們想要的效果。雖然說框架本身已經針對這種情況進行了處理,當使用者輸入引數被認為是 sql 運算子時則會將關鍵字增加空格,從而將其變成普通字串避免這個問題。不過這種方法會有 一定的損傷,畢竟當真的要傳這幾個運算子的情況的時候接收到的資料和請求的不一樣還是有點懵逼的。所以最好還是在 logic 層對資料進行完善的校驗將問題前置比較好。

除了資料校驗,也可以選擇使用資料庫的儲存過程和預定義指標等特性來抽象數庫訪問,使使用者不能直接訪問資料表和檢視。但這個辦法又有別的影響。

via: sql注入

嚴格限制web應用的資料庫的操作許可權,給此使用者提供僅僅能夠滿足其工作的最低許可權,從而最大限度的減少注入攻擊對資料庫的危害。**請記住永遠不要使用超級使用者或所有者帳號去連線資料庫!**當資料庫被攻擊時將損傷限制在當前表的範圍是比較明智的選擇。通過許可權限制可以防止攻擊者獲取資料庫其它資訊,甚至利用資料庫執行 shell 命令等操作。

當資料庫操作失敗的時候,盡量不要將原始錯誤日誌返回,比如型別錯誤、欄位不匹配等,把**裡的 sql 語句暴露出來,以防止攻擊者利用這些錯誤資訊進行 sql 注入。除此之外,在允許的情況下,使用**或資料庫系統儲存查詢日誌也是乙個好辦法。顯然,日誌並不能防止任何攻擊,但定期審計資料庫執行日誌可以跟蹤是否存在應用程式正常邏輯之外的 sql 語句執行。日誌本身沒用,要查閱其中包含的資訊才行。畢竟,更多的資訊總比沒有要好。

Web安全漏洞

web的大多數安全問題都屬於下面三種型別之一 1 伺服器向公眾提供了不應該提供的服務。2 伺服器把本應私有的資料放到了公開訪問的區域。3 伺服器信賴了來自不可信賴資料來源的資料。顯然,許多伺服器管理員從來沒有從另乙個角度來看看他們的伺服器,例如使用埠掃瞄程式。如果他們曾經這樣做了,就不會在自己的系統...

常見Web安全漏洞

不同許可權賬戶之間的存在越權訪問 檢測防範 1伺服器端必須對每個頁面鏈結進行許可權判斷。2使用者登陸後,伺服器端不應再以客戶端提交的使用者身份資訊為依據,而應以會話中服務端儲存的已登陸的使用者身份資訊為準。3頁面提交的資源標誌與已登陸的使用者身份進行匹配比對,然後判斷其對當前鏈結是否有許可權。4必須...

如何解決sql注入安全漏洞問題

sql注入從表面意思來說就是利用你的sql的不規範性,獲取破壞你的資料庫資訊,一般都會使用第三方工具全面掃瞄尋找注入口。那麼如何防護呢,主要從四個層面來談談 一 前端對特殊字元進行過濾 前端頁面是和使用者交流的視窗,但是魚龍混雜的使用者中你也不知道誰不懷好意,所以要做到對所有需要使用者手動輸入的地方...