漏洞:SQL 注入漏洞
SQL注入攻擊(SQL Injection),簡稱注入攻擊、SQL注入,被廣泛用于非法獲取網站控制權,是發生在應用程序的數據庫層上的安全漏洞。在設計程序,忽略了對輸入字符串中夾帶的SQL指令的檢查,被數據庫誤認為是正常的SQL指令而運行,從而使數據庫受到攻擊,可能導致數據被竊取、更改、刪除,以及進一步導致網站被嵌入惡意代碼、被植入后門程序等危害。
SQL注入的危害不僅體現在數據庫層面上,還有可能危及承載數據庫的操作系統;如果SQL注入被用來掛馬,還可能用來傳播惡意軟件等,這些危害包括但不局限于:
1)數據庫信息泄漏:數據庫中存放的用戶的隱私信息的泄露。作為數據的存儲中心,數據庫里往往保存著各類的隱私信息,SQL注入攻擊能導致這些隱私信息透明于攻擊者。
2)網頁篡改:通過操作數據庫對特定網頁進行篡改。
3)網站被掛馬,傳播惡意軟件:修改數據庫一些字段的值,嵌入網馬鏈接,進行掛馬攻擊。
4)數據庫被惡意操作:數據庫服務器被攻擊,數據庫的系統管理員帳戶被篡改。
5)服務器被遠程控制,被安裝后門。經由數據庫服務器提供的操作系統支持,讓黑客得以修改或控制操作系統。
6)破壞硬盤數據,癱瘓全系統。
技術實施
錯誤過濾的轉義字符
當未對用戶輸入的轉義字符進行過濾,然后將其傳遞到SQL語句時,將發生這種注入形式。這導致應用程序的最終用戶可能對數據庫執行的語句進行操作。
以下代碼行說明了此漏洞:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
該SQL代碼旨在從其用戶表中提取指定用戶名的記錄。但是,如果“ userName”變量是由惡意用戶以特定方式制作的,則SQL語句可能會執行超出代碼作者預期的范圍。例如,將“ userName”變量設置為:
' OR '1'='1
或者使用注釋甚至阻止其余查詢(SQL注釋有三種類型)。所有三行末尾都有一個空格:
' OR '1'='1' --
' OR '1'='1' {
' OR '1'='1' /*
通過父語言呈現以下SQL語句之一:
SELECT * FROM users WHERE name = '' OR '1'='1';
SELECT * FROM users WHERE name = '' OR '1'='1' -- ';
如果在身份驗證過程中使用此代碼,則此示例可用于強制從所有用戶而不是編碼器打算從一個特定用戶名選擇每個數據字段(*),因為“ 1” =’1’始終為真。
“userName”的語句中的下面的下面的值會導致“users”表中刪除,以及所有數據從“userinfo”表中的選擇(本質上揭示了每個用戶的信息),使用API允許多個語句:
a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
此輸入將按如下所示指定最終的SQL語句:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
盡管大多數SQL Server實現允許以這種方式通過一次調用執行多個語句,但是出于安全原因,某些SQL API(例如PHP的mysql_query()函數)不允許這樣做。這樣可以防止攻擊者注入完全獨立的查詢,但不會阻止他們修改查詢。
例某個網站的登錄驗證的SQL查詢代碼為:
`strSQL = “SELECT * FROM users WHERE (name = ‘“ + userName + “‘) and (pw = ‘“+ passWord +”‘);”
惡意填入
userName = "1' OR '1'='1";
與
passWord = "1' OR '1'='1";
時,將導致原本的SQL字符串被填為
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
也就是實際上運行的SQL命令會變成下面這樣的
strSQL = "SELECT * FROM users;"
因此達到無賬號密碼,亦可登錄網站。所以SQL注入攻擊被俗稱為黑客的填空游戲。
應對辦法
可以通過數據庫防火墻實現對SQL注入攻擊的防范,因為SQL注入攻擊往往是通過應用程序來進攻,可以使用虛擬補丁技術實現對注入攻擊的SQL特征識別,實現實時攻擊阻斷。
檢測
可以通過數據庫防火墻實現對SQL注入攻擊的防范,因為SQL注入攻擊往往是通過應用程序來進攻,可以使用虛擬補丁技術實現對注入攻擊的SQL特征識別,實現實時攻擊阻斷。
網絡安全學院 社區 Wiki
推薦文章: