• 沒有找到結果。

第三章、 誘捕網系統

第五節、 資料庫與程式碼設計

5.1 資料庫- log

27

用來紀錄系統所捕捉到的攻擊事件之資料,分別存入四個資料表中:attacker_log, attacker_log_input, attack_log_sec_level, black_list,各資料表內容如下:

5.1.1 資料表 attacker_log :

紀錄攻擊行為的主要資料表,每筆資料為一次攻擊事件。

No. Field Type Null Key Default Extra

1.1.1 Id int(20) 否 PKI auto_increment

1.1.2 Ip varchar(50) 否 NULL

1.1.3 user_sec_level int(2) 是 NULL 1.1.4 max_sec_level int(2) 是 NULL

1.1.5 Time int(30) 否 NULL

1.1.6 sql_string mediumtext 否 NULL 1.1.7 attack_page varchar(50) 否 NULL 1.1.8 user_authentic_type int(1) 否 0 1.1.9 log_comments text 是 NULL 1.1.1 id: 每筆攻擊紀錄之 unique id

1.1.2 ip: 攻擊來源 IP

1.1.3 user_sec_level: 攻擊發生時,此攻擊者的安全防護等級。

1.1.4 max_sec_level: 此次攻擊所能達到的最高防護等級。

(e.g., 3 代表:可以通過等級 1, 2 的檢查,會被等級 3 阻擋) 1.1.5 time: 紀錄攻擊的時間(單位:秒)

1.1.6 sql_string: 攻擊所產生的 SQL 字串。

1.1.7 attack_page: 受到攻擊的頁面。

1.1.8 user_authentic_type: 執行 SQL 指令後,Mysql 所回應的狀態

0 : query 失敗、1 : query 成功,但無法獲取資料 2 : 獲取資料成功、

3 : 登入成功 (login 檢查專用) 1.1.9 log_comments: 此筆攻擊紀錄的相關訊息

5.1.2 資料表 attacker_log_input

與 attacker_log 關聯的資料表,紀錄攻擊者所利用的字串接收欄位

No. Field Type Null Key Default Extra

28

1.2.1 Id int(20) 否 PKI auto_increment 1.2.2 log_id int(20) 否

1.2.3 Field text 是 NULL

1.2.4 Content text 是 NULL

1.2.1 id : 每筆 input 的 unique id

1.2.2 log_id : 存放 attacker_log 資料表的 id 1.2.3 field : 欄位名稱

1.2.4 content: 攻擊者輸入的內容、指令。

5.1.3 資料表 attacker_log_sec_level

與 attacker_log 關聯的資料表,紀錄攻擊分別在各個防護機制保護下的狀態。

安全防護:

等級 1 : 不做任何過濾

等級 2 : 對輸入字串做 addslash()

等級 3 : 關閉 error messages,並且對輸入字串做 addslash() 等級 4 : 去除輸入字串中所有的符號,並且關閉 error messages 狀態:

0 : query 失敗、1 : query 成功,但無法獲取資料、2 : 獲取資料成功、

3 : 登入成功 (login 檢查專用)

No. Field Type Null Key Default Extra

1.3.1 Id int(20) 否 PKI auto_increment 1.3.2 log_id int(20) 否

1.3.3 lv_1_sql text 是 NULL

1.3.4 lv_1_type int(1) 是 NULL

1.3.5 lv_2_sql text 是 NULL

1.3.6 lv_2_type int(1) 是 NULL

1.3.7 lv_3_sql text 是 NULL

1.3.8 lv_3_type int(1) 是 NULL

29

1.3.9 lv_4_sql text 是 NULL

1.3.10 lv_4_type int(1) 是 NULL

1.3.1 id : unique id of this table.

1.3.2 log_id : 存放 attacker_log 資料表的 id

1.3.3 lv_1_sql : 本次攻擊 SQL 在安全防護一過濾後的內容 1.3.4 lv_1_type : 未過濾 SQL 的執行狀態

1.3.5 lv_2_sql : 本次攻擊 SQL 在安全防護二過濾後的內容 1.3.6 lv_2_type : 輸入字串做 addslash()過濾,SQL 之執行狀態 1.3.7 lv_3_sql : 本次攻擊 SQL 在安全防護三過濾後的內容 1.3.8 lv_3_type : 過濾後,是否有出現 Time delay 之執行狀況 1.3.9 lv_4_sql : 本次攻擊 SQL 在安全防護四過濾後的內容 1.3.10 lv_4_type : 去除符號後,SQL 執行之狀況

5.1.4 資料表 black_list

紀錄曾經發起攻擊的 IP 黑名單。

No. Field Type Null Key Default Extra

1.4.1 Id int(20) 否 PKI auto_increment 1.4.2 Ip varchar(50) 否

1.4.3 sec_level int(10) 是 NULL 1.4.4 admin_setting_sec_level_time int(30) 是 NULL

1.4.1 id : unique id 1.4.2 ip : 攻擊來源 IP

1.4.3 sec_level : 上次攻擊所分配的安全防護等級。

1.4.4 admin_setting_sec_level_time :

系統管理人員可以手動提升 black_list .sec_level,此處紀錄調整的時間。

5.2 資料庫- msg_board

論壇網站(對外遭受攻擊)所使用的資料庫,包含 msg, thread, users 等資料表,各

30

資料表內容如下:

5.2.1 資料表 msg :

紀錄各篇文章的資料庫。

No. Field Type Null Key Default Extra

2.1.1 Mid int(20) 否 PKI auto_increment 2.1.2 Tid int(20) 否

2.1.3 Date date 是 NULL

2.1.4 Author int(20) 是 NULL 2.1.5 Subject varchar(200) 是 NULL 2.1.6 Content mediumtext 是 NULL

2.1.7 Reply int(20) 是 NULL

2.1.1 mid : 文章的 unique id 2.1.2 tid : 版面的 id (thread.id) 2.1.3 date : 文章發表日期

2.1.4 author : 文章發表人的 id (users.uid) 2.1.5 subject : 文章標題

2.1.6 content : 文章內容 2.1.7 reply : 回覆文章

5.2.2 資料表 msg :

各討論版的名稱、資訊。

No. Field Type Null Key Default Extra

2.2.1 tid int(5) 否 PKI auto_increment 2.2.2 name varchar(20) 是 NULL

2.2.3 info varchar(100) 是 NULL

2.2.1 tid : 討論版的 unique id

31

2.2.2 name : 討論版版名

2.2.3 info : 討論版的相關訊息、簡介 2.3 資料表 users :

紀錄註冊用戶的資訊。

No. Field Type Null Key Default Extra

2.3.1 uid int(20) 否 PKI auto_increment 2.3.2 name varchar(50) 否

2.3.3 pw varchar(40) 否 NULL

2.3.4 email varchar(50) 是 NULL 2.3.5 ADL35321 varchar(40) 是 NULL

2.3.6 profile text 是 NULL

2.3.1 uid : users 的 unique id 2.3.2 name : 用戶帳號

2.3.3 pw :

假密碼(讓攻擊者竊取)

2.3.4 email : 用戶 email

2.3.5 ADL35321 :

真實密碼,採用特定名稱欄位讓攻擊者難以猜中,且無法直

接存取這個欄位,只有透過特殊的程式檢查才能讀取。

2.3.6 profile : 用戶簽名檔

5.3 程式變數

5.3.1 module.php : 公用變數、資料庫連線的設定檔

32

若要移植誘捕系統至其他環境,需設定下列參數

No. Var Name Content Comment 3.3.1

security_acc

name HTML form 的帳號欄位名稱 (使用者輸入)

ADL35321 資料庫的真實密碼欄位名稱 (比對使用者輸入)

/board/index.php Login 介面的程式名稱 (供使用者填入帳號密碼) 3.3.7

myip

140.115.53.35 網站的 IP Address 或是 網站的網址(domain name) 3.3.8

WEBURL http://'.myip.'/boa rd/

首頁網址

3.3.9 time_to_upgrade_sec_

level_for_demo MCC server

3.3.12 mcc_ip 140.113.87.233 MCC server 之 IP 3.3.13 mcc_port 9876 MCC server 之 port

3.3.14 send_to_traceback true 是否利用 JAVA 的 socket 程式

33

送出訊息至 TraceBack server

MySQL 連線程式:(module.php)

$link=mysql_connect('localhost', 'p1t1r', '1111');

(1) (2) (3)

(1) 資料庫的 IP,若是本地端設 localhost 即可 (2) 資料庫連線帳號

(3) 資料庫連線密碼 if (!$link) {

die('Could not connect: ' . mysql_error());

}

if (!mysql_select_db('msg_board', $link)) { //連線至資料庫 msg_board echo 'Could not select database';

exit;

}

$link_for_log= mysql_connect('localhost', 'p1t1r_log', '1111');

(1) (2) (3)

(1) 資料庫的 IP,若是本地端設 localhost 即可 (2) 資料庫連線帳號

(3) 資料庫連線密碼

if (!$link_for_log) {

die('Could not connect: ' . mysql_error());

}

if (!mysql_select_db('log', $link_for_log)) { //連線至資料庫 log echo 'Could not select database';

exit;

}

34

※檢查專用連線:

檢查防護等級時,會將可疑的 SQL 過濾後,再進行資料庫存取,藉此找出此字 串最高可達到的等級 。

$link_test1= mysql_connect('localhost', 'test1', '1111');

if (!$link_test1) {

die('Could not connect: ' . mysql_error());

}

if (!mysql_select_db('msg_board', $link_test1)) { echo 'Could not test1';

exit;

}

5.3.2 ODBC.php

將此函式從 lib.php 中獨立到 ODBC.php,避免遭受攻擊時,會顯示出 lib.php(重 要函式)的名稱,增加重要檔案的隱密性。

5.3.3 lib.php : 公用程式的 Libary function sec_fetch(&$result){

// $result : 執行 SQL query 之結果 本函式是提供假密碼所使用

將 mysql_fetch_assoc 做 hooking,檢查 SQL 抓取的資料中,是否具有真 實密碼的欄位名稱(e.g. ADL35321),若是出現,則取代為其他名稱,避 免真實密碼被竊取出。

//本函式是防護等級一所使用

//將使用者輸入之資料中,具有「’」、「”」、「\」、「NULL」的字元前面加上\

35

//防護等級四所使用 //將所有符號去除

function symbol_strip(& $input) {

//$input : 網站使用者所輸入的資料

$pattern = "[-\#='\" !@$%^&*()_+,.]";

if( is_array($input) )

foreach ($input as $key => $child) {

$child = ereg_replace($pattern, "", $child);

$input[$key] = $child;

}

檢查使用者 IP 是否為黑名單,若是存在,則依據此 IP 的防護等級,提升防範 機制,讓此攻擊者先前所用的手法失效,藉此誘使攻擊者採用更複雜的攻擊方 式。

36

Function chk_time_to_upgrade_sec_level(){

檢查是否提升防禦等級的機制之一

檢查本次攻擊與上次攻擊相隔的時間,是否超過一定的區間 (可在 module.php time_to_upgrade_sec_level),則會提升防禦。

檢查使用者本次輸入的資料,可否對目標 SQL 產生非正常結果,並判斷出惡 意的輸入能規避哪些安全防護。

Function chk_input_sec_level($sql,$user_inputs,$chk_para){

37

$normal_user_result = mysql_query($normal_user_sql, $link);

if (mysql_num_rows($normal_user_result) > 0

&& chk_mal_login($user_inputs['name'],$user_inputs['pw'],

$temp_strip['name'],$temp_strip['pw'])

38

$max_sec_level =0;

$user_auth_type = 0;

for($i=0;$i<5;$i++){

$lv_sql[$i]='';

$lv_type[$i]=0;

}

39 //能 delay 超過 0.1 秒 -> query 一定有成功 if($max_exec_time >=0.1){

$lv_type[3]=2;

//修正前面因為 query time 超過 0.1 秒被中斷的情況

40 //sec_level_2

$addslash_sql=$sql;

foreach ($user_inputs as $key => $child) {

$addslash_sql = str_replace($user_inputs[$key], addslashes($child), $addslash_sql);

}

41

$result = sec_query($sql_bl, $link);

$user_sec_lv = $max_sec_level;

}else{

//檢查是否超過提升時間 : 是->提升安全等級, 否->維持

42

$fake_pw_sql = " select * ";

$fake_pw_sql .= " from ".sensitive_table_name." where

".database_security_acc."='".$temp_acc."' and ".database_for_user_pw."='".$temp_pw."' ";

$fake_pw_result = mysql_query($fake_pw_sql, $link);

if (mysql_num_rows($fake_pw_result) > 0) {

43

將捕捉到的攻擊事件資訊傳給 MCC。

此處檢查 module.php 的 send_to_mcc,若是為 true 才會傳送。

Function ssl_socket (){

44

insert_log_fields($log_id, $log_fields);

insert_log_sec_lv($log_id,$lv_sql,$lv_type);

} }

ini_set('display_errors', true); //打開 error msg (對應 開始檢查前的關閉 error msg) chk_filter($_POST,$_GET);

send_to_traceback();

ssl_socket($user_sec_lv);

return htmlspecialchars_decode($lv_sql[$user_sec_lv],ENT_QUOTES);

}

Function insert_log_fields (){

將攻擊事件中,攻擊者輸入的資料(經過處理,避免傷害 log 資料庫),再寫入 log 資料庫的 attacker_log_inputs 資料表。

45

5.3.4 模組- 正常網站

論壇程式,設置漏洞讓攻擊者發揮。

程式名稱 功能描述

index.php 論壇首頁,提供欄位讓使用者輸入帳號密碼,

也讓攻擊者有機會進行 SQL Injection。

board.php 討論區首頁,網址列有參數(id=1, 2, ...)代表不 同的討論區,也是常出現的 SQL Injection 漏 洞。

article.php, form.php, topic.php

論壇發表、觀看文章功能。

會先檢查 login,所以攻擊者未成功 Injection 上 述兩支程式前,是無法對此處進行存取。

log.php, log_list.php, log_search_form.php

顯示攻擊事件的 log 資料