iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
1
Security

資安0~100K只要30天系列 第 17

Day 17 - SQLi (二)

  • 分享至 

  • xImage
  •  

What is SQLi ?

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;-- ')

我們可以發現語法變成了三個區塊

分別是

  1. 正常的插入資料行為
    INSERT INTO Students(name) VALUES ('Robert');

  2. Students 這張 table 刪除
    DROP TABLE Students;

  3. 註解後面的垃圾字元
    -- ')

所以說上面的笑話中
學校才會說他們的資料全毀了
這就是一個經典的 SQLi 漏洞造成的危害

分類

在 SQL Injection 中
可粗淺的分為兩大類

  • 一般的 SQLi
    • 有回顯
  • SQL 盲注 (Blind Injection)
    • 沒有任何顯示,只有利用網頁中簡單的 true false 行為判斷語法正確與否

對於這兩種不同的狀態
又衍生出幾個對其相應的攻擊手法

  • Stacked Queries

  • SQLi

    • Union Based
    • Error Based
  • Blind SQLi

    • Boolean Based
    • Time Based

剛剛上面那個笑話中所使用的攻擊技巧為 Stacked Queries
還記得那個男孩的名字嗎
他將名字輸入進去 SQL 語句後
整段語法由分號切開
變成一段一段的
有層層相疊的感覺
因此稱為 stack

接下來讓我們來看看
如果你上網查 SQL Injection 入門
一定會看到一段 ' or 1=1#-- 這樣的東西
就連 Wiki 也不例外XD

我們來看看這句話ㄅ
假設今天有一個我們可以輸入帳號密碼的地方

一般看到這裏大家都會乖乖的輸入帳號密碼登入

但是當你變成駭客就不可以這樣
我們就是要在裡面放一些奇怪的東西試試看
就拿上面 Wiki 的例子吧

你會發現你不需要輸入密碼也可以成功登入
因為這句 SQL 語句被寫成了

user='xxx' or 1=1

這樣代表你不管 user 是誰
後面永遠跟著一個 true 的條件
所以就讓語法比較後通過了
是不是很神奇呢?

明天我們接著講 Union Based 是什麼
敬請期待~


上一篇
Day 16 - SQLi (ㄧ)
下一篇
Day 18 - SQLi (三)
系列文
資安0~100K只要30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言