SQL資料隱碼攻擊

维基百科,自由的百科全书
跳转至: 导航搜索

SQL攻擊(SQL injection,中国大陆称作SQL注入攻击,台湾称作SQL资料隐码攻击),简称隱碼攻擊,是發生於應用程式之資料庫層的安全漏洞。簡而言之,是在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞。

有部份人認為SQL隱碼攻擊是只針對Microsoft SQL Server而來,但只要是支援批次處理SQL指令的資料庫伺服器,都有可能受到此種手法的攻擊。

原因[编辑]

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

  1. 在應用程式中使用字串聯結方式組合SQL指令。
  2. 在應用程式連結資料庫時使用權限過大的帳戶(例如很多開發人員都喜歡用sa(內建的最高權限的系統管理員帳戶)連接Microsoft SQL Server資料庫)。
  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. 取得系統較高權限後,有可能得以在網頁加入惡意連結以及XSS
  5. 經由資料庫伺服器提供的作業系統支援,讓駭客得以修改或控制作業系統(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服務)。
  6. 破壞硬碟資料,癱瘓全系統(例如xp_cmdshell "FORMAT C:")。

避免的方法[编辑]

  1. 在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。
  2. 在組合SQL字串時,先針對所傳入的參數作字元取代(將單引號字元取代為連續2個單引號字元)。
  3. 如果使用PHP開發網頁程式的話,亦可開啟PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字元取代為連續2個單引號字元)。
  4. 其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL資料隱碼問題的資料庫連接元件,例如ASP.NET的SqlDataSource物件或是 LINQ to SQL。
  5. 使用SQL防注入系统。

外部連結[编辑]


数据库管理系统(DBMS) (查看 · 讨论 · 编辑)

概念
数据库 · 数据模型 · 数据库存储结构英语Database storage structures · 关系 (数据库) · 关系模型 · 分布式数据库 · ACID ( 原子性英语Atomicity (database systems) · 一致性 · 隔離性 · 持久性英语Durability (database systems) ) · Null值
关系数据库 · 关系模型 · 数据库规范化 · 數據庫完整性 · 實體完整性 · 參照完整性英语Referential integrity · 关系数据库管理系统 
主键 · 外键 · 代理键 · 超键 · 候选键 

数据库组件
触发器 · 视图 · 数据库表 · 指标 (数据库) · 事务日志英语Transaction log · 数据库事务 · 并发控制 · 乐观锁 · 悲观锁 · 数据库索引 
存储程序 · 資料庫分割

SQL
分类: 数据查询语言 (DQL) - 資料定義語言 (DDL) - 資料操縱語言 (DML) - 資料控制語言 (DCL)
指令:SELECT · INSERT · UPDATE · MERGE · DELETE · JOIN · UNION · CREATE · DROP · Begin work · COMMIT · ROLLBACK · TRUNCATE · ALTER
安全: SQL資料隱碼攻擊 · 參數化查詢

数据库管理系统的实现

实现类型
关系数据库 · 檔案型資料庫 · Deductive · 維度化資料庫 · 階層式 · 圖形資料庫 · 对象数据库 · 物件關聯式資料庫 · Temporal · XML資料庫

数据库产品
对象型 (对比) · 关系型 (对比)

数据库组件
数据查询语言 · 查詢最佳化器 · 查詢計畫 · 嵌入式SQL · ODBC · JDBC · OLE DB