一 個 SQL Injection 實 例 的 啟 示 頁 1 / 6 你 的 網 站 在 裸 奔 嗎? 一 個 SQL Injection 實 例 的 啟 示 作 者 : 李 明 儒 SQL Injection( 資 料 隱 碼 攻 擊 ) 問 題 早 就 不 是 什 麼 新 聞, 但 前 陣 子 在 一 個 頗 具 知 名 度 的 活 動 網 站 上, 赫 然 發 現 它 大 刺 刺 地 現 身! 原 來, 只 要 程 式 人 員 的 一 個 疏 忽 ( 一 個 就 夠 了, 真 的!), 就 足 以 讓 任 何 網 站 的 安 全 防 線 瞬 間 瓦 解 門 戶 大 開 本 文 便 將 以 此 實 例 探 討 SQL Injection 所 可 能 衍 生 的 風 險 及 因 應 對 策 若 要 給 SQL Injection 下 個 定 義, 它 意 指 因 為 程 式 人 員 對 使 用 者 輸 入 資 料 的 驗 證 處 理 不 當, 致 使 有 心 人 可 透 過 輸 入 資 料 的 機 會, 在 輸 入 資 料 中 夾 帶 SQL 指 令, 以 達 到 竊 取 資 訊 篡 改 資 料 或 入 侵 系 統 等 惡 意 企 圖 關 於 SQL Injection 的 細 節 過 去 已 有 相 當 多 的 討 論, 在 此 不 多 著 墨 推 薦 幾 篇 不 錯 的 文 章, 作 為 實 例 探 討 前 的 背 景 知 識 基 礎 ( 請 見 參 考 資 料 1 2) 既 然 略 去 了 SQL Injection 的 基 本 介 紹, 本 文 將 以 案 例 所 曝 露 的 缺 失 及 如 何 改 善 作 為 探 討 重 點, 希 望 這 番 老 調 重 彈 能 再 次 突 顯 SQL Injection 問 題 的 嚴 重 性, 也 算 為 整 體 資 訊 安 全 環 境 的 提 升 進 分 心 力 ( 自 從 見 證 了 這 個 案 例 後, 我 已 開 始 每 天 祈 禱, 希 望 往 來 銀 行 的 所 有 資 訊 人 員 及 委 外 廠 商, 都 已 完 全 了 解 SQL Injection 的 風 險 並 隨 時 銘 記 在 心 ) 陰 魂 不 散 的 SQL Injection 很 少 有 資 安 問 題 會 像 SQL Injection 一 樣, 在 發 現 多 年 之 後, 依 然 能 三 不 五 時 來 個 奇 襲, 搞 得 一 群 人 雞 飛 狗 跳 若 諸 位 有 留 意 一 些 駭 客 入 侵, 竊 取 資 料 的 新 聞, 就 會 發 現 原 來 它 一 直 是 駭 客 們 的 最 佳 拍 檔, 不 曾 絕 跡 ( 例 如 : 大 考 中 心 的 資 安 事 件 http://mag.udn.com/mag/campus/storypage.jsp?f_art_id=11599 ) 近 年 來 會 鑽 系 統 漏 洞 的 病 毒 蠕 蟲 誕 生 速 度 愈 來 愈 快, 以 往 安 全 性 漏 洞 揭 露 後 幾 個 月 後 才 會 冒 出 依 附 該 漏 洞 的 惡 意 程 式, 到 現 在 幾 天 內 就 得 面 臨 大 軍 壓 境 的 危 機 但 是, 只 要 確 保 軟 體 修 補 及 防 毒 軟 體 更 新 的 即 時 性, 這 些 問 題 都 可 以 被 防 範 然 而 SQL Injection 問 題 最 神 妙 之 處 在 於 帶 原 者 是 人 而 非 程 式, 不 限 資 料 庫 廠 牌 程 式 語 言 開 發 工 具 作 業 平 台, 到 處 都 有 機 會 中 獎 而 我 們 無 法 以 防 火 牆 防 毒 軟 體 的 方 式 從 外 圍 防 堵, 也 不 能 比 照 軟 體 修 補 的 方 式, 讓 有 SQL Injection 問 題 的 程 式 師 在 一 夕 之 間 開 竅 尤 其 可 怕 的 是, 只 要 程 式 師 還 沒 有 建 立 正 確 的 觀 念, 隨 著 換 工 作 接 新 專 案, 問 題 會 呈 現 隨 機 式 傳 播 如 果 SQL Injection 的 帶 原 者 是 人, 那 麼 人 與 人 之 間 會 不 會 互 相 傳 染? 答 案 是 : 會 的! 過 去 看 過 不 少 有 SQL Injection 問 題 的 程 式 碼, 找 來 程 式 作 者 詢 問, 答 覆 常 常 是 : 程 式 碼 是 由 參 考 某 某 人 的 寫 法 如 果 沒 有 人 提 醒 他 其 中 隱 藏 的 風 險, 我 相 信 這 個 好 用 範 例 很 快 會 用 在 其 他 類 似 需 求 的 專 案 上, 然 後 很 不 幸 地 被 另 一 位 程 式 菜 鳥 學 去 用 天 哪! 又 一 個 天 真 無 邪 的 程 式 師 變 成 了 帶 原 者 帶 原 者 多 半 只 因 不 了 解 SQL Injection 的 嚴 重 性, 在 知 道 真 相 的 當 下, 震 撼 之 餘, 就 能 在 瞬 間 產 生 免 疫 力 說 到 這 裡, 不 禁 回 想 起 我 接 種 疫 苗 的 那 一 天 當 時, 我 還 是 個 天 真 無 邪 的 菜 鳥 程 式 師 在 一 個 研 討 會 中, 講 師 介 紹 了 SQL Injection, 並 打 趣 地 說, 在 竹 科 的 場 次, 講 完 這 一 段, 通 常 就 有 一 批 聽 眾 神 色 緊 張 地 衝 出 會 場, 趕 回 公 司 改 程 式 去 了 當 時, 台 下 的 我, 雖 然 克 制 住 打 道 回 公 司 的 衝 動, 但 接 連 而 來 的 是 三 天 少 吃 少 喝 少 睡 的 日 子, 將 過 去 做 過 專 案 裡 所 有 的 ASP VB COM 都 掃 過 一 次, 之 後 再 找 個 理 由 通 知 客 戶 要 更 新 程 式, 才 算 結 束 了 這 場 驚 魂 在 往 後 的 工 作 經 歷 中, 遇 過 許 多 程 式 人 員, 其 中 還 還 是 有 相 當 的 比 例 尚 未 對 SQL Injection 建 立 正 確 的 認 識
一 個 SQL Injection 實 例 的 啟 示 頁 2 / 6 因 此, 在 知 名 網 站 上 看 到 SQL Injection, 讓 人 驚 心, 卻 不 意 外 網 站 專 案 外 包 是 目 前 業 界 的 常 態, 而 在 價 格 取 勝 的 制 度 下, 低 價 得 標 的 SOHO 族 學 生 兼 職 族 是 否 對 功 能 可 以 正 常 執 行 以 外 的 知 識 有 所 涉 獵? 專 案 經 理 是 否 有 相 關 的 資 安 意 識? 更 不 要 提 逐 行 對 程 式 做 Code Review 是 唯 一 可 以 確 保 系 統 不 存 在 SQL Injection 問 題 的 方 法 ( 這 跟 Y2K 問 題 還 真 有 幾 分 神 似, 只 是 當 年 有 人 發 展 出 了 半 自 動 的 Y2K 問 題 掃 瞄 工 具 也 有 人 提 供 以 行 計 費 的 Code Review 服 務,SQL Injection 問 題 則 沒 有 這 方 面 的 選 擇 ) 稍 有 不 慎, 就 會 給 予 SQL Injection 可 趁 之 機 而 資 安 危 機 的 共 同 特 色 是, 一 處 漏 洞 與 一 百 處 漏 洞 的 結 局 相 同, 系 統 機 密 終 將 被 入 侵 者 一 覽 無 疑 接 著 我 們 就 將 重 點 回 歸 到 這 個 網 站 SQL Injection 漏 洞 的 實 例 探 討 上, 看 看 問 題 是 怎 麼 被 發 現 的 背 後 的 成 因 可 能 導 致 的 危 險 以 及 因 應 之 道 而 探 討 的 方 式, 會 將 問 題 成 因 對 策 三 者 放 在 一 起 討 論 由 於 我 們 的 重 點 在 於 SQL Injection 問 題 本 身, 無 意 對 該 網 站 的 資 訊 安 全 品 質 做 任 何 批 判, 因 此 雖 然 所 附 圖 例 都 擷 取 自 真 實 的 網 站 畫 面, 但 我 已 隱 藏 ( 馬 賽 克 囉!) 與 網 站 相 關 的 文 字 資 料, 程 式 參 數 名 稱 也 多 用 化 名, 以 免 徒 生 不 必 要 的 困 擾 問 題 怎 麼 被 發 現 的? 雖 然 我 常 以 骨 子 裡 流 著 駭 客 (Hacker, 不 是 Cracker) 的 血 液 自 傲, 但 也 沒 有 閒 到 三 不 五 時 流 連 各 大 網 站 找 碴, 四 處 找 漏 洞 鑽, 會 發 現 這 個 問 題, 純 屬 意 外 話 說 這 個 活 動 社 群 網 站 上 有 個 功 能, 點 選 文 章 發 表 者 上 的 連 結, 可 以 檢 視 其 個 人 基 本 資 料 它 採 取 的 是 類 似 UserInfo.asp?UserId=123 的 做 法, 例 如 : 123 是 會 員 的 流 水 號 但 是 因 程 式 沒 寫 好,UserId 未 正 確 帶 出, 因 此 變 成 了 UserInfo.asp?UserId= 可 以 想 見,ASP 抓 到 的 UserId 參 數 將 是 空 值, 而 網 頁 則 顯 示 了 以 下 的 錯 誤 訊 息 : ( 如 圖 1) 圖 1 因 UserId 參 數 不 當 而 顯 示 的 錯 誤 訊 息 網 頁 有 SQL Injection 經 驗 的 老 鳥 看 到 這 行 訊 息, 就 像 鯊 魚 聞 到 血 睲 味 一 樣 ; 單 憑 這 則 訊 息 就 可 以 斷 定 網 站 存 在 SQL Injection 問 題, 接 下 來 便 是 大 顯 身 手 的 時 刻 了 至 此, 我 們 發 現 了 幾 個 問 題 : 問 題 1 在 產 生 查 詢 發 表 者 個 人 資 料 的 連 結 上, 未 確 實 代 入 使 用 者 代 號, 造 成 傳 入 參 數 不 正 確, 進 而 導 致 程 式 錯 誤 程 式 人 員 疏 忽, 程 式 碼 不 正 確, 而 測 試 人 員 也 未 抓 出 此 一 明 顯 錯 誤 應 落 實 專 案 管 理 要 求, 在 驗 收 上 線 前 對 系 統 各 功 能 進 行 完 整 的 測 試
一 個 SQL Injection 實 例 的 啟 示 頁 3 / 6 問 題 2 UserInfo.asp 程 式 未 對 參 數 做 檢 查, 進 而 導 致 了 資 料 庫 存 取 的 執 行 錯 誤 UserInfo.asp 應 先 對 輸 入 的 UserId 參 數 做 檢 查, 當 它 不 是 數 字 或 為 空 值 時, 根 本 不 需 查 詢 資 料 庫 理 論 上, 既 然 是 要 查 詢 某 個 人 員 的 基 本 資 料, 就 不 該 接 受 沒 有 指 定 UserId 未 指 定 的 情 境, 應 顯 示 參 數 不 正 確 的 例 外 可 在 UserInfo.asp 加 入 以 下 的 參 數 檢 查 程 式 碼 : Dim struserid struserid=request( UserId ) If (struserid= Or Not IsNumeric(strUserId)) Then Response.Write UserId 參 數 不 正 確! Response.End End If 問 題 3 由 錯 誤 訊 息 中, 惡 意 使 用 者 可 以 獲 取 許 多 珍 貴 的 情 報 圖 1 至 少 就 揭 露 了 以 下 幾 條 線 索 : 1. 程 式 使 用 ODBC 方 式 連 上 SQL Server 2. 程 式 透 過 共 用 的 ASP 程 式 (Connect.asp) 連 結 資 料 庫 3. 程 式 直 接 將 UserId 接 在 SQL 指 令 中, 且 沒 有 外 括 單 引 號 當 UserId 為 空 字 串 時, 會 組 出 SELECT FROM UserInfoTableName WHERE UserId= 的 不 完 整 指 令, 形 成 = 附 近 的 語 法 不 正 確 錯 誤 由 於 參 雜 系 統 情 報 的 錯 誤 訊 息 會 顯 示 在 使 用 者 的 瀏 覽 器 上, 後 續 當 駭 客 要 進 一 步 探 索 更 多 的 資 料 庫 資 訊 時, 也 可 透 過 顯 示 在 網 頁 上 的 錯 誤 訊 息 傳 回 程 式 未 自 訂 錯 誤 訊 息 頁 面, 而 將 原 始 的 錯 誤 訊 息 細 節 傳 回 給 一 般 使 用 者 由 於 錯 誤 訊 息 中 常 會 透 露 許 多 系 統 及 程 式 的 細 節, 在 開 發 測 試 階 段, 這 些 資 訊 有 助 於 Debug; 在 系 統 上 線 後, 卻 變 成 駭 客 蒐 集 系 統 情 報 的 重 要 管 道 因 此, 在 正 式 上 線 後, 最 好 善 用 IIS 設 定 客 製 化 錯 誤 訊 息 或 ASP.NET web.config 中 CustomError 設 定, 對 一 般 使 用 者 隱 藏 錯 誤 的 細 節 資 訊 看 網 站 裸 奔 由 這 個 SQL Injection 的 發 生 位 置 來 看,URL 中 所 輸 入 的 UserId 參 數 被 用 在 使 用 者 個 人 資 訊 的 資 料 表 查 詢 SQL 中, 而 這 個 資 料 表 最 令 人 感 興 趣 的 欄 位 莫 過 於 密 碼 了 於 是 我 們 在 URL 上 調 整 一 下, 就 可 以 把 UserInfo.asp 當 成 一 個 功 能 受 限 的 SQL Query Analyzer 使 用 ; 故 意 製 造 錯 誤, 再 由 錯 誤 訊 息 中 獲 得 情 報 參 考 資 料 1 的 文 章 介 紹 了 透 過 加 註 HAVING 1=1 的 做 法 逐 一 查 出 欄 位 名 稱, 再 使 用 UNION 技 巧 將 我 們 需 要 的 資 料 偽 裝 成 為 原 本 要 查 詢 的 欄 位 傳 回 但 我 意 外 發 現, 由 於 SQL 錯 誤 訊 息 的 貼 心 設 計, 讓 我 們 能 更 簡 單 地 將 密 碼 取 回 方 法 是 這 樣 的, 首 先 我 們 要 先 猜 想 密 碼 欄 位 名 稱, 一 般 不 外 乎 pass passwd 或 是 password 於 是 我 們 用 UserInfo.asp?UserId=1+AND+Password=1 讓 組 成 的 SQL 變 成 SELECT FROM UserInfoTableName
一 個 SQL Injection 實 例 的 啟 示 頁 4 / 6 WHERE UserId=1 AND Password=1, 其 中 故 意 夾 帶 一 個 錯 誤 由 於 Password 欄 位 多 半 會 以 varchar 類 別 保 存, 當 我 們 要 求 與 數 字 1 比 對 時,SQL Server 很 聰 明 地 提 供 了 自 動 將 varchar 轉 換 成 int 的 功 能, 若 轉 換 失 敗 時 還 會 貼 心 地 會 顯 示 字 串 內 容 解 釋 轉 換 失 敗 的 理 由 ( 如 圖 2 所 示 ) 哦 哦! 使 用 者 密 碼 也 被 貼 心 地 夾 帶 在 錯 誤 訊 息 中, 交 給 了 有 心 人 圖 2 因 為 轉 型 失 敗, 密 碼 欄 位 內 容 被 顯 示 錯 誤 訊 息 中 循 著 這 個 資 訊 漏 洞, 配 合 會 員 清 單 網 頁, 有 心 人 可 以 寫 個 程 式 試 遍 所 有 會 員 編 號, 為 會 員 清 單 補 上 密 碼 欄 位 當 網 站 系 統 最 重 要 的 機 密 被 一 覽 無 疑, 跟 脫 光 衣 服 在 街 上 裸 奔 沒 啥 兩 樣 ; 更 要 命 的 是 網 站 管 理 員 程 式 開 發 人 員 企 業 主 在 此 刻 往 往 還 渾 然 不 覺 問 題 4 UserInfo.asp 將 使 用 者 輸 入 的 資 料 未 經 檢 核 處 理 就 附 加 成 為 SQL 指 令 的 一 部 分, 這 就 是 大 名 鼎 鼎 的 SQL Injection( 資 料 隱 碼 ) 漏 洞 由 錯 誤 訊 息 來 看,UserInfo.asp 應 是 以 strsql= SELECT FROM UserInfoTableNameWHERE UserId= & Request( UserId ) 的 方 式 直 接 組 成 SQL 指 令, 讓 入 侵 者 連 處 理 單 引 號 的 功 夫 都 省 了 在 程 式 設 計 指 南 中, 動 態 決 定 SQL 指 令 的 方 法 有 兩 種 : 一 種 是 以 Ad-Hoc 方 式 組 合 出 SQL 指 令 字 串, 另 一 種 則 是 將 動 態 變 化 部 分 以 參 數 (Parameter) 方 式 傳 入, 例 如 : ADO 及 ADO.NET 裡 的 Command 物 件 均 有 Parameters 集 合 屬 性 一 般 會 建 議 使 用 後 者, 理 由 是 物 件 內 建 了 字 串 的 處 理 轉 換 功 能, 二 則 是 資 料 庫 不 必 每 次 重 新 解 析 編 譯 SQL 指 令, 對 效 能 也 有 所 助 益 寫 法 如 下 : ( 以 ADO.NET 為 例 ) SqlCommand cmd=new SqlCommand( SELECT FROM UserInfoTableNameWHERE UserId=@UserId,cn); cmd.parameters.add( @UserId,SqlDbType.VarChar).Value=Request[ UserId ]; 而 Ad-Hoc 式 的 動 態 SQL 指 令 字 串 並 非 完 全 不 能 用, 在 某 些 場 合 中, 它 的 確 是 較 便 捷 有 效 率 的 做 法, 只 是 在 使 用 時, 務 必 要 加 強 對 使 用 者 輸 入 的 資 料 的 檢 核 以 這 個 案 例 來 看, 由 於 UserId 被 設 定 是 純 數 字, 因 此 在 SQL 語 法 中 不 必 使 用 單 引 號, 但 是 由 於 Query String 傳 入 的 都 是 字 串 型 態, 它 有 可 能 是 空 字 串, 也 可 能 是 非 數 字, 因 此 較 嚴 謹 的 做 法 是 使 用 VB 的 IsNumeric 或 Regular Expression 檢 查 該 字 串 是 否 為 合 法 的 數 字 若 參 數 欄 位 的 類 別 是 (n)char (n)varchar 或 (n)text, 則 在 組 合 SQL 時, 要 記 得 用 單 引 號 將 參 數 內 容 字 串 夾 起 來, 並 要 留 意 參 數 內 容 中 包 含 單 引 號 時 的 特 別 處 理, 以 免 組 出 的 語 法 不 合 規 定 或 被 稙 入 惡 意 SQL 指 令 一 般 來 說, 用 以 下 的 寫 法 將 字 串 中 的 單 引 號 置 換 成 兩 個 單 引 號 即 可 : ( 以 ASP 為 例 ) strsql= SELECT FROM YourTableName WHERE TheField= & Replace(Request( UserInput ),, ) &
一 個 SQL Injection 實 例 的 啟 示 頁 5 / 6 問 題 5 使 用 者 可 透 過 查 詢 資 料 庫 取 得 密 碼 內 容 Password 欄 位 未 使 用 加 密 或 用 雜 湊 值 (Hash) 保 護, 導 致 有 心 人 可 由 資 料 庫 中 所 儲 存 的 欄 位 內 容 取 得 密 碼 其 中 使 用 雜 湊 值 又 比 加 密 法 更 安 全 一 些, 即 便 駭 客 已 掌 握 雜 湊 演 算 法, 也 無 法 由 欄 位 內 容 反 推 密 碼 針 對 密 碼 欄 位, 可 使 用 DES 甚 至 RSA 等 加 密 演 算 法 或 是 SHA1 MD5 等 常 用 的 雜 湊 值 取 代 密 碼 明 碼 儲 存 於 資 料 庫 中, 如 此 可 減 少 因 資 料 庫 內 容 外 洩 衍 生 的 風 險 還 會 發 生 什 麼 事? 雖 然 見 識 到 包 含 SQL Injection 漏 洞 的 知 名 網 站 讓 人 興 奮, 但 我 無 意 扮 演 駭 客 或 藉 著 入 侵 系 統 獲 利, 在 發 了 封 Mail 通 知 網 站 管 理 人 員 後, 對 該 網 站 的 邪 惡 測 試 就 此 打 住 ( 當 然, 多 少 得 壓 抑 滿 腔 的 熱 血 與 蠢 蠢 欲 動 的 雙 手 ) 然 而, 如 果 今 天 發 現 漏 洞 的 是 個 有 心 人, 後 面 還 會 有 多 少 故 事 呢? 1. 如 果 ASP 連 線 用 的 SQL 帳 號 有 dbo 權 限 入 侵 者 可 以 蒐 集 到 完 整 的 資 料 庫 情 報 (Table Schema), 列 出 所 有 的 資 料 表, 從 中 擷 取 更 有 價 值 的 資 料 ; 或 是 DELETE FROM TABLE DROP TABLE, 惡 搞 一 番 也 很 過 癮 2. 如 果 ASP 連 線 用 的 SQL 帳 號 是 sa 一 旦 取 得 sa 的 權 限, 可 玩 的 花 樣 就 更 多 了 : 可 以 呼 叫 SQL Server 的 特 殊 Stored Procedure, 執 行 DOS 指 令 讀 寫 Registry 將 Web Server 上 的 檔 案 打 包 傳 出 來, 或 是 刪 改 網 頁 內 容 再 不 然 稙 入 木 馬 程 式, 綁 架 伺 服 器 作 為 其 他 邪 惡 計 劃 的 根 據 地 亦 相 當 刺 激 以 上 這 些 狀 況, 絕 對 是 網 管 人 員 程 式 人 員 與 企 業 主 的 夢 魘, 而 問 題 的 源 頭, 只 因 為 區 區 一 行 程 式 沒 寫 好, 再 加 上 資 料 庫 帳 號 的 不 當 授 權, 當 場 萬 刧 不 復! ( 在 我 的 經 驗 中, 用 sa 當 成 程 式 資 料 庫 連 線 帳 號 的 朋 友 還 真 不 少!!) 2008 更 新 補 充 最 近 見 識 過 一 些 新 的 SQL Injection 攻 擊 概 念 傳 統 印 象 中,SQL Injection 要 設 法 取 得 欄 位 名 稱 訊, 以 偷 出 資 料 或 從 事 破 壞 為 樂 但 是 要 進 行 這 些 操 作, 通 常 得 仰 賴 網 站 傳 回 錯 誤 訊 息 的 細 節 才 能 提 供 繼 續 深 入 的 情 報 近 年 來, 很 多 網 站 預 設 都 已 開 啟 Custom Error Page, 讓 手 工 操 作 入 侵 的 難 度 變 高, 但 並 不 代 表 開 啟 隱 藏 錯 誤 訊 息 就 可 以 高 枕 無 憂 不 過, 也 開 發 現 一 些 新 的 攻 擊 趨 勢 : 1. 駭 客 圈 已 流 傳 一 些 現 成 的 SQL 注 入 工 具, 裡 面 已 針 對 ORACLE SQL MySQL Access 等 各 家 資 料 庫 寫 好 預 設 的 多 組 測 試 Script, 不 需 要 耐 性 過 人 也 不 必 做 苦 工, 交 給 工 具 快 速 試 過 一 輪 即 可 輕 鬆 得 手 再 配 合 Google 找 尋 獵 物, 亂 槍 打 鳥 之 下, 就 算 你 的 網 站 沒 什 麼 名 氣 都 可 能 中 鏢 2. 除 了 有 心 駭 客 設 法 要 破 解 網 站 盜 取 資 訊, 還 有 一 種 打 遊 擊 式 的 SQL Injection 攻 擊, 把 全 部 的 攻 擊 指 令 縮 成 一 行 QueryString, 四 處 亂 試 主 機, 成 功 就 爽 到, 失 敗 了 不 過 浪 費 幾 百 個 Bytes 的 頻 寬, 是 穩 賺 不 賠 的 生 意 而 攻 擊 指 令 是 假 設 資 料 庫 的 內 容 會 被 當 成 HTML 顯 示 在 網 站 上, 所 以 只 要 找 出 SQL 資 料 庫 中 所 有 的 varchar, nvarchar, ntext, text 欄 位, 在 後 方 加 上 一 段 <script src= 用 來 載 入 木 馬 的 js 檔 案 >, 就 可 以 將 網 站 當 成 感 染 源, 達 到 廣 種 木 馬 的 目 標 ( 這 類 木 馬 的 原 理 可 以 參 考
一 個 SQL Injection 實 例 的 啟 示 頁 6 / 6 http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/01/816.aspx, 通 常 只 要 勤 做 Windows Update 並 避 免 執 行 來 路 不 明 的 程 式 就 可 避 免 ) 結 論 在 SQL Injection 問 題 開 始 被 重 視 的 數 年 後, 依 然 能 在 實 務 網 站 上 與 它 不 期 而 遇, 興 奮 之 餘 也 有 幾 份 擔 憂, 不 禁 想 問,Internet 上 還 有 多 少 網 站 是 不 安 全 的? 會 不 會 有 我 的 身 家 資 料 就 存 放 其 中? 但 願 這 篇 文 章 多 少 能 突 顯 出 它 的 威 脅 性 及 潛 在 風 險, 有 助 於 減 少 類 似 的 情 境 再 度 上 演 最 後, 針 對 SQL Injection 的 防 範, 整 理 幾 則 設 計 網 站 時 的 注 意 事 項 : 1. 在 正 式 環 境 中, 善 用 客 製 化 錯 誤 訊 息 的 功 能, 避 免 將 錯 誤 訊 息 的 細 節 直 接 傳 送 給 使 用 者, 以 免 系 統 架 構 情 報 外 洩 2. 千 萬 不 要 信 任 使 用 者 所 輸 入 的 任 何 資 料, 每 一 個 輸 入 機 會 都 可 能 為 駭 客 所 用, 成 為 傳 入 惡 意 指 令 的 管 道 如 果 要 將 其 融 合 為 指 令 的 一 部 分, 必 須 在 格 式 驗 證 上 加 倍 小 心 3. 減 少 組 裝 SQL 指 令 字 串 (Ad-Hoc SQL) 的 程 式 設 計 方 式, 以 減 少 發 生 SQL Injection 的 風 險 改 用 Parameter 方 式 傳 入 動 態 參 數, 還 兼 有 提 升 效 能 的 好 處 4. 在 資 料 庫 帳 號 的 應 用 管 理 上, 避 免 過 度 授 權, 尤 其 sa 帳 號 實 在 沒 理 由 當 成 網 站 的 連 線 身 分, 授 與 連 線 帳 號 的 權 限 要 愈 少 愈 好, 以 勉 強 能 維 持 正 常 作 業 為 最 佳 參 考 資 料 參 考 資 料 1 - SQL Injection ( 資 料 隱 碼 ) 駭 客 的 SQL 填 空 遊 戲 http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm 參 考 資 料 2 - 資 料 隱 碼 SQL Injection 的 因 應 與 防 範 之 道 http://www.microsoft.com/taiwan/sql/sql_injection.htm