學(xué)校校園網(wǎng)的穩(wěn)定和發(fā)展與使用的管理軟件是分不開(kāi)的。由于ASP語(yǔ)言簡(jiǎn)單易學(xué),入門(mén)門(mén)檻不高,所以校園網(wǎng)管理人員往往都使用ASP語(yǔ)言,采用B/S模式來(lái)開(kāi)放校園網(wǎng)的程序。但同時(shí)由于設(shè)計(jì)人員的水平參差不齊,以致相當(dāng)一部分ASP代碼存在安全隱患,導(dǎo)致網(wǎng)站常出現(xiàn)數(shù)據(jù)丟失、被修改等現(xiàn)象。筆者長(zhǎng)期進(jìn)行學(xué)校網(wǎng)站維護(hù),發(fā)現(xiàn)大量這類(lèi)問(wèn)題,其大部分原因是ASP注入導(dǎo)致。本文就校園網(wǎng)出現(xiàn)ASP程序注入后的危害及判斷處理方法做了講解,相信對(duì)校園網(wǎng)的管理能起到一定的輔助作用。
一、ASP注入概述
ASP程序沒(méi)有對(duì)用戶(hù)輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患,主要表現(xiàn)在惡意用戶(hù)可以在正常提交數(shù)據(jù)時(shí),附帶提交一段代碼,以達(dá)到獲得、修改或刪除某些數(shù)據(jù)庫(kù)中的數(shù)據(jù)的目的,這就是所謂的ASP Injection,即ASP注入。由于ASP注入是從正常的HTTP(80)端口訪(fǎng)問(wèn),而且表面看起來(lái)跟一般的Web頁(yè)面訪(fǎng)問(wèn)沒(méi)什么區(qū)別,所以目前市面的防火墻都不會(huì)對(duì)ASP注入發(fā)出警報(bào)。如果管理員沒(méi)有查看IIS日志的習(xí)慣,可能被入侵很長(zhǎng)時(shí)間都不會(huì)發(fā)覺(jué)。例如出現(xiàn)這樣的現(xiàn)象:經(jīng)常發(fā)現(xiàn)有人登錄校園網(wǎng)更改網(wǎng)站的數(shù)據(jù),管理員修改了密碼也沒(méi)有用。筆者發(fā)現(xiàn),在這種情況下,網(wǎng)站的用戶(hù)名和密碼測(cè)試的代碼(頁(yè)面login.asp)為如下所示:
userName = request("userName")
passWord = request("passWord")
sqlStr="SELECT*FROM adminWHERE userName ='" & userName & "' and passWord = '" & passWord & "'"
set rs=conn.execute(sqlstr)
這段代碼的原理是先輸入用戶(hù)名和密碼,再根據(jù)輸入的用戶(hù)名、密碼到數(shù)據(jù)表admin中尋找是否存在該合法的用戶(hù),如果沒(méi)有,rs為空,如果有,rs就不為空。隨后,程序根據(jù)rs的狀態(tài)控制是否進(jìn)入管理頁(yè)面。這段代碼看上去沒(méi)有什么問(wèn)題,但是當(dāng)用戶(hù)輸入的用戶(hù)名是a,密碼是a'or'true時(shí),sqlStr就變成了select * from admin where userName = 'a' andpassWord = 'a'or 'true'。因?yàn)槠渲斜蛔⑷肓薿r'true',所以由conn執(zhí)行得到的rs肯定不會(huì)是eof,下面的程序就會(huì)認(rèn)為一個(gè)合法用戶(hù)登錄成功了,這就是這個(gè)漏洞的基本原理。由于ASP的參數(shù)可以從IE地址欄中直接提交,所以ASP注入的手法相當(dāng)靈活,注入的方法也很多。
二、判斷ASP注入惡意攻擊的方法
ASP注入是通過(guò)附加一些代碼來(lái)實(shí)現(xiàn)的,可以在數(shù)據(jù)提交處理之前,先做一個(gè)判斷,檢測(cè)提交的數(shù)據(jù)是否是合法有效的數(shù)據(jù),如果是合法的,再處理請(qǐng)求。筆者認(rèn)真分析發(fā)現(xiàn)以下數(shù)據(jù)非合法的嫌疑性比較大,現(xiàn)整理如下:"'、and、exec、insert、select、delete、update、count、*、%、chr、mid、master、truncate、char、declare 。那么我們只要判斷提交的數(shù)據(jù)里面是否包含上述數(shù)據(jù),就可以大體上判斷是否有ASP惡意攻擊的情況發(fā)生。ASP中采用FORM提交數(shù)據(jù)有兩種方式,分別是get和post?;谏鲜鰞煞N情況,處理數(shù)據(jù)前,首先筆者分別遍歷提交上來(lái)的數(shù)據(jù)的合法性,如果出錯(cuò),不再處理,就可以排除ASP注入的危險(xiǎn)性。主要代碼如下。
?。?‘判斷get提交的數(shù)據(jù),如果含有嫌疑的字符退出
dim asp_injdata
asp_injdata = "'|and|exec|insert|select| delete|update|count|*|%|chr|mid|master|truncate| char|declare"
asp_inj = split(asp_injd