OWASP TOP 10 的漏洞排行中
排名第一的注入攻擊的其中一種
起因為開發者未對使用者輸入的內容進行過濾
且將輸入的字串與 SQL 語句直接串接導致
先來看一個萬年老梗笑話
每次講到 SQLi 一定會出現我也不知道為啥(X
故事中出現的兒子的名字是 Robert'); DROP TABLE Students;--
假設輸入名字的地方的 source code 長這樣
<?php
$name = $_POST['name'];
$query = "INSERT INTO `Students`(name) VALUES ('" . $name . "')"
?>
我們將上面的 sql 語句抽出來看看
INSERT INTO `Students`(name) VALUES ('這邊放輸入的名字')
那將上面那位孩子的名字放進去看看會發生什麼事
INSERT INTO `Students`(name) VALUES ('Robert'); DROP TABLE Students;-- ')
我們可以發現語法變成了三個區塊
分別是
正常的插入資料行為INSERT INTO
Students(name) VALUES ('Robert');
把 Students
這張 table 刪除DROP TABLE Students;
註解後面的垃圾字元-- ')
所以說上面的笑話中
學校才會說他們的資料全毀了
這就是一個經典的 SQLi 漏洞造成的危害
在 SQL Injection 中
可粗淺的分為兩大類
對於這兩種不同的狀態
又衍生出幾個對其相應的攻擊手法
Stacked Queries
SQLi
Blind SQLi
剛剛上面那個笑話中所使用的攻擊技巧為 Stacked Queries
還記得那個男孩的名字嗎
他將名字輸入進去 SQL 語句後
整段語法由分號切開
變成一段一段的
有層層相疊的感覺
因此稱為 stack
接下來讓我們來看看
如果你上網查 SQL Injection 入門
一定會看到一段 ' or 1=1#--
這樣的東西
就連 Wiki 也不例外XD
我們來看看這句話ㄅ
假設今天有一個我們可以輸入帳號密碼的地方
一般看到這裏大家都會乖乖的輸入帳號密碼登入
但是當你變成駭客就不可以這樣
我們就是要在裡面放一些奇怪的東西試試看
就拿上面 Wiki 的例子吧
你會發現你不需要輸入密碼也可以成功登入
因為這句 SQL 語句被寫成了
user='xxx' or 1=1
這樣代表你不管 user 是誰
後面永遠跟著一個 true 的條件
所以就讓語法比較後通過了
是不是很神奇呢?
明天我們接著講 Union Based 是什麼
敬請期待~