SQL注入
代碼注入軟件漏洞的類型
SQL注入(英語:SQL injection),也稱SQL隱碼或SQL注碼,是發生於應用程式與資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了字元檢查,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。[2]
「SQL注入」的各地常用名稱 | |
---|---|
中国大陸 | SQL注入 |
臺灣 | SQL注入、SQL隱碼、SQL注碼[1] |
有部份人認為SQL注入是只針對Microsoft SQL Server,但只要是支援處理SQL指令的資料庫伺服器,都有可能受到此種手法的攻擊。
原因编辑
在應用程式中若有下列狀況,則可能應用程式正暴露在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:")。
- 取得系統最高權限後,可針對企業內部的任一管理系統做大規模破壞,甚至讓其企業倒閉。
- 網站首頁被竄改,导致声誉受到损害。
避免的方法编辑
歷史编辑
参考文献编辑
- ^ 國家教育研究院雙語詞彙、學術名詞暨辭書資訊網
- ^ Microsoft. SQL Injection. [2013-08-04]. (原始内容存档于2013-08-02).
SQL injection is an attack in which malicious code is inserted into strings that are later passed to an instance of SQL Server for parsing and execution. Any procedure that constructs SQL statements should be reviewed for injection vulnerabilities because SQLi Server will execute all syntactically valid queries that it receives. Even parameterized data can be manipulated by a skilled and determined attacker.
- ^ 存档副本. [2016-12-16]. (原始内容存档于2016-12-17).
- ^ Sean Michael Kerner. How Was SQL Injection Discovered? The researcher once known as Rain Forrest Puppy explains how he discovered the first SQL injection more than 15 years ago.. November 25, 2013 [2020-05-29]. (原始内容存档于2014-03-18).
- ^ Jeff Forristal (signing as rain.forest.puppy). NT Web Technology Vulnerabilities. Phrack Magazine. Dec 25, 1998, 8 (54 (article 8)) [2020-05-29]. (原始内容存档于2014-03-19).
外部連結编辑
- 賽迪網-存儲過程之外:SQL注入深入防禦(繁體中文)
- MSDN 的SQL資料注入概述(页面存档备份,存于互联网档案馆)(繁體中文)
- MSDN 的 SQL 注入概述(页面存档备份,存于互联网档案馆)(简体中文)
- Protecting yourself from SQL Injection Attacks(页面存档备份,存于互联网档案馆) by Ross Overstreet(英文)
- "SQLrand: Preventing SQL Injection Attacks(页面存档备份,存于互联网档案馆)" by Stephen W. Boyd and Angelos D. Keromytis(英文)
- "What is SQL Injection?(页面存档备份,存于互联网档案馆)" By CGISecurity.com(英文)
- "What is Blind SQL Injection?(页面存档备份,存于互联网档案馆)" By CGISecurity.com(英文)
- Avoid SQL injection(英文)
- PHP and SQL Injections(英文)
- SQL Injection in Login Forms(页面存档备份,存于互联网档案馆)(英文)
- xkcd上以SQL注入为主题的漫画(页面存档备份,存于互联网档案馆)(英文)
🔥 Top keywords: Baike: 首页Special:搜索美国护照胖猫跳江事件背着善宰跑九龍城寨之圍城塞尔维亚淚之女王逆天奇案2璩静Energy (組合)习近平匈牙利邊佑錫洪若潭命案神耆小子金智媛新生 (网络剧)劉俊謙 (香港)金秀賢 (男演員)支配物种六四事件九龍寨城庆余年郭葦昀徐巧芯Seventeen (組合)猩球崛起:王國誕生陳政忠家族榮耀之繼承者TripleS願榮光歸香港不夠善良的我們李志金惠奫母亲节彭丽媛何塞盧张维为馴鹿寶貝春色寄情人习明泽稻草人論證中华人民共和国中華民國PSG Talon排球少年!!角色列表福建號航空母艦欧洲冠军联赛BOYNEXTDOOR破墓我獨自升級排球少年!!笑看風雲張書偉黃道十二宮怪獸8號香港歌手2024篠崎泫劉偉健與鳳行2024年英雄联盟季中邀请赛BABYMONSTER謝坤達ILLIT葉乃文五月天蕭景鴻虽然不是英雄WIND BREAKER—防風少年—我的婆婆怎麼那麼可愛為美好的世界獻上祝福!日本杰伦·布伦森張員瑛打天下2赵露思猿人爭霸戰:猩凶革命草榴社区IVE (組合)張文傑南斯拉夫葬送的芙莉蓮迷宮飯唐振剛Baike: 分類索引伍允龍芳明館逆天奇案承欢记李到晛毛泽东文化大革命林峯亞歷山大·武契奇耶穌升天節羅毓儀搜查班長1958