天天看點

如何防止SQL注入攻擊

如何防止SQL注入攻擊

什麼是 SQL 注入?

SQLi 是一種基于 Web 的應用程式攻擊,攻擊者可以在網站的資料庫中運作惡意查詢。SQL是一種用于執行惡意SQL語句的代碼注入技術。

例如,如果你想登入網站,但忘記了使用者名和密碼,通過使用SQLi注入,我們可以在不知道密碼的情況下登入或通路網頁。

SQL 注入是如何工作的?

SQL 注入包含通過應用程式中來自用戶端的輸入資料插入或注入 SQL 查詢。這些被注入到影響預定義 SQL 指令的資料平面中。

SQL 注入攻擊針對動态 SQL 語句中的漏洞。将動态 SQL 語句想象成一個多元數學函數,其參數是固定的,而結果由放置在自變量中的值決定。

同樣,動态 SQL 語句也由一組預定義的參數(例如 Web 表單)組成,并且隻有在使用者提供輸入時才會生成完整的語句。

請參閱以下登入表單的 SQL 語句示例:

SELECT  *  FROM users WHERE username =  '$username'  AND password = bcrypt ('$password' )           

當使用者輸入使用者名和密碼時,語句完成。然後向伺服器發送查詢以從資料庫中檢索使用者資訊。

如果動态 SQL 語句中存在漏洞,攻擊者可以以某種形式輸入複雜的腳本來破壞現有參數并更改整個語句的含義。

如何防止SQL注入攻擊

帶内 SQLi:帶内 SQL 注入是一種 SQL 注入,攻擊者通過相同的通信通道接收結果作為直接響應。例如,如果攻擊者通過她的網絡浏覽器手動發起攻擊,則攻擊結果将顯示在她的同一個網絡浏覽器中。帶内 SQL 注入也稱為傳統 SQL 注入。

基于錯誤的 SQL 注入—— 攻擊者在此執行某些操作,導緻資料庫生成錯誤消息。您可以使用錯誤消息來确定正在使用的資料庫、處理程式正在使用的伺服器版本等。

基于聯合的 SQL 注入 —資料庫生成的用于擷取單個 HTTP 響應的語句。您可以在 URL 中構造查詢或在輸入字段中組合多個語句來嘗試生成答案

Blind SQLi : Blind SQL injection是一種SQL注入,攻擊者不會從被攻擊的資料庫中得到明确的響應,而是觀察資料庫伺服器和應用程式的行為,以增量方式重建資料庫結構。SQL 盲注也稱為推理 SQL 注入。

基于布爾值—— 在這裡,攻擊者向資料庫發送 SQL 查詢,并要求應用程式根據查詢傳回 True 還是 False 傳回不同的結果。

基于時間——在這種攻擊中,攻擊者向資料庫送出 SQL 查詢,并導緻資料庫在共享結果之前等待指定的時間量。響應時間幫助攻擊者确定查詢是真還是假。

Out-of-Band SQLi:帶外 SQL 注入 (OOB SQLi) 是一種 SQL 注入,在這種注入中,攻擊者不會通過同一通信通道收到來自被攻擊應用程式的響應,但可能會被誘騙發送資料傳輸到由攻擊者控制的遠端端點。隻有當您使用的伺服器具有觸發 DNS 或 HTTP 請求的指令時,帶外 SQL 注入才有可能。但是,這适用于所有流行的 SQL 伺服器。

SQLi 示例

如何防止SQL注入攻擊

第一個例子非常簡單。它展示了攻擊者如何使用 SQL 注入漏洞繞過應用程式安全并以管理者身份進行身份驗證。

以下腳本是在 Web 伺服器上執行的僞代碼。這是一個使用使用者名和密碼進行身份驗證的簡單示例。示例資料庫有一個以users下列命名的表:username和password。

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']

# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”

# Execute the SQL statement
database.execute(sql)           

這些輸入字段容易受到 SQL 注入攻擊。攻擊者可以在輸入中使用 SQL 指令,進而改變資料庫伺服器執行的 SQL 語句。例如,他們可以使用涉及單引号的技巧并将passwd字段設定為:

password' OR 1=1           

結果,資料庫伺服器運作以下 SQL 查詢:

SELECT id FROM users WHERE username = 'username'  AND password = 'password'  OR  1 = 1 '           

由于該OR 1=1語句,無論和是什麼,該WHERE子句都傳回表中的第id一個。資料庫中的第一個使用者通常是管理者。這樣,攻擊者不僅可以繞過身份驗證,還可以獲得管理者權限。他們還可以注釋掉 SQL 語句的其餘部分,以進一步控制 SQL 查詢的執行

-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16           

如何防止 SQL 注入?

可以應用以下政策來防止 SQL 注入攻擊。

  1. 永遠不要相信使用者輸入。在動态 SQL 語句中使用它們之前,應始終對它們進行清理。

    存儲過程——允許您封裝 SQL 語句并将所有輸入視為參數。

  2. Prepared Statements——準備好的語句,首先建構 SQL 語句,然後将送出的使用者資料作為參數處理。這不會影響 SQL 語句的文法。

    正規表達式 — 可用于檢測潛在的惡意代碼并在執行 SQL 語句之前将其删除。

  3. 資料庫連接配接使用者權限——用于連接配接資料庫的帳戶應該隻被授予必要的權限。這有助于降低伺服器上 SQL 語句的性能。
  4. 錯誤消息——這些消息不會洩露敏感資訊或錯誤的确切位置。“抱歉,出現技術錯誤。我已經聯系了技術團隊。稍後再試”,而不是顯示導緻錯誤的 SQL 語句。

防止 SQL 注入攻擊的唯一方法是設定輸入驗證。這意味着應該監視和清理使用者輸入,以過濾掉潛在的惡意代碼。

這正是 Web 應用程式防火牆 (WAF) 所做的。分析對Web 應用程式的所有使用者輸入,以查找與可疑代碼的比對項。

如果你發現我的任何文章對你有幫助或者有用,麻煩點贊或者轉發。 謝謝!SQL:注入攻擊

繼續閱讀