IDS(入侵偵測系統)傳統為旁路監聽設備,透過規則比對封包特徵偵測攻擊。開源 Web 程式中 SQL Injection 為最嚴重且高發漏洞。80SEC 於 2008 年推出國內首款腳本型 IDS —— MysqlIds,專為 PHP+MySQL 架構設計,置於應用程式與資料庫操作之間,以資料庫語法分析 SQL 語句(非傳統關鍵字比對),精準攔截異常查詢並記錄詳細資訊,助管理者快速定位漏洞位置,甚至發現 0-day 漏洞。
MysqlIds 以 PHP 撰寫,透過封裝的安全函數監測程式執行的 SQL 查詢,針對駭客常用手法報警:
• UNION 聯合查詢
• SELECT 子查詢
• 非常用 SQL 註解符號
• 危險函數:sleep、benchmark、load_file、into outfile
程式碼片段示範 UNION 偵測邏輯:
if (strpos($clean, 'union') !== false &&
preg_match('~([^a-z])union($|[^a-z])~s', $clean) != 0) {
$fail = true;
$error = "union detect";
}
strpos 高效率初篩,preg_match 精準正則比對,避免誤判。同理偵測註解符、危險函數等異常行為。
傳統防禦滯後,未知漏洞被攻擊時難以溯源。MysqlIds 核心日誌功能於偵測到惡意行為時記錄完整 SQL 語句與錯誤類型:
if (!empty($fail)) {
fputs(fopen($log_file, 'a+'), "$db_string$error\r\n");
die("Hacking Detect https://www.80sec.com");
}
return $db_string;
管理者檢視日誌即可精準定位程式碼中 SQL 注入漏洞位置,大幅縮短應變時間。
DedeCMS 歷版本 SQL 注入漏洞頻出,最新版已內建 MysqlIds 於資料庫類別中。參考其做法:於資料庫操作類別的查詢執行前呼叫 MysqlIds 安全函數,即可無縫整合至任意 PHP+MySQL 專案。