SQL注入攻擊入門

SQL注入攻擊

    SQL攻擊(SQL injection),簡稱注入攻擊,是發生於應用程序之數據庫層的安全漏洞。簡而言之,是在輸入的字符串之中注入SQL指令,在設計不良的程序當中忽略了檢查,那麼這些注入進去的指令就會被數據庫服務器誤認爲是正常的SQL指令而運行,因此遭到破壞。
    有部份人認爲SQL注入攻擊是隻針對Microsoft SQL Server而來,但只要是支持批量處理SQL指令的數據庫服務器,都有可能受到此種手法的攻擊。

原因
    在應用程序中若有下列狀況,則可能應用程序正暴露在SQL Injection的高風險情況下:


  • 在應用程序中使用字符串聯結方式組合SQL指令。
  • 在應用程序連結數據庫時使用權限過大的帳戶(例如很多開發人員都喜歡用sa(自帶的最高權限的系統管理員帳戶)連接Microsoft SQL Server數據庫)。
  • 在數據庫中開放了不必要但權力過大的功能(例如在Microsoft SQL Server數據庫中的xp_cmdshell延伸預存程序或是OLE Automation預存程序等)
  • 太過於信任用戶所輸入的數據,未限制輸入的字符數,以及未對用戶輸入的數據做潛在指令的檢查。

作用原理
  • SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字符爲不同命令的區別。(原本的作用是用於SubQuery或作爲查詢、插入、更新、刪除……等的條件式)
  • SQL命令對於傳入的字符串參數是用單引號字符所包起來。《但連續2個單引號字符,在SQL數據庫中,則視爲字符串中的一個單引號字符》
  • SQL命令中,可以注入註解《連續2個減號字符——後的文字爲註解,或“/*”與“*/”所包起來的文字爲註解》
  • 因此,如果在組合SQL的命令字符串時,未針對單引號字符作取代處理的話,將導致該字符變量在填入命令字符串時,被惡意竄改原本的SQL語法的作用。

例子
某個網站的登錄驗證的SQL查詢代碼爲
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
惡意填入
userName = "' OR '1'='1";
passWord = "' OR '1'='1";
時,將導致原本的SQL字符串被填爲
strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"
也就是實際上運行的SQL命令會變成下面這樣的
strSQL = "SELECT * FROM users;"
因此達到無帳號密碼,亦可登錄網站。所以SQL注入攻擊被俗稱爲黑客的填空遊戲。
可能造成的傷害
  • 數據表中的數據外泄,例如個人機密數據,帳戶數據,密碼等。
  • 數據結構被黑客探知,得以做進一步攻擊(例如SELECT * FROM sys.tables)。
  • 數據庫服務器被攻擊,系統管理員帳戶被竄改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
  • 取得系統較高權限後,有可能得以在網頁加入惡意連結以及XSS。
  • 經由數據庫服務器提供的操作系統支持,讓黑客得以修改或控制操作系統(例如xp_cmdshell "net stop iisadmin"可停止服務器的IIS服務)。
  • 破壞硬盤數據,癱瘓全系統(例如xp_cmdshell "FORMAT C:")。

避免的方法

  • 在設計應用程序時,完全使用參數化查詢(Parameterized Query)來設計數據訪問功能
  • 在組合SQL字符串時,先針對所傳入的參數作字符取代(將單引號字符取代爲連續2個單引號字符)。
  • 如果使用PHP開發網頁程序的話,亦可打開PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字符取代爲連續2個單引號字符)。
  • 其他,使用其他更安全的方式連接SQL數據庫。例如已修正過SQL注入問題的數據庫連接組件,例如ASP.NET的SqlDataSource對象或是 LINQ to SQL。
  • 使用SQL防注入系統

外部鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章