◆張 勇 安敬鑫
(山東輕工職業(yè)學(xué)院信息中心 山東 255300 )
幾乎所有企事業(yè)單位都建設(shè)了對(duì)公眾開放的服務(wù)器,例如ftp服務(wù)器、web服務(wù)器等,這些服務(wù)器大多數(shù)使用Windows Server或Linux操作系統(tǒng),隨著互聯(lián)網(wǎng)的發(fā)展,服務(wù)器安全問題越來越突出,被攻擊事件層出不窮,因此服務(wù)器的安全防御越發(fā)重要。
為保障服務(wù)器安全,管理員采取了諸多措施,例如購買安全狗、安裝殺毒軟件、關(guān)閉無用端口、查找漏洞等等,無論采取何種措施,最好的辦法莫過于找到企圖入侵的黑客的IP并屏蔽它,為達(dá)到這個(gè)目的,本文提出了使用正則表達(dá)式分析日志、利用netsh命令自動(dòng)屏蔽非法IP的策略。
由于不同類型服務(wù)器的日志格式和防火墻命令不同,所以本策略需要具體到某類服務(wù)器才能編程實(shí)現(xiàn),本文將針對(duì)常用的Windows Server + IIS7.5服務(wù)器進(jìn)行闡述,其設(shè)計(jì)思路同樣適合于其他類型服務(wù)器。
任何服務(wù)都會(huì)提供日志文件記錄來訪用戶的詳細(xì)信息,多數(shù)日志可以以文本格式讀出。以IIS日志為例,日志文件所在目錄默認(rèn)位置是%systemroot%system32logfiles,日志格式有三種:Microsoft IIS格式、NCSA格式和W3C格式,每種格式的記錄方式略有差別,但都記錄了來訪者 IP地址、訪問的服務(wù)器端口、訪問方法(get或 post等)、訪問的 URL、訪問時(shí)間等信息。以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點(diǎn)22分43秒以GET方式訪問了本網(wǎng)站的/zs/web目錄下的首頁,返回了狀態(tài)代碼200,說明訪問成功。
netsh允許以命令行腳本方式配置當(dāng)前運(yùn)行的計(jì)算機(jī)的網(wǎng)絡(luò)參數(shù),包括修改Window防火墻配置。
多數(shù)管理員在發(fā)現(xiàn)企圖入侵的 IP后,在防火墻上以手動(dòng)方式創(chuàng)建規(guī)則,禁止非法 IP訪問本服務(wù)器,這種操作比較繁瑣,更好的辦法是使用netsh命令創(chuàng)建規(guī)則,例如:禁止 24.105.9.201訪問本服務(wù)器所有端口的netsh命令如下:
netsh advfirewall firewall add rule name="ip1" dir=in action=block remoteip=24.105.9.201
刪除 name="ip1" 規(guī)則的命令如下:
netsh advfirewall firewall delete rule name="ip1"
本策略包含以下幾個(gè)功能:
(1)定時(shí)讀取IIS日志:
(2)SQL注入檢查;
(3)惡意掃描檢查;
(4)IP屏蔽。
默認(rèn)情況下IIS日志記錄按天記錄網(wǎng)站訪問信息,如果網(wǎng)站訪問量較大,則當(dāng)天的IIS日志文件可能達(dá)到幾十甚至上百兆,IIS每分鐘內(nèi)向日志寫入大量的數(shù)據(jù)行,依靠管理員手動(dòng)分析是不可能的,即使有日志分析工具,也無法做到24小時(shí)監(jiān)控,本策略實(shí)現(xiàn)了一個(gè)定時(shí)讀取日志的功能模塊,模塊中含有Timer定時(shí)器,根據(jù)服務(wù)器負(fù)擔(dān)情況,每隔若干分鐘,讀取日志文件新寫入的數(shù)據(jù)行到數(shù)據(jù)庫。由于本策略實(shí)現(xiàn)的程序使用資源少,即使每隔1分鐘讀取一次也不會(huì)明顯增加服務(wù)器負(fù)擔(dān)。
入侵者提交的用戶請(qǐng)求,主要通過URL的get和post兩種方式進(jìn)行SQL注入攻擊,目前微軟的IIS日志并沒有記錄post提交的內(nèi)容信息,而是記錄了 get提交的 URL信息,鑒于多數(shù) SQL攻擊是通過這一方式發(fā)起的,所以分析URL可以有效的發(fā)現(xiàn)SQL攻擊行為。
以get提交方式發(fā)起的攻擊行為,具體表現(xiàn)是在URL參數(shù)中使用各類非法字符或字符串,構(gòu)造出 SQL或 CMD命令傳遞給Web服務(wù)器,從而獲取服務(wù)器敏感信息甚至控制整個(gè)Web服務(wù)器,URL參數(shù)中可能包含的非法內(nèi)容如下:
(1)非法符號(hào):?jiǎn)我?hào)、圓括號(hào)、方括號(hào)、尖括號(hào)、花括號(hào)、星號(hào)、分號(hào)等;
(2)非法關(guān)鍵詞:select、union、where、javascript、group、administrator、cmdshell、alert等;
(3)非法正則表達(dá)式:為了靈活檢查URL的合法性,需要設(shè)計(jì)出能匹配復(fù)雜非法字符串的正則表達(dá)式,例如:.*(select).*(from|where|union),如果URL匹配了此正則表達(dá)式,說明含有(select和from)或(select和where)或(select和union)三者其一,此URL就是SQL攻擊。
本策略的SQL注入檢查模塊正是通過分析URL是否含有以上三類內(nèi)容,來判斷其合法性。
由于新的SQL注入字符串不斷被入侵者構(gòu)造出來,所以本策略的注入檢查模塊將以上三類內(nèi)容放入一個(gè)XML文件中,這樣方便日后更新。
網(wǎng)站入侵者經(jīng)常使用掃描工具對(duì)網(wǎng)站進(jìn)行漏洞掃描,被掃描網(wǎng)站會(huì)在數(shù)秒內(nèi)接收到來自某個(gè)IP的成百上千次get請(qǐng)求,因此發(fā)現(xiàn)掃描行為、屏蔽掃描來源也是保護(hù)網(wǎng)站的措施之一。
模塊設(shè)計(jì)思路:
(1)設(shè)定一個(gè)單位時(shí)間訪問上限,規(guī)定本網(wǎng)站每N秒最多允許接收某IP的M個(gè)get請(qǐng)求。
(2)記錄每個(gè)IP的訪問次數(shù),每收到一個(gè)get請(qǐng)求,就將其IP來訪次數(shù)加1。
(3)模塊中定義一個(gè)Timer計(jì)數(shù)器,每隔N秒檢查所有被記錄的IP的訪問次數(shù),若發(fā)現(xiàn)某個(gè)IP發(fā)送的請(qǐng)求數(shù)量高于限定值M,就認(rèn)定此IP在掃描網(wǎng)站,需要屏蔽此IP。
發(fā)現(xiàn)了非法IP后,就要徹底屏蔽它們,管理員通常在window防火墻手動(dòng)添加規(guī)則來屏蔽 IP,這種做法無法實(shí)現(xiàn)程序自動(dòng)添加,經(jīng)驗(yàn)表明很多攻擊行為是在夜間發(fā)生的,所以本策略程序必須24小時(shí)無人值守運(yùn)行,發(fā)現(xiàn)入侵IP后能夠自動(dòng)添加屏蔽規(guī)則。
通過執(zhí)行netsh.exe命令腳本,可以在windows防火墻上添加規(guī)則,例如:netsh advfirewall firewall add rule name="IP_BLOCK1" dir=in action=block remoteIP=24.105.9.201,此命令的意思是:建立一條名稱為IP_BLOCK1的規(guī)則,禁止24.105.9.201的任何協(xié)議數(shù)據(jù)進(jìn)入本服務(wù)器的任何端口。
本策略的屏蔽IP模塊在接收到非法IP后,將此IP字符串拼接成一條netsh.exe命令腳本,使用C#語言的ProcessStartInfo和Process類執(zhí)行此命令,從而實(shí)現(xiàn)自動(dòng)添加規(guī)則,基本代碼如下:
ProcessStartInfo start = new ProcessStartInfo("netsh.exe");
start.Arguments = " advfirewall firewall delete rule name="ip_001" "; //設(shè)置命令參數(shù)
start.CreateNoWindow = true; //不顯示dos命令行窗口
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.UseShellExecute = false; //是否指定操作系統(tǒng)外殼進(jìn)程啟動(dòng)程序
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(); //關(guān)閉進(jìn)程
reader.Close(); //關(guān)閉流
本策略以window服務(wù)在后臺(tái)運(yùn)行,執(zhí)行過程大體如下:
(1)啟動(dòng)時(shí)加載自定義參數(shù),包括預(yù)定義的非法字符、非法字符串、非法正則表達(dá)式、單位時(shí)間訪問次數(shù)上限、掃描時(shí)間間隔等;
(2)定時(shí)掃描IIS日志,將新的用戶請(qǐng)求讀取到Mysql數(shù)據(jù)庫;
(3)檢查這些請(qǐng)求的URL是否含有非法內(nèi)容,若有則將IP傳給屏蔽模塊;
(4)檢查IP的來訪次數(shù)是否超過了規(guī)定的上限,若超過則將IP傳給屏蔽模塊。
程序流程圖如下:
圖1 屏蔽非法IP程序流程
本文提出的使用日志分析和netsh命令屏蔽非法IP的方法,易于編程實(shí)現(xiàn)、靈活實(shí)用,起到了主動(dòng)防御SQL注入的作用,適用于基于ASP.NET架構(gòu)的Web服務(wù)器。
[1]張慧琳,鄒維.網(wǎng)頁木馬機(jī)理與防御技術(shù)[J].軟件學(xué)報(bào),2013.
[2]安曉瑞.Asp網(wǎng)站中一句話木馬的安全性問題及防范措施的研究[J].首都師范大學(xué)學(xué)報(bào),2014.
[3]王繼剛.揭秘 WEB應(yīng)用程序攻擊技術(shù)[M].中國水利水電出版社,2009.
[4]王海峰,段友祥,劉仁寧.基于行為分析的病毒檢測(cè)引擎的改良研究[J].計(jì)算機(jī)應(yīng)用,2004.
[5]張勇,李力,薛倩.Web環(huán)境下SQL注入攻擊的檢測(cè)與防御[J].現(xiàn)代電子技術(shù),2004.