SQL Injection

Download Report

Transcript SQL Injection

SQL Injection
簡介及自我檢測
區域聯防總區中心
http://www.sss.org.tw/
2005年09月
1
Outline
 什麼是SQL
 什麼是SQL Injection
 SQL Injection原理
 SQL Injection範例
 SQL Injection 測試方法
 結論
 Demo
2
什麼是SQL
 SQL - Structured Query Language
 允許存取資料庫
 ANSI and ISO standard

目前標準為 SQL99
 SQL 能夠:






建立資料表
執行資料庫查詢
修改資料庫資料(資料表)
新增資料庫資料(資料表)
刪除資料庫資料(資料表)
更新資料庫資料(資料表)
3
SQL is a Standard - but...
 有許多不同版本的SQL實作



Access SQL
PL/SQL
MS-SQL SQL….etc.,
 這些SQL提供不同的”Keywords” ,但有些則是
大都相同的。如:SELECT,UPDATE,INSERT,
WHERE…etc.,
 不同的資料庫系統提供屬於自己的SQL語法或
關鍵字。
4
SQL Database Tables
 關聯式資料庫包含許多不同的表格
 表格包含許多的資料列
 舉例來說: Table users
userID
Name
LastName
Login
Password
1
John
Smith
jsmith
hello
2
Adam
Taylor
adamt
qwerty
3
Daniel
Thompson dthompson dthompson
5
SQL Queries
 執行資料庫查詢
 使用前一頁的 table, SQL查詢語法如下 :
SELECT LastName
FROM users
WHERE UserID = 1;
 回應結果如下:
LastName
-------------Smith
6
SQL Data Manipulation
Language (DML)
 資料操作語言
 SQL 語法用以 update, insert, and delete
records:




SELECT – 查詢Table內data
UPDATE – 更新 Table 內data
INSERT INTO – 插入新資料 到Table中
DELETE – 從Table 中刪除 data
7
SQL Data Definition
Language (DDL)
 資料定義語言
 定義和刪除資料庫以及資料庫實體的




資料庫表格新增或刪除
定義索引 (indexes (keys))
資料表之間的聯結關係
資料表與資料表間的限制關係
 常用的 DDL



CREATE TABLE – 建立新的資料表
ALTER TABLE – 改變或更新資料表(屬性)
DROP TABLE – 刪除資料表
8
SQL Data Control Language
(DCL)
 資料控制語言
 用來控制資料庫內部的交易處理以及維護
系統效能的指令
 賦予、刪除、撤回權限與角色
9
What is SQL Injection?
The ability to inject SQL commands into
the database engine
through an existing application
10
什麼是SQL Injection
 SQL Injection 應稱為SQL 指令植入式攻擊,目
前被翻譯成『資料隱碼』攻擊
 SQL Injection是一種未做好輸入查驗(Input
Validation)的問題
 在撰寫應用程式時,沒有對使用者的輸入做妥
善的過濾與處理,便將其組合成SQL指令,傳
送給SQL server執行
11
什麼是SQL Injection(進行登入)
SQL Injection 方法
在登入頁面面亂試
12
什麼是SQL Injection(登入成功)
 使用SQL Injection登
入成功之後,資料庫
會以第一筆資料為登
入的使用者帳戶
 而通常第一筆資料即
為系統管理者,掌握
整個網站系統的生殺
大權
13
什麼是SQL Injection(cont.)
 若使用者輸入之資料中含有某些對資料庫系統
有特殊意義的符號或命令時,便可能讓使用者
有機會對資料庫系統下達指令,而造成入侵所
帶來的損失
 事實上,這樣的疏漏並不是資料庫系統的錯誤,
而是程式設計師或軟體開發者的疏忽所產生的
14
什麼是SQL Injection(cont.)
 執行介面

由網頁語言(如PHP,ASP)來組織 SQL 語言,然後再傳遞給關聯
式資料庫系統執行
 嚴重性


繞過驗證使用者密碼機制
新增、修改、刪除或查詢資料庫內的資料
 安全觀念迷思

一般網管人員為了達到保護網站安全,會利用架設防火牆,設計
非軍事區(DMZ),限制網站登入者的身分。但SQL Injection並非
透過病毒及暴力攻擊手段,對現階段任何防火牆或是防駭客系統
而言,是無法防範的
15
什麼是SQL Injection
(影響的系統)
 Web 伺服器

Apache、IIS、Domino、Netscape..等
 網頁語言

ASP、PHP、JSP ..等
 資料庫

MSSQL、MySQL、Oracle、Sybase與DB2
等
16
SQL Injection的原理
 由兩個部分組成

前端
web端(使用者輸入介面端)
 Brower


後端
網頁應用程式
 資料庫端

17
前端(使用者介面端)
 可以進行SQL Injection之處


網頁上會到資料庫存取資料的
輸入欄位
URL列
18
後端(資料庫介紹)
19
後端( SQL 語法)
 SELECT <欄位>
FROM <表單名稱>
[WHERE <條件表達式>]
[ORDER BY <欄位>[ASC|DESC]];
 在條件表達式成立下,從表單名稱中,將符合的欄位選
取出來,且該欄位的排列順序以ASC(由小往大)或
DESC (由大往小)的方式排列
20
後端-資料庫端
 網頁裡查詢到資料庫查詢使用者帳號及密碼做
核對的語言如下
SQLQuery = "SELECT Username FROM Users WHERE Username
= '" & strUsername & "' AND Password = '" & strPassword & "'"
strAuthCheck = GetQueryResult(SQLQuery)
If strAuthCheck = ""
Then boolAuthenticated = False
Else
boolAuthenticated = True
End If
21
後端-資料庫端
使用者
前端
部分
 在登入網頁輸入(以’or ‘’=‘為例)
 則傳到資料庫中的字串會變成
網頁處理部分部分
"SELECT Username FROM Users WHERE Username = '" & strUsername &
"' AND Password = '" & strPassword & "'"
送到資料庫部分
22
SQL Injection範例
 說明系統及資料表
 ASP的程式部分
 繞過驗證程序
 利用錯誤訊息取得更多資訊
 欄位數量與名稱
 欄位資料型態
 所有會員的帳號密碼
23
說明系統及資料表
 ASP 網站架構搭配 MS SQL Server 做一個探討及
示範
 所使用的資料表格如下 資料表名稱

CREATE TABLE [tblUser] (
[UserID] [int] (50) NOT NULL ,
[UserName] [nvarchar] (50) NOT NULL ,
[Password] [nvarchar] (50) NOT NULL ,
)
表中的
欄位
欄位的
格式
欄位的
長度
是否
允許null
24
ASP的程式部分
 網頁的撰寫方式如程式碼

<%
…
strSQL=“SELECT * FROM tblUser WHERE UserName=‘” &
Request(“UserName”) & “’ AND Password=‘” & Request(“Pass”) & “’”
//直接交給 SQL Server 執行,而沒有進行輸入字串的檢查,這是最危險
//的地方
…
If NOT =.Execute(strSQL) .EOF Then
Session("UserName")=Request("UserName")
Response.Write "歡迎光臨 " & Request("UserName")
Else
Response.Write "您的帳號/密碼輸入錯誤"
End If
%>
25
繞過驗證程序(已知使用者名稱)
 實際傳給SQL server的字串如下
 SELECT * FROM tblUser WHERE
UserName='admin'--' AND
Password='asdf'
 原先的 AND 子句被 "--" 標示成說明,
也就是 SQL Server 僅僅執行
 SELECT * FROM tblUser WHERE
UserName='admin'
 若有該使用者存在,則這個 SQL 查
詢語法就傳回該記錄的所有欄位內容
26
繞過驗證程序(未知使用者名稱)
 用未知的使用者名稱登入
‘ or 1=1 ‘--
 SQL Server 所接收的整個語法變成
SELECT * FROM tblUser WHERE UserName='' or
1=1 ‘--' AND Password='asdf'
 因為加上的 or 1=1,則不管之前的條件為何,
只要某個條件為真,整個判斷式就都為真
27
獲取欄位數量與名稱
 SELECT "欄位1",
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件)
 SELECT store_name, SUM(sales)
FROM Store_Information
GROUP BY store_name
HAVING SUM(sales) > 1500
 結果:
store_name SUM(Sales)
 Los Angeles $1800
28
利用錯誤訊息取得更多資訊
 微軟為了方便 ASP 的程式開發者可以順利地除
錯,當 Script 執行錯誤時,都會透過預設的
<系統所在磁碟>\WINNT\Help\iisHelp\common\500-100.asp
網頁將發生錯誤的原因回傳到前端
 利用錯誤訊息可以取得
 欄位數量與名稱
 欄位資料型態
 所有會員的帳號密碼
29
獲取欄位數量與名稱
 輸入:

' HAVING 1=1--
 錯誤訊息如右
 可以知道存放使用者的資料表名稱是 tblUser,且查詢中有一個欄
位叫 UserID
30
獲取欄位數量與名稱
 再次輸入:

'GROUP BY UserID HAVING 1=1--
 可知查詢的欄位還有 UserName
 由上述方式取到完整查詢語法後,再輸入以下的語法,
就不再造成執行時期錯誤

‘GROUP BY UserID,UserName,Password HAVING 1=1--
31
獲取欄位數量與名稱
 列出所有欄位的 Group By ,就等於沒有 其他
欄位須進行Group By動作,故語法完全正確表
示所有的欄位都已經包含在其中了
 駭客就此可以約略估計資料表的欄位結構
 在輸入帳號的地方執行以下語法便可以加入自
訂的使用者到資料表中

';INSERT INTO tblUser Values('hacker','hacker',10)-
32
獲取欄位資料型態
 若有資料欄位格式不對,導致無法加入自訂使用者,也
可以利用下列語法傳回的錯誤訊息來判讀資料欄位格式:

'UNION SELECT ‘UserID' FROM tblUser ‘--
 得到以下錯誤訊息
 SELECT 查詢,

第一個欄位的資料是 varchar 格式的 ‘UserID’,因此出現以上
錯誤訊息。駭客也由此得知資料表第一個欄位的資料型態是 int。
有耐心地把一個個欄位測試完畢後,便可以得到整個資料表的
欄位格式
33
獲取會員的帳號密碼
 先以下列語法詢問帳號

'UNION SELECT UserName FROM tblUser
WHERE UserName>'a‘--
 因為傳回的記錄”Admin”是 nvarchar 格式,而
透過 union 對應到原先 int 資料欄位,因此有上
圖 的錯誤訊息
34
獲取會員的帳號密碼
 獲得該帳號的密碼


'UNION SELECT Password FROM tblUser WHERE
UserName='admin‘--
利用錯誤訊息取得帳號 admin 的密碼 “AdminPass”
 依次替換掉 WHERE UserName > 的條件內容,就可以
取得資料表中所有的帳號和密碼組合
35
列舉:使用具破壞力的語法
 停掉 SQL Server 的執行

' ;SHUTDOWN—
 破壞整個資料庫的內容

針對MSSQL
的測試字串
' ;DROP Database <資料庫名稱>--
 刪除資料庫內某個資料表:

' ;DROP Table <資料表名稱>--
 清空資料表中所有欄位的值:

' ;Truncate Table <資料表名稱>--
 清空資料表:

' ;DELETE FROM <資料表名稱>-36
在URL上使用SQL Injection
 夾帶資料的URL
http://localhost/test.asp? username=username
& password=password
 可以使用以下方法進入
http://localhost/test.asp? username=‘or 1=1--&
password=‘or 1=1--
 如何得知使用者及密碼欄位的確實名稱

瀏覽器中”檢視原始碼”,找到該欄位的名稱
37
在URL上使用SQL Injection
(找到欄位的確實名稱)
38
SQL Injection Characters











‘ or “
表示為字串
-- or # 單一列註解, #在 MS Access中則為日期格式
/*…*/
多列註解
+
增加操作元; 字串連接;在 URL 時表示空白
||
在 Oracle and Postgres中表的連接符號
%
萬用屬性,可能為變數開頭或表示百分比
?Param1=foo&Param2=bar URL 參數
PRINT
列印或顯示
@variable 區域變數
@@variable
全域變數
waitfor delay ‘0:0:10’
時間延遲(time delay)
39
40
SQL Injection 簡易測試方法
41
應用程式是否受到SQL
Injection弱點威脅
 攻擊者或駭客要的是資料,所以攻陷或取得資
料庫才是他們想做的。SQL Injection 提供最有
效率的方法。
 只要提供使用者輸入的介面,並直接將使用者
輸入的東西送給DB engine 執行即有可能受到
SQL Injection弱點威脅。
 網頁應用程式提供對外、開放的服務,亦提供
攻擊者進行SQL Injection攻擊的良好標的。
42
應用程式是否受到SQL
Injection弱點威脅(cont.)
 簡易的測試方法


利用進行輸入SQL Injection字串進行測試
利用工具進行自動化的掃描測試
 進階的測試方法

檢視及分析Sources Code
43
SQL Injection弱點
簡易的測試方法
 利用進行輸入SQL Injection字串進行測試

網頁應用程式,允許使用者輸入字串的地方
有二:

Uniform Resource Locators (URL)
 一種用來鑑別文件與資源在World Wide Web 中位址的專
用介面。
 可用以傳遞網頁與網頁間的資料

Web Form
 網頁上的表單物件。
 可以用來群組其他的網頁物件,進行資料的輸出入與處
理
44
SQL Injection弱點
簡易的測試方法(cont.)
 URL範例

http://www.google.com.tw/search?q=web+Form&hl=zhTW&hs=l31&lr=&cr=countryTW&client=firefoxa&rls=org.mozilla:zh-TW:official&start=20&sa=N
 ? :表示後面接變數及資料
 變數間利用「&」隔開.
 上面的例子表示將?後的變數加資料送給
「http://www.google.com.tw/」上的「 search 」這個 CGI
處理.
 共傳遞了「q」、「hl」、「hs」、「lr」、「cr」、
「client」、「rls」、「start」、「sa」等九個變數,變數
的值為 =後面所接的字串。
 其中「q」變數”web+Form”可能為string類型,「hs」變數
為數字131,可能為int類型,「lr」變數為空白,可能為int
或String類型。
45
SQL Injection弱點
簡易的測試方法(cont.)
 我們可以使用在URL中加入SQL Injection
測試字串.
 測試的方法有三:



對於int型態的變數
對於String型態的變數
利用不同編碼(encodings)進行
46
對於int型態的變數
 當輸入的參數xx為int時,在網頁中的後端
SQL語句原貌大致如下:
select * from 表格名稱 where 欄位=xx
 如:一個網頁最新消息頁面「view.asp」
http://www.hacker.crop.tw/news/board/view.asp?ID=1376
則
select * from 表格名稱 where 欄位=1376
47
對於int型態的變數(cont.)
 利用在URL後面附加一個單引號(‘)加以測
試
http://www.hacker.crop.tw/news/board/view.asp?ID=1376'
 此時view.asp中的SQL語句變成了
select * from 表格名稱 where 欄位=xx’
 SQL應該回覆錯誤的訊息,見下頁。
48
對於int型態的變數(cont.)
49
對於int型態的變數(cont.)
 但是這樣的方法並不表示一定有SQL
Injection問題,因為:



web Server不一定回應具體錯誤提示給用戶
端。
如果程式中用了轉換變數型別『cint(參數) 』,
SQL注入是不會成功的,但Web Server同樣
會出現錯誤。
目前大多數程式師已經將「’」過濾掉,所以
用「’」測試不到注入點 。
50
對於int型態的變數(cont.)
 利用注入錯誤的恆等式來判斷


恆等式: 式子永遠為True,如:1=1、2>1。
錯誤的恆等式:式子永遠為False、如:1=2、
1>2。
 利用剛剛的URL做範例
恆等式:
http://....../news/board/view.asp?ID=1376
錯誤的恆等式:
and 1=1
http://....../news/board/view.asp?ID=1376
and 1=2
51
對於int型態的變數(cont.)
 如果同時滿足下列兩個條件,則view.asp中
就會存在SQL注入漏洞,反之則可能沒有。


http://....../news/board/view.asp?ID=1376 and 1=1
執行結果正常且與
http://....../news/board/view.asp?ID=1376 結果相同。
http://....../news/board/view.asp?ID=1376 and 1=2
執行結果異常。
52
對於String型態的變數
 類似int型態的測試方法,不過字串必須以「“」或
「、」包含起來才行。

如: 欄位=’欄位值’
 當輸入的參數xx為string時,通常view.asp中SQL
語句原貌大致如下:
select * from 表格名稱 where 欄位=‘xx’
 輸入: http://....../news/board/view.asp?id=admin
 則: select * from 表格名稱 where 欄位=‘admin’
53
對於String型態的變數(cont.)
 利用在URL後面附加一個單引號(‘)加以測
試
http://www.hacker.crop.tw/news/board/view.asp?ID=admin'
 此時view.asp中的SQL語句變成了
select * from 表格名稱 where 欄位=‘xx’’
 多一個單引號應該如同前面的int測試一樣
回覆錯誤的訊息。
54
對於String型態的變數(cont.)
 利用輸入錯誤的恆等式來判斷


恆等式: 式子永遠為True,如:’a’=‘a’。
錯誤的恆等式:式子永遠為False、
如:’a’=‘b’。
 利用剛剛的URL做範例
恆等式:
http://....../news/board/view.asp?ID=admin
錯誤的恆等式:
and ‘a’ =‘a’
http://....../news/board/view.asp?ID=admin
and ‘a’=‘b’
55
對於String型態的變數(cont.)
 如果同時滿足下列兩個條件,則view.asp中
就會存在SQL Injection漏洞,反之則可能沒
有。


http://....../news/board/view.asp?ID=admin and
‘a’=‘a’ 執行結果正常且與
http://....../news/board/view.asp?ID=admin 結果相同。
http://....../news/board/view.asp?ID=admin and
‘a’=‘b’ 執行結果異常。
56
利用不同編碼(encodings)進行
 有時程式師會在程式中過濾掉單引號、
select等字元,以防止SQL Injection。此
時可以用以下幾種方法試一試。


大小寫混用
URL Encoding
ASCII
 Unicode

57
大小寫混用
 Programmer在過濾時通常要麼全部過濾
大寫字串,要麼全部過濾小寫字串,而大
小寫混合往往會被忽視。如用SelecT代替
select,SELECT等。
 如:
http://....../news/board/view.asp?ID=admin And ‘a’=‘a’
http://....../news/board/view.asp?ID=admin ; SelecT *…
58
URL Encoding
 利用不同的編碼來欺騙程式設計師的過濾
機制。

如:利用字串比對「’」或「;」符合的就不
輸入SQL字串,讓DB engine執行。
 利用轉換「’」或「;」為ASCII code 或
Unicode 當執行檢查機制時,會無法
match,但輸入SQL字串,讓DB engine
執行時又會轉換回來。
59
URL Encoding(cont.)
 http://bibliotek.dk/urlencode.php
 「’」->ASCII code = 39
->Unicode = %27
 已先前的URL為例
http://....../news/board/view.asp?ID=admin and %27a%27=%27a%27
=
http://....../news/board/view.asp?ID=admin and ‘a’=‘a’
60
Web Form
 網頁上的表單物件。
 可以用來群組其他的網頁物件,進行資料
的輸出入與處理。
61
Web Form內容
<FORM name=forms action=./Login_Check.asp method=post>
<FONT class=DataFONT>請輸入帳號及密碼:</FONT>
<FONT class=FieldLoginFONT>帳號</FONT>
<INPUT tabIndex=1 maxLength=50 name=Account>
<FONT class=FieldLoginFONT>密碼</FONT> >
<INPUT tabIndex=2 type=password maxLength=50 name=Password>
<input type="hidden" name="FormAction" value="login">
<input type="reset" value="清除">
<input type="submit" value="登入">
</FORM>
62
按下登入的動作
 有兩種可能的方法將form中的控制項值串
起來送給Web server。

method=post


不會顯示在URL上
method=get

會顯示在URL上
http://...../Login_Check.asp?Account=帳號輸入的值&Password=密
碼輸入的值&FormAction= login
63
前面所提的SQL Injection測試
方法
 用在URL中的方法也可以用在web Form
中



對於int型態的變數
對於String型態的變數
利用不同編碼(encodings)進行
64
對於int型態的變數
1
http://...../Login_Check.asp?Account=1234 or
1=1&Password=1234 or 1=1&FormAction= login
http://...../Login_Check.asp?Account=1234 or
1=2&Password=1234 or 1=2&FormAction= login
2
65
判斷有無SQL Injection問題
 如果 1 的結果與正常登入相同,且 2的結
果為出現錯誤,則該網頁有SQL Injection
的問題。
 PS:在前一頁的例子中, 1 的結果與 2的
結果一定都會出現錯誤,原因為『帳號』
與「密碼」都是String類型,故此一Web
Form是沒有辦法利用int型態的變數檢測
方法進行的。那我們該用何種方法呢?
66
對於String型態的變數
A
http://...../Login_Check.asp?Account=a ‘or’
‘1’=‘1&Password=a ‘or ‘1’=‘1&FormAction= login
http://...../Login_Check.asp?Account=a ‘or’
‘1’=‘2&Password=a ‘or ‘1’=‘2&FormAction= login
B
67
判斷有無SQL Injection問題
 如果 A 的結果與正常登入相同,且 B 的
結果為出現錯誤,則該網頁有SQL
Injection的問題。
 不同的欄位,需配合不同的方式進行,若
為int 類型的欄位,則使用輸入數字方式
進行,若為String 類型的欄位,則使用輸
入字串(加上單引號)方式進行,
68
利用不同編碼(encodings)進行
 同樣的,也可利用輸入不同的編碼來進行
之。
 「a’or’1’=‘1」
 Unicode

「a%27or%271%27%3D%271」
69
SQL Injection檢測步驟
 Step1: 以Web Form作為輸入SQL Injection介面作為開
始。(比較好輸入)
 Step2:猜測一下欄位用的是int或string。
 Step3:輸入「’」(單引號測試看看)
 Step4:依據不同的欄位輸入不同的測試字串。
 Step5:測試將表單用URL方式傳送,並在參數輸入上動
手腳。
 Step6:重覆4~5輸入不同的測試字串(錯誤的恆等式)並
比較其結果之不同與差異用以判斷該應用程式是否存在
SQL Injection問題。
70
SQL Injection檢測請注意…
 以上僅提供一些簡單的方法來進行測試,
尚有許多進階的方法與技巧來計進行SQL
Injection攻擊或測試。
 這些簡單的方法測試沒問題的網頁應用程
式,可以阻擋大部分的攻擊者,但是並非
全部。
 SQL Injection測試必須反覆地進行與比較
其結果的差異,並非使用單一字串即可檢
測無誤。
71
SQL Injection弱點掃瞄工具
72
利用工具輔助來進行
 原理:透過特定的 SQL Injection字串來自
動化執行我們之前手動的URL方式的檢測
方式。
 常見的:



Acunetix Web Vulnerability Scanner
Lilith
Remote PHP Vulnerability Scanner
73
Acunetix Web Vulnerability
Scanner
 商業版本
 完整的web 弱
點掃瞄功能與
漂亮的報表
74
Acunetix Web Vulnerability
Scanner
 可以Update新的弱點或plug-in,來增加新
的掃描功能。
 可下載試用版
http://www.acunetix.com/wvs/vulnerabilit
y-scanner.htm
 價格當然也很漂亮摟!
75
Lilith
 說明

利用perl寫成的SQL Injection掃描工具。
 執行平台

只要可以執行 perl都可以,perl 5 以上
 下載

http://angelo.scanit.biz/
 費用

免費
76
Lilith (cont.)
 usage: lilith.pl [options] -h <host>
 with following [options]:
 -h <host>
: 目標主機: port
 -u <user:pass> : 登入的Userid & pw
 -d <dir>
: 從哪個目錄或檔案開始進行 [default: /]
 -p <proxy>
: proxy server (proxy:port)
 -U <user:pass> : proxy 登入的Userid & pw
 -T <delay>
: 每次送出require等待時間(監隔多久進行)
 -f <file>
: 定義錯誤輸出檔案
 -s
: 不要猜測主機板本
 -v
: verbosity
 -i
: 不要進行任何injection 動作
 -c
: 忽略cookie
77
Lilith (cont.)
 Lilith –h www.hacker.corp.tw –d admin/ -v
+ target:
+ server:
http://www.hacker.corp.tw
Microsoft-IIS/5.0
初步探測資訊
找到有Form的頁面
[i] http://www.hacker.corp.tw/script/signin/index.php
+ [i] found 1 form:
+-- [i] 0 : POST - http://www.hacker.corp.tw/script/signin/login.php
+ [i] found 4 inputs:
+-- [i] hidden : PHPSESSID ("50176f449af34f66273cf2e0a466fac0")
+-- [i] text
: inputuserid ("")
+-- [i] password : password ("")
+-- [i] submit : ("µn¤J")
[e] http://www.hacker.corp.tw/script/signin/login.php gave HTTP:200 with "'" in
執行injection 「’」成功
PHPSESSID
78
+--[i]] SQL injection: http://www.hacker.corp.tw/script/signin/login.php (PHPSESSID)
Lilith (cont.)
 優點:

自動化進行檢測SQL Injection
 缺點:


有些網站Web Form無法偵測出來。
僅進行簡單的SQL Injection檢測,沒有問題
不表示以後完全沒問題。還是可能有其他的
Injection弱點存在。
79
lilith Demo
80
Remote PHP Vulnerability
Scanner
 可用來檢測PHP網頁問題。
 下載

http://www.securitychallenge.com/123456/ftp/rpvs.rar
81
Remote PHP Vulnerability
Scanner(cont.)
 used
rpvs.exe http://www.site.com/ [-bf/-f] [-v] [-noaff] [-sql] [-post] [-apport]








-bf
: 暴力攻擊變數
-f
: 快速模式
-noaff
: 除去論壇的可能filter
-v
: verbose mode
-sessid=VARNAME
: 定義登入帳號及密碼需與 –aff一起用
-rapport
: 將結果存入 rapport.txt
-sql
: 利用SQL錯誤進行攻擊,不能與 -rapport 一起用
-post
: 使用 POST http method
82
Remote PHP Vulnerability
Scanner(cont.)
 優點:


自動化進行檢測PHP網頁的弱點
對於XSS檢測能力較強
 缺點:


有些網站SQL Injection無法偵測出來。
僅進行簡單的SQL Injection檢測,沒有問題
不表示以後完全沒問題。還是可能有其他的
Injection弱點存在。
83
Remote PHP Vulnerability
Scanner Demo
84
使用工具的迷思
 使用工具檢測後就能確保無SQL Injection問題。

工具僅進行簡單的SQL Injection檢測,沒有問題不表
示以後完全沒問題。還是可能有其他的Injection弱點
存在。
 工具能夠檢測準確的問題。

工具還是利用pattern match方式進行,當有新的方
法被發現時,沒有擴充能力的工具,就不可能檢測出
新的弱點。
85
SQL Injection 防護
86
SQL Injection Defense
 最簡單的方法還是 input validation



過濾所有可能的字串
限制使用者輸入
將檢查放在Server端,而非Client端
 檢測 source code中的輸入驗證,並避免有
問題的字串進入SQL 字串中


在新的應用程式中加強安全設計
重新檢測現存的網頁應用程式
 限制應用程式存取資料庫的權限
87
加強安全設計
 定義安全的存取資料路徑




使用預儲程序進行資料存取
經由定義好的parameterized API進行與資料庫
互動
檢查所有輸入
使用較低權限的方式連接資料庫

定義資料庫角色及可以執行的權限或查詢
88
輸入驗證
 定義每一資料輸入欄位

實做嚴謹的“只允許”過濾機制
如:只能輸入數字,就不要讓使用者能輸入數字
以外的方式,且只允許變數儲存數字,其他應予
以排除。
 寧願取消或修改也要拒絕不合法的輸入


實做嚴謹的“已知不允許的”過濾機制

如: reject "select", "insert", "update", "shutdown",
"delete", "drop", "--", "'"
89
檢查使用者輸入字串
 置換(取代)法

將非法的字串加以取代,避免非法字串的輸入。適用
於須開放某些特定字元符號時

如: (),-等。
 搜尋檢查法

搜尋字串中非法字元是否出現,若出現則與與拒絕或
重導到其他頁面。
 兩種方法都可以達成


“只允許”過濾機制
“已知不允許的”過濾機制
90
置換(取代)法-ASP
 Replace(“字串”, “欲取代的字元”, “用來取代的
字元")
 範例:

Replace("I am a student", "a", “u“)


結果輸出: I um u student
Replace(“loginid,"select", "sel&#101;ct" )

將「select」取代成沒有攻擊性的「sel&#101;ct 」
91
置換(取代)法-PHP
 str_replace(“欲取代的字元”, “用來取代的
字元“, "字串")

類似的函式ereg_replace(), preg_replace()
 addslashes(strings) 將字串內的特殊符號
前面加上「\」,使特殊符號變成字串,而
不會執行。

所有輸入的單引號(')都會變成(\')
92
置換(取代)法-JSP
 replace(char oldChar, char newChar)



類似函數:string.replaceAll()
“mesquite in your cellar”.replace(‘e’, ‘o’)
結果回傳 "mosquito in your collar"
但是這樣的方法回傳的是字串,故應將字串
內的特殊符號前面加上「\」,使特殊符號變
成字串,而不會被執行。
93
搜尋檢查法-ASP
 Instr(字串,出現的字元)



用來尋找在字串中是否有「出現的字元」,
如果由傳回「True」(1),沒有則傳回「false」
(0) 。
需配合條件判斷
判斷使用者輸入的字串中如包含非法的字串
則重導至其他頁面或回覆適當的錯誤訊息。
If (instr(require(“userID”,”’”) >0 then response.write “輸入不合法”
94
搜尋檢查法-PHP
 ereg ( 比對樣板,字串)


使用正規表示式(Regular expression )比對,
字串中符合比對樣板則傳回「True」(1),沒
有則傳回「false」(0) 。
類似的函式 eregi() 、preg_match() 、
strpos()與 strstr() 。
if (ereg("[^[:space:]a-zA-Z0-9]", $string))
{ return false; }
當$string中不符合空白,a-z,A-Z,0-9時
else
傳回True,否則傳回False。
{ return true; }
95
搜尋檢查法 - JSP
 String.matches(regex)


如果字串內(String)中符合正規表示式
(regex) ,則傳回True,若否則傳回false。
“max;quite”.replace(“[^[:space:]a-zA-Z0-9]”)
結果回傳 True。
If Tel.matches(“^0-9”)
return false;
當Tel所存的字串中不符合0-9,時
else
傳回True,否則傳回False。
return true;
96
輸入驗證cont.
 輸入驗證是第一步的把關,但是,功力較深
的攻擊者還是可能繞過這些輸入驗證。
 所以,網頁系統開發時,輸入一定要做,但
是做了,不保證不會再遭受SQL Injection攻
擊。
 目前資料庫及PHP、JSP、ASP都廣泛支援
預儲程序(stored procedure )或預先編譯好
的指令(prepared statements) ,利用這些將
可降低SQL Injection的攻擊與威脅。
97
鞏固 DB Server
1. 利用較低權限的使用者執行 DB
2. 移除未使用的預儲程序或函式,並限制系統
管理者權限
3. 改變或移除系統的 “public”存取權限
4.
5.
6.
7.
所有使用者均需設定安全的密碼
移除與其他伺服器的信任關係
移除未使用的 網路通訊協定
使用Firewall來限定信任的client才能連接
98
Detection
 可能的SQL Injection攻擊監控




紀錄可能的SQL Injection攻擊動作(log, IDS)
利用email傳送警告
阻擋惡意攻擊的IP
送出警告訊息,如:

你的IP來源及攻擊行為已被記錄
 加入可能的過濾機制到每一資料傳送環節
99
取消或自訂web的錯誤輸出
 錯誤訊息給予攻擊者有用的訊息,來進一
步執行攻擊。
 可以將錯誤訊息藉由安全控制,來達到給
予攻擊者最少的錯誤訊息及資訊。
 IIS – 自訂錯誤訊息
 Apache – httpd.conf
 Tomcat – server.xml 或web.xml
100
取消或自訂IIS的錯誤輸出
 IIS站台內容選項-->自
訂錯誤。(IIS 5後適用)
 指定自訂的錯誤輸出頁
面
 修改500-100.asp,將
輸出錯誤的詳細訊息拿
掉。

路徑
/iishelp/common/500-100.asp
101
取消或自訂Apache的錯誤輸出
 修改httpd.conf 參數
 語法:


ErrorDocument [錯誤編號][檔案/文字說明]
EX:
ErrorDocument 500 /missing.html
 ErrorDocument 100 “系統錯誤...”
(注:當以文字說明時,務必加上 " 號)

102
取消或自訂Tomcat的錯誤輸出
 在conf/server.xml 或web.xml中,指定到
錯誤輸出的頁面
錯誤訊息
顯示的檔案
103
結論
 SQL Injection是相當危險的,即使在防火
牆上設定在多policy也無法過濾。
 網頁設計師的疏失,為駭客大開後門。
 因此大家設計網頁資料庫的時候要多多注
意,小心防範。
104
Lab-登入
105
Lab:練習int型態的SQL
Injection檢測
106
Lab:練習String型態的SQL
Injection檢測
107
Links
 A lot of SQL Injection related papers




http://www.nextgenss.com/papers.htm
http://www.spidynamics.com/support/whitepapers/
http://www.appsecinc.com/techdocs/whitepapers.ht
ml
http://www.atstake.com/research/advisories
 Other resources



http://www.owasp.org
http://www.sqlsecurity.com
http://www.securityfocus.com/infocus/1768
108
Q&A
區域聯防總中心聯絡人
Mail:
[email protected]
Web:
http://www.sss.org.tw/
109