SQL注入(),也稱SQL隱碼或SQL注碼,是發生於應用程式與資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了字元檢查,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。
原因
上的一幅漫画。该学生的姓名为“”,导致students表被删除。]]
在應用程式中若有下列狀況,則可能應用程式正暴露在SQL Injection的高風險情況下:
在應用程式中使用字串聯結方式或聯合查詢方式組合SQL指令。
在應用程式連結資料庫時使用權限過大的帳戶(例如很多開發人員都喜歡用最高權限的系統管理員帳戶(如常见的root,sa等)連接資料庫)。
在資料庫中開放了不必要但權力過大的功能(例如在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 = "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注入被俗稱為駭客的填空遊戲。
可能造成的傷害
資料表中的資料外洩,例如企業及個人機密資料,帳戶資料,密碼等。
資料結構被駭客探知,得以做進一步攻擊(例如SELECT * FROM sys.tables)。
資料庫伺服器被攻擊,系統管理員帳戶被竄改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
取得系統較高權限後,有可能得以在網頁加入惡意連結、惡意代碼以及Phishing等。
經由資料庫伺服器提供的作業系統支援,讓駭客得以修改或控制作業系統(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服務)。
攻击者利用数据库提供的各种功能操纵文件系统,写入Webshell,最终导致攻击者攻陷系统
破壞硬碟資料,癱瘓全系統(例如xp_cmdshell "FORMAT C:")。
取得系統最高權限後,可針對企業內部的任一管理系統做大規模破壞,甚至讓其企業倒閉。
網站首頁被竄改,导致声誉受到损害。
避免的方法
在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。
在組合SQL字串時,先針對所傳入的參數加入其他字元(將單引號字元前加上跳脫字元)。
如果使用PHP開發網頁程式的話,需加入跳脫字元之功能(自動將所有的網頁傳入參數,將單引號字元前加上跳脫字元)。
使用php開發,可寫入html特殊函式,可正確阻擋XSS攻擊。
其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL注入問題的資料庫連接元件,例如ASP.NET的SqlDataSource物件或是 LINQ to SQL。
增強網頁應用程式防火牆的防禦力
歷史
有關SQL注入的首次公開討論始於1998年左右。例如,中的1998年文章。
参考文献
外部連結
- [https://web.archive.org/web/20120429034040/http://security.ccidnet.com/art/1099/20060918/902693_1.html 賽迪網-存儲過程之外:SQL注入深入防禦]
- [http://msdn2.microsoft.com/zh-tw/library/ms161953.aspx MSDN 的SQL資料注入概述]
- [http://msdn.microsoft.com/zh-cn/library/ms161953.aspx MSDN 的 SQL 注入概述]
- [http://www.4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2F061902-1.shtml Protecting yourself from SQL Injection Attacks] by Ross Overstreet
- "[http://citeseer.ist.psu.edu/641328.html SQLrand: Preventing SQL Injection Attacks]" by Stephen W. Boyd and Angelos D. Keromytis
- "[http://www.cgisecurity.com/questions/sql.shtml What is SQL Injection?]" By CGISecurity.com
- "[http://www.cgisecurity.com/questions/blindsql.shtml What is Blind SQL Injection?]" By CGISecurity.com
- [https://web.archive.org/web/20060717225700/http://www.windowsitpro.com/Article/ArticleID/46379/46379.html Avoid SQL injection]
- PHP and SQL Injections
- [http://www.sandaru1.com/?p=10 SQL Injection in Login Forms]
- [https://xkcd.com/327/ xkcd上以SQL注入为主题的漫画]
评论 (0)