網站安全🔒 一次看懂 SQL Injection 的攻擊原理 — 「雍正繼位之謎」

Jayden Lin
程式猿吃香蕉
Published in
Dec 3, 2018

筆者任職 Yahoo ,《經典駭客攻擊教程:給每個人的網站安全入門》線上課程講師 ,粉絲團《程式猿吃香蕉🍌

image from officialhacker.com

Injection 是一種駭客常用的攻擊概念,透過注入惡意的程式碼的方式,破壞原本程式碼的語意,來達到攻擊的效果,本為也會以「雍正繼位之謎」的李歷史故事,幫助大家了解這類注入攻擊的原理。

(如果讀者不介意的話,建議可以直接看我課程的免費試看影片:SQL Injection 的原理以及常見的攻擊手法,只是需要註冊會員,還請海涵)

Injection 概念說明

為了方便大家了解,在中文中,也有類似這種 Injection 的概念。例如,稗官野史中,曾提到清朝雍正(當時為四皇子)串改康熙的遺詔,將:

傳位四子

改為

傳位四子

在「十」上面加上一撇,變成「于」,串改原本的語意。

又例如,在 PTT 的推文留言中,有些網友會故意截斷別人的留言,造成語意的改變。

→ swearwin    :因為是妹妹 所以沒辦法 現在我比較擔心他長這麼大還沒男
推mariandtmac :人味
→ swearwin :朋友 XD

SQL Injection 原理說明

SQL 是網站常用來取得資料的程式語法,SQL Injection 便是駭客透過修改 SQL 語句,改變他的語意,達成竊取資料/破壞資料的行為。

例如:假設有一個SQL語句的語意是:

當語句後半部(從「滿足…」之後的語句)達成條件之後,會順利的取出使用者的資料,正常的使用者(例如:jayden)會這樣填寫(黃色字的部分):

正常使用者填寫的資料示意圖

假設使用者名稱 jayden 跟使用者密碼 pass123,都是真正的資料,因此能夠滿足條件,程式便會取出使用者的資料。經過真值表計算(可見上圖的最下面的算式),TRUE AND TRUE 等於 TRUE,因為條件被滿足,資料庫會成功回傳 jayden 使用者的資料。

然而,駭客在不知道 jayden 的密碼之下,會故意這樣填寫(黃色字的部分):

駭客填寫的資料示意圖

這樣填寫之後,語句後半部(從「滿足…」之後的語句)依然會滿足條件,回傳 jayden 使用者的資料給駭客。因為經過真值表計算 ,即上圖的最下面的算式,算式後半部 FALSE OR TRUE 依然會回傳 TRUE,再跟前半部的 TRUE 做計算後,整體回傳 TRUE ,因此會滿足條件,回傳資料。

將上述的概念轉化為程式碼,就會是:

正常使用者填寫的SQL語句
駭客填寫的SQL語句

只要你的網站有提供使用者輸入的欄位,便有可能暴露在被 injection 攻擊的風險。駭客透過截斷你原本程式的語意,改為插入他希望執行的程式碼,達成攻擊的效果。以上為我的分享,希望對大家有幫助!

--

--

Jayden Lin
程式猿吃香蕉

曾在 Yahoo 擔任 Lead Engineer,負責廣告系統,帶團隊做跨國開發,現任職區塊鏈產業。也是《程式猿吃香蕉》團隊創辦人,喜歡將實用的軟體知識以簡單生動的方式講給大家聽 😄😄😄