◆張 勇 安敬鑫
(山東輕工職業學院信息中心 山東 255300 )
幾乎所有企事業單位都建設了對公眾開放的服務器,例如ftp服務器、web服務器等,這些服務器大多數使用Windows Server或Linux操作系統,隨著互聯網的發展,服務器安全問題越來越突出,被攻擊事件層出不窮,因此服務器的安全防御越發重要。
為保障服務器安全,管理員采取了諸多措施,例如購買安全狗、安裝殺毒軟件、關閉無用端口、查找漏洞等等,無論采取何種措施,最好的辦法莫過于找到企圖入侵的黑客的IP并屏蔽它,為達到這個目的,本文提出了使用正則表達式分析日志、利用netsh命令自動屏蔽非法IP的策略。
由于不同類型服務器的日志格式和防火墻命令不同,所以本策略需要具體到某類服務器才能編程實現,本文將針對常用的Windows Server + IIS7.5服務器進行闡述,其設計思路同樣適合于其他類型服務器。
任何服務都會提供日志文件記錄來訪用戶的詳細信息,多數日志可以以文本格式讀出。以IIS日志為例,日志文件所在目錄默認位置是%systemroot%system32logfiles,日志格式有三種:Microsoft IIS格式、NCSA格式和W3C格式,每種格式的記錄方式略有差別,但都記錄了來訪者 IP地址、訪問的服務器端口、訪問方法(get或 post等)、訪問的 URL、訪問時間等信息。以NCSA格式為例,日志文件名稱為u_nc171101.log,表示這是2017年11月1日的日志,其中一條信息如下:
10.6.84.9 - - [01/Nov/2017∶10∶22∶43 +0800] "GET /zs/web/HTTP/1.1" 200 16208
此信息表示:來訪者的IP地址為10.6.84.9,在2017年11月1日10點22分43秒以GET方式訪問了本網站的/zs/web目錄下的首頁,返回了狀態代碼200,說明訪問成功。
netsh允許以命令行腳本方式配置當前運行的計算機的網絡參數,包括修改Window防火墻配置。
多數管理員在發現企圖入侵的 IP后,在防火墻上以手動方式創建規則,禁止非法 IP訪問本服務器,這種操作比較繁瑣,更好的辦法是使用netsh命令創建規則,例如:禁止 24.105.9.201訪問本服務器所有端口的netsh命令如下:
netsh advfirewall firewall add rule name="ip1" dir=in action=block remoteip=24.105.9.201
刪除 name="ip1" 規則的命令如下:
netsh advfirewall firewall delete rule name="ip1"
本策略包含以下幾個功能:
(1)定時讀取IIS日志:
(2)SQL注入檢查;
(3)惡意掃描檢查;
(4)IP屏蔽。
默認情況下IIS日志記錄按天記錄網站訪問信息,如果網站訪問量較大,則當天的IIS日志文件可能達到幾十甚至上百兆,IIS每分鐘內向日志寫入大量的數據行,依靠管理員手動分析是不可能的,即使有日志分析工具,也無法做到24小時監控,本策略實現了一個定時讀取日志的功能模塊,模塊中含有Timer定時器,根據服務器負擔情況,每隔若干分鐘,讀取日志文件新寫入的數據行到數據庫。由于本策略實現的程序使用資源少,即使每隔1分鐘讀取一次也不會明顯增加服務器負擔。
入侵者提交的用戶請求,主要通過URL的get和post兩種方式進行SQL注入攻擊,目前微軟的IIS日志并沒有記錄post提交的內容信息,而是記錄了 get提交的 URL信息,鑒于多數 SQL攻擊是通過這一方式發起的,所以分析URL可以有效的發現SQL攻擊行為。
以get提交方式發起的攻擊行為,具體表現是在URL參數中使用各類非法字符或字符串,構造出 SQL或 CMD命令傳遞給Web服務器,從而獲取服務器敏感信息甚至控制整個Web服務器,URL參數中可能包含的非法內容如下:
(1)非法符號:單引號、圓括號、方括號、尖括號、花括號、星號、分號等;
(2)非法關鍵詞:select、union、where、javascript、group、administrator、cmdshell、alert等;
(3)非法正則表達式:為了靈活檢查URL的合法性,需要設計出能匹配復雜非法字符串的正則表達式,例如:.*(select).*(from|where|union),如果URL匹配了此正則表達式,說明含有(select和from)或(select和where)或(select和union)三者其一,此URL就是SQL攻擊。
本策略的SQL注入檢查模塊正是通過分析URL是否含有以上三類內容,來判斷其合法性。
由于新的SQL注入字符串不斷被入侵者構造出來,所以本策略的注入檢查模塊將以上三類內容放入一個XML文件中,這樣方便日后更新。
網站入侵者經常使用掃描工具對網站進行漏洞掃描,被掃描網站會在數秒內接收到來自某個IP的成百上千次get請求,因此發現掃描行為、屏蔽掃描來源也是保護網站的措施之一。
模塊設計思路:
(1)設定一個單位時間訪問上限,規定本網站每N秒最多允許接收某IP的M個get請求。
(2)記錄每個IP的訪問次數,每收到一個get請求,就將其IP來訪次數加1。
(3)模塊中定義一個Timer計數器,每隔N秒檢查所有被記錄的IP的訪問次數,若發現某個IP發送的請求數量高于限定值M,就認定此IP在掃描網站,需要屏蔽此IP。
發現了非法IP后,就要徹底屏蔽它們,管理員通常在window防火墻手動添加規則來屏蔽 IP,這種做法無法實現程序自動添加,經驗表明很多攻擊行為是在夜間發生的,所以本策略程序必須24小時無人值守運行,發現入侵IP后能夠自動添加屏蔽規則。
通過執行netsh.exe命令腳本,可以在windows防火墻上添加規則,例如:netsh advfirewall firewall add rule name="IP_BLOCK1" dir=in action=block remoteIP=24.105.9.201,此命令的意思是:建立一條名稱為IP_BLOCK1的規則,禁止24.105.9.201的任何協議數據進入本服務器的任何端口。
本策略的屏蔽IP模塊在接收到非法IP后,將此IP字符串拼接成一條netsh.exe命令腳本,使用C#語言的ProcessStartInfo和Process類執行此命令,從而實現自動添加規則,基本代碼如下:
ProcessStartInfo start = new ProcessStartInfo("netsh.exe");
start.Arguments = " advfirewall firewall delete rule name="ip_001" "; //設置命令參數
start.CreateNoWindow = true; //不顯示dos命令行窗口
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.UseShellExecute = false; //是否指定操作系統外殼進程啟動程序
start.WindowStyle = ProcessWindowStyle.Hidden;
Process p = Process.Start(start);
StreamReader reader = p.StandardOutput; //截取輸出流
string line = reader.ReadLine(); //每次讀取一行
while (!reader.EndOfStream)
{
Console.Out.WriteLine(line);
line = reader.ReadLine();
}
p.WaitForExit();
p.Close(); //關閉進程
reader.Close(); //關閉流
本策略以window服務在后臺運行,執行過程大體如下:
(1)啟動時加載自定義參數,包括預定義的非法字符、非法字符串、非法正則表達式、單位時間訪問次數上限、掃描時間間隔等;
(2)定時掃描IIS日志,將新的用戶請求讀取到Mysql數據庫;
(3)檢查這些請求的URL是否含有非法內容,若有則將IP傳給屏蔽模塊;
(4)檢查IP的來訪次數是否超過了規定的上限,若超過則將IP傳給屏蔽模塊。
程序流程圖如下:

圖1 屏蔽非法IP程序流程
本文提出的使用日志分析和netsh命令屏蔽非法IP的方法,易于編程實現、靈活實用,起到了主動防御SQL注入的作用,適用于基于ASP.NET架構的Web服務器。
[1]張慧琳,鄒維.網頁木馬機理與防御技術[J].軟件學報,2013.
[2]安曉瑞.Asp網站中一句話木馬的安全性問題及防范措施的研究[J].首都師范大學學報,2014.
[3]王繼剛.揭秘 WEB應用程序攻擊技術[M].中國水利水電出版社,2009.
[4]王海峰,段友祥,劉仁寧.基于行為分析的病毒檢測引擎的改良研究[J].計算機應用,2004.
[5]張勇,李力,薛倩.Web環境下SQL注入攻擊的檢測與防御[J].現代電子技術,2004.