由于前段時(shí)間忙于找工作,很久都沒有給黑防寫稿了,現(xiàn)在工作有著落了,繼續(xù)來支持黑防。本文我將就以ASP+Access為基礎(chǔ)構(gòu)建的網(wǎng)站可能存在的各種安全問題進(jìn)行匯總講解,給大家一個(gè)宏觀上的認(rèn)識(shí)。
攻擊方法
在黑客學(xué)習(xí)過程中,我們很容易發(fā)現(xiàn),國(guó)內(nèi)80%的網(wǎng)站幾乎使用的都是ASP,而小站的數(shù)目遠(yuǎn)遠(yuǎn)多于大型網(wǎng)站。對(duì)于小站,若是動(dòng)態(tài)網(wǎng)站,國(guó)內(nèi)普遍采用ASP+Access結(jié)構(gòu),由于使用者數(shù)量眾多,具有針對(duì)性,這里我們就來詳細(xì)研究一下ASP+Access網(wǎng)站安全的解決方案。
要建設(shè)一個(gè)安全的站,我們不能不了解目前針對(duì)ASP+Access網(wǎng)站的主流攻擊手段,時(shí)下的攻擊方法有XSS跨站、SQL注入、Cookie欺騙、%5C暴庫、上傳漏洞等。下面我們就針對(duì)這些問題做出相應(yīng)對(duì)策。
防范措施
1)上傳漏洞
對(duì)于上傳漏洞,一般的程序員都能做到在前臺(tái)避免ASP、ASA、CER等類型的文件上傳,所以對(duì)于前臺(tái)的問題,這里不再贅述。
2)XSS跨站
針對(duì)XSS跨站,最大的作用就是HTML注入和獲取Cookie。我想,更多的人是利用它來獲取Cookie,取得Cookie后,目的只有一個(gè),就是看網(wǎng)站是否有漏洞,得以讓攻擊方通過欺騙的方式進(jìn)入后臺(tái)。對(duì)于這種攻擊方法,最好的防范措施就是把服務(wù)器端的驗(yàn)證改為Session。
3)%5C暴庫
解決方案一:并不是所有的網(wǎng)站都存在%5C暴庫的問題,對(duì)于這個(gè)問題,我們可以加入ON ERROR RESUME NEXT語句,讓程序出錯(cuò)時(shí)仍繼續(xù)向下執(zhí)行,這樣,數(shù)據(jù)庫會(huì)相對(duì)安全。比如原來的conn.asp的文件內(nèi)容如下:
Response.buffer=true
Const conndata=mydata/^%$!%25#%23&%78@data(+.asp
'設(shè)置數(shù)據(jù)庫路徑
Const backdata="mydata/#數(shù)據(jù)庫備份#kycpanswpuzg1ok.asp"
'設(shè)置數(shù)據(jù)庫備份路徑
mydata="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(conndata)
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open mydata
為了防止暴庫,我們改為如下的形式:
Response.buffer=true
Const conndata=mydata/^%$!%25#%23&%78@data(+.asp
'設(shè)置數(shù)據(jù)庫路徑
Const backdata="mydata/#數(shù)據(jù)庫備份#kycpanswpuzg1ok.asp"
'設(shè)置數(shù)據(jù)庫備份路徑
On Error Resume Next
mydata="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(conndata)
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open mydata
經(jīng)過這樣的設(shè)置后,就可以有效防止這種方法的攻擊。
我們?cè)偌僭O(shè)對(duì)方通過另外的途徑獲得了我們的數(shù)據(jù)庫,想下載它,那我們?cè)趺捶乐箤?duì)方下載呢?
有些朋友可能會(huì)認(rèn)為,把數(shù)據(jù)庫改成一個(gè)復(fù)雜的名字,如^%$!%25#%23&%78@data(+.asp就可以防下載了。其實(shí),這樣跟本就做不到防下載的目的,假如你的網(wǎng)站網(wǎng)址

http://www.hacker.com.cn/data/^%$!%25#%23&%78@data(+.asp,把此地址直接復(fù)制到瀏覽器上,的確不能下載,但是經(jīng)過URL編碼后呢?我們只要把^%$!%25#%23&%78@data(+.asp用URLENCODE轉(zhuǎn)換一下,得到%5E%25%24%21%2525%23%2523%26%2578%40data%28%2B%2Easp,再把完整的URL

http://www.hacker.com.cn/data/%5E%25%24%21%2525%23%2523%26%2578%40data%28%2B%2Easp復(fù)制到迅雷,即可下載成功。
如果再作點(diǎn)調(diào)整,將數(shù)據(jù)庫加入防下載表,那么迅雷此時(shí)就無能為力了。我們首先建立一個(gè)表NotDown,設(shè)制類型為“備注”,然后在其中加入<% loop %>后,再將其類型設(shè)制為“OLE 對(duì)象”,如圖1和圖2所示。此時(shí)若在瀏覽器中下載數(shù)據(jù)庫,將會(huì)出現(xiàn)如下所示的錯(cuò)誤:
Microsoft VBScript 編譯器錯(cuò)誤 錯(cuò)誤 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft VBScript 編譯器錯(cuò)誤 錯(cuò)誤 '800a040e'
'loop' 語句缺少 'do'
/data/^%$!%25#%23&%78@data(+.asp,行227
Loop
同樣,在迅雷和其它軟件中也無法下載,這就是解決方案一。
解決方案二:將數(shù)據(jù)庫的地址設(shè)在非網(wǎng)站目錄下,假如你網(wǎng)站的路徑為“C:\Inetpub\wwwroot”,那么我們改數(shù)據(jù)庫放于d:\data\^%$!%25#%23&%78@data(+.asp,conn.asp下,修改后的代碼如下:
Response.buffer=true
Const conndata="d:\data\^%$!%25#%23&%78@data(+.asp"
'設(shè)置數(shù)據(jù)庫路徑
Const backdata="d:\data\#數(shù)據(jù)庫備份#kycpanswpuzg1ok.asp"
'設(shè)置數(shù)據(jù)庫備份路徑
On Error Resume Next
mydata="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&conndata
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open mydata
這樣相對(duì)于前面的方法而言,更為安全,因?yàn)閿?shù)據(jù)庫已不能通過HTTP下載了
4)SQL注入
現(xiàn)在SQL注入很厲害,一個(gè)大型網(wǎng)站,由于文件眾多,出現(xiàn)SQL注入漏洞也是情有可原的,F(xiàn)在多數(shù)人想到的辦法是過濾掉危險(xiǎn)的字符,如“‘”、“()”、“<>”以及Select、Update等字符,但是由于代碼太多,很有可能忽略掉其中某些未經(jīng)處理的外部數(shù)據(jù)。對(duì)此,我們可以換個(gè)角度來考慮。
我們可以想想,不管是SQL注入還是%5C暴庫,其目的都是為了獲取網(wǎng)站后臺(tái)用戶名和管理員密碼。假如我們的密碼是MD5加密的,那么對(duì)方將嘗試進(jìn)行暴力破解。如果把MD5加密算法作點(diǎn)修改,加密后,其密碼散列將發(fā)生變化,使暴力破解失效。如果再用我們修改后的MD5加密算法對(duì)密匙進(jìn)行二次MD5加密,安全性必將大大提高。
下面我們就一起來修改MD5加密算法,其方法很簡(jiǎn)單。一份原MD5加密49至53行(16位加密)的代碼如下:
RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
If (lValue And &H80000000) Then
RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
End If
注意RShift = (lValue And &H7FFFFFFE)這部分,我們只要將H7FFFFFFE稍微作點(diǎn)修改,暴力破解就失效了,比如我們修改為H7FB9DFAE。在作修改前,我們用原MD5算法加密“a”得到散列“c0f1b6a831c399e2”,

http://www.cmd5.com網(wǎng)站上可以輕松破解,如圖3所示。修改后,我們?cè)俅螌?duì)“a”加密,得到散列“8016a044f35128b8”,現(xiàn)在我們?cè)俅?IMG style="CURSOR: pointer" onclick=javascript:window.open(this.src); alt="" src="/upfile/20111118201325958.gif" onload="return imgzoom(this,550);" border=0>
由此我們可以看出,暴力破解“a”已經(jīng)失效。這樣操作后,一個(gè)字母a都破解不出來了,要是我們對(duì)a進(jìn)行二次、三次MD5加密,想想結(jié)果會(huì)是什么?破解的人別想得到結(jié)果!不過前提是對(duì)方不知道你修改的MD5算法,否則根據(jù)你修改的算法再編寫工具,暴力破解是完全可行的。所以,你要保證你的MD5.asp安全,千萬不要在程序上出現(xiàn)一個(gè)像新云網(wǎng)站管理系統(tǒng)downfile.asp中的下載任意文件的漏洞,不然,就別想著安全了。
對(duì)于上面的方法,在不過濾任何字符的情況下也可以算是安全的,讓旁注者去破解吧。如果真要做得完全不過濾,還要注意一個(gè)地方,就是登錄頁login.asp。我們可以把用戶名和密碼都改為MD5的加密密碼,然后把加密后的MD5和數(shù)據(jù)庫中的MD5作比較。這樣,絕對(duì)不可能直接利用’or’=’or’進(jìn)行后臺(tái)猜解的。比如我們?cè)瓉淼牡卿涷?yàn)證代碼如下:
sql=”select user,pwd from admin where uname=’”&request(“user”)&”’ and pwd=’”&request(“pwd”)&”’”
conn.execute(sql)
if not rs.eof and not rs.bof then
response.redirect “manage.asp”
else
response.write “登陸失敗”
end if
很明顯,上面的代碼存在注入。在不過濾的情況下,我們可以做如下的修改。
sql=”select user,pwd from admin where uname=’”&md5(request(“user”))&”’ and pwd=’”&md5(request(“pwd”))&”’”
conn.execute(sql)
if not rs.eof and not rs.bof then
response.redirect “manage.asp”
else
response.write “登陸失敗”
end if
注意,原數(shù)據(jù)庫中的用戶名和密碼都是經(jīng)過MD5加密了的。現(xiàn)在就不存在注入了,因?yàn)椤痮r’=’or’會(huì)被我們修改了的MD5加密,加密后已變成“4556995b8f421800”。
經(jīng)過上面幾種方法的防范之后,現(xiàn)在還有惟一的一個(gè)問題,就是防溯雪之類軟件的暴力破解。雖然說一個(gè)字母a經(jīng)過我們修改的MD5加密,讓針對(duì)MD5密匙破解的程序已失效,但是如果你后臺(tái)用戶名和密碼就用一個(gè)a,用溯雪幾秒鐘就能破解進(jìn)入后臺(tái)。
像溯雪這類POST和GET的攻擊,我們可以這樣修改代碼,讓Session來處理(這里不采用Cookie,因?yàn)镃ookie很容易被偽造)。
dim t1
if session("times")>=3 then
response.write("<script>alert('登錄次數(shù)超過限制,不允許再嘗試暴力破解');this.location.href='index.asp';</script>")
Response.End
sql=”select user,pwd from admin where uname=’”&md5(request(“user”))&”’ and pwd=’”&md5(request(“pwd”))&”’”
conn.execute(sql)
if not rs.eof and not rs.bof then
response.redirect “manage.asp”
else
session("times")=session("times")+1
t1=3-session("times")
response.write ("<script>alert('登陸失敗');</script>”)
response.write (”<script>alert('你還有"&t1&"次機(jī)會(huì)'); history.back();”)
end if
改為以上代碼后,只要連續(xù)提交次數(shù)超過3次,系統(tǒng)將自動(dòng)轉(zhuǎn)到首頁,這樣就有效的防范了溯雪之類的軟件攻擊,當(dāng)然,我們還可以編個(gè)稍微復(fù)雜點(diǎn)的,直接封鎖攻擊者的IP。需要注意的是,以上的方法只對(duì)ASP+Access網(wǎng)站有效。
總結(jié)
我們可以想象,攻擊者不管是通過SQL注入、XSS跨站、%5C暴庫,其直接目的就是為了得到管理員的用戶名和密碼進(jìn)入后臺(tái),然后通過上傳漏洞,或備份數(shù)據(jù)庫之類的方法得到一個(gè)WebShell。如果我們的MD5是無法破解的,只要我們程序不存在Cookie之類的欺騙和下載任意文件的漏洞,攻擊者前面作的很多事都將會(huì)是徒勞的。網(wǎng)站管理員千萬要記住,密碼是敏感的,可別被社會(huì)工程學(xué)給害了