SQL注入(英語:SQL injection),也稱SQL隱碼SQL注碼,是發生於應用程式與資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了字元檢查,那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞或是入侵。[2]

「SQL注入」的各地常用名稱
中國大陸SQL注入
臺灣SQL注入、SQL隱碼、SQL注碼[1]

原因

编辑
 
Xkcd上的一幅漫画。该学生的姓名为“Robert'); DROP TABLE students;--”,导致students表被删除。[3]

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

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

作用原理

编辑
  1. SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字元為不同命令的區別。(原本的作用是用於SubQuery或作為查詢、插入、更新、刪除......等的條件式)
  2. SQL命令對於傳入的字串參數是用單引號字元所包起來。(但連續2個單引號字元,在SQL資料庫中,則視為字串中的一個單引號字元)
  3. SQL命令中,可以夾帶註解(連續2個減號字元 -- 後的文字為註解,或“/*”與“*/”所包起來的文字為注解)
  4. 因此,如果在組合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注入被俗稱為駭客的填空遊戲。

可能造成的傷害

编辑
  1. 資料表中的資料外洩,例如企業及個人機密資料,帳戶資料,密碼等。
  2. 資料結構被駭客探知,得以做進一步攻擊(例如SELECT * FROM sys.tables)。
  3. 資料庫伺服器被攻擊,系統管理員帳戶被竄改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
  4. 取得系統較高權限後,有可能得以在網頁加入惡意連結、惡意代碼以及Phishing等。
  5. 經由資料庫伺服器提供的作業系統支援,讓駭客得以修改或控制作業系統(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服務)。
  6. 攻击者利用数据库提供的各种功能操纵文件系统,写入Webshell,最终导致攻击者攻陷系统
  7. 破壞硬碟資料,癱瘓全系統(例如xp_cmdshell "FORMAT C:")。
  8. 取得系統最高權限後,可針對企業內部的任一管理系統做大規模破壞,甚至讓其企業倒閉。
  9. 網站首頁被竄改,导致声誉受到损害。

避免的方法

编辑
  1. 在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。
  2. 在組合SQL字串時,先針對所傳入的參數加入其他字元(將單引號字元前加上跳脫字元)。
  3. 如果使用PHP開發網頁程式的話,需加入跳脫字元之功能(自動將所有的網頁傳入參數,將單引號字元前加上跳脫字元)。
  4. 使用php開發,可寫入html特殊函式,可正確阻擋XSS攻擊。
  5. 其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL注入問題的資料庫連接元件,例如ASP.NET的SqlDataSource物件或是 LINQ to SQL。
  6. 增強網頁應用程式防火牆的防禦力

歷史

编辑

有關SQL注入的首次公開討論始於1998年左右。[4]例如,Phrack Magazine英语Phrack Magazine中的1998年文章。[5]

参考文献

编辑
  1. ^ 國家教育研究院雙語詞彙、學術名詞暨辭書資訊網
  2. ^ 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. 
  3. ^ Exploits of a Mom. xkcd. [2025-03-27]. 
  4. ^ 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). 
  5. ^ Jeff Forristal (signing as rain.forest.puppy). NT Web Technology Vulnerabilities. Phrack Magazine英语Phrack Magazine. Dec 25, 1998, 8 (54 (article 8)) [2020-05-29]. (原始内容存档于2014-03-19). 

外部連結

编辑

📚 Artikel Terkait di Wikipedia

SQL

'1'='1),讓該字串形成的邏輯判斷永遠為真,或直接取得非查詢條件的資料,而不需要知道密碼,以達成非法登入系統的目的,此種攻擊手法稱為SQL注入(SQL injection)。 目前實務上較有效的防禦方法,就是全面改用參數化查詢。 SQL:2023 is out. 2023年6月1日 [2023年6月26日].  Paul, Ryan

代碼注入

代碼注入(英語:Code injection)是因處理無效數據的而引發的程序錯誤。代碼注入可被攻擊者用來導入代碼到某特定的電腦程式,以改變程式的執行進程或目的。代碼注入攻擊的結果可以是災難性的。例如說:代碼注入可作為許多電腦蠕蟲繁殖的溫床。 舉例說,有一間公司的網頁伺服器上有一個簽名簿的程式碼,用來讓用戶發表簡短的口信,例如:

Entity Framework Core

Framework Core 支援下列資料提供者 : SQL Server SQLite In-Memory (記憶體內資料庫),可供不需要存取到關聯性資料庫的測試工作。 PostgreSQL SQL Server Compact IBM 資料庫伺服器 MySQL Entity Framework Core

行为驱动开发

愿景他们需要完成的目标。例如,法务部门可能要求某些监管要得到满足。市场营销负责人可能要参加将使用该软件的用户的社区。安全专家需要确保该软件不会受到SQL注入的攻击。 通过这些目标,会定义出要实现这些目标所需要的大概的题目(theme)或者特性集合。例如,“允许用户排序贡献值”或“交易审计”。

XML外部实体攻击

validation)或忽略文档类型定义中系统标识符部分的数据。因此,管理员应配置XML处理器使用本地静态文件类型定义,并禁止XML文档中所声明的定义。 SQL注入 SQL盲注 What Are XML External Entity (XXE) Attacks. Acunetix. [2019-09-02].

闪存

NOR Flash可以製作成立體結構,但尚未量產。 与非门闪存(NAND閘快取記憶體)利用穿隧注入(英语:Tunnel injection)寫入,以及穿隧釋放(Tunnel release)抹除。NAND Flash在隨身碟、記憶卡與固態硬碟上都可看到。

ASP.NET Core

"{controller=Home}/{action=Index}/{id?}"); }); } ASP.NET Core 核心內建了基本的相依注入 (Dependency Injection) 能力,這意味著 ASP.NET Core 應用程式具有更強的擴充能力,連帶的如 ASP.NET Core MVC (ASP.NET Core