第三章、 誘捕網系統
第五節、 資料庫與程式碼設計
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 : 用戶 email2.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 資料