上一篇中給大家著重談了“ADO 存取數(shù)據(jù)庫時(shí)如何分頁顯示”的問題,有位朋友來信給我指出我在計(jì)算頁面總數(shù)時(shí)忽略了 Recordset 對(duì)象的一個(gè)重要參數(shù)“PageCount”,它能在給 Pagesize 賦值后自動(dòng)得出頁面的總數(shù),而無須用“INT(RS.recordcount/PgSz*-1)*-1”這樣繁瑣的公式。我要感謝這位朋友熱心地給我指出程序中的不足,由于這個(gè)程序是我在很久以前寫的,因?yàn)樵诜猪擄@示的時(shí)候記錄的總數(shù)不一定能整除頁面顯示記錄的數(shù)目,而當(dāng)時(shí)我又不能肯定 PageCount 是否能正確得出頁面的數(shù)目,所以偷懶寫了這個(gè)公式:),說實(shí)話我到現(xiàn)在還都沒試過用 pagecount,有興趣的朋友千萬要試一下哦,可別學(xué)我的懶惰呀。
最近我在 chinaasp 的 bbs 上討論問題時(shí)發(fā)現(xiàn)很多朋友對(duì)于 asp 的一些安全性問題不甚了解,甚至不知道如何解決最常見的 asp::$DATA 顯示源代碼的問題,因此我覺得非常有必要在這里給廣大朋友們重點(diǎn)談一談這個(gè)問題,在征得 chinaasp 飛鳥的同意下,我將他曾經(jīng)寫過的一點(diǎn)關(guān)于 asp 漏洞的介紹加上我自己的一些實(shí)踐經(jīng)驗(yàn)?zāi)贸鰜斫o大家詳細(xì)分析一下這個(gè)對(duì)于 webmaster 來說至關(guān)重要的 asp 的安全性問題。
當(dāng)去年 ::$DATA 的漏洞被發(fā)現(xiàn)并公布的第二天,我曾經(jīng)檢測(cè)了當(dāng)時(shí)國內(nèi)大部分運(yùn)用 asp 的站點(diǎn),其中百分之九十九都存在以上可以看見源代碼的問題,當(dāng)日我甚至在微軟的站點(diǎn)上抓下了 search.asp 這個(gè)文件的源代碼?赡苣銜(huì)覺得看到源代碼并沒有什么大礙,如果作為 webmaster 的你這么想就大錯(cuò)特錯(cuò)了。譬如,如果 asp 程序員將站點(diǎn)的登陸密碼直接寫在 asp 里,那么一旦源碼被發(fā)現(xiàn),他人就可以很容易的進(jìn)入本不該被看到的頁面,我就曾經(jīng)利用這個(gè)方法免費(fèi)成為了一個(gè)收費(fèi)網(wǎng)站的成員(大家可別揭發(fā)我哦。,而且很多數(shù)據(jù)庫的連接用戶名和密碼也都是直接寫在 asp 里,一旦被發(fā)現(xiàn),如果你的數(shù)據(jù)庫允許遠(yuǎn)程訪問而且沒有設(shè)防的話就相當(dāng)危險(xiǎn)了。在一些用 asp 開發(fā)的 bbs 程序中,往往使用的是 access mdb 庫,如果 mdb 庫存放的路徑被獲知,數(shù)據(jù)庫就很有可能被他人下載,加之如果數(shù)據(jù)庫里含有的密碼不加密,那就非常危險(xiǎn)了,獲取密碼的人如果有意進(jìn)行惡意破壞,他只需要以 admin 身份登陸刪除所有 bbs 里的帖子,就夠你嗆的了。下面列出了目前已經(jīng)發(fā)現(xiàn)的一些漏洞,希望大家提高警惕一、經(jīng)過實(shí)驗(yàn)我們發(fā)現(xiàn), win95+pws 上運(yùn)行 ASP 程序,只須簡單地在瀏覽器地址欄的 asp 文件名后多加一個(gè)小數(shù)點(diǎn) ASP 程序就會(huì)被下載下來。 IIS3 也存在同樣的問題,如果你目前還在使用 IIS3 一定要測(cè)試一下。
二、 iis2、 iis3、 iis4 的一個(gè)廣為人知的漏洞就是 ::$DATA,通過它使用 ie 的 view source 或 netscape 直接訪問該 asp 文件就能輕而易舉地看到 asp 代碼。 win98+pws4 不存在這個(gè)漏洞。
究竟是什么原因造成了這種可怕的漏洞呢?究其根源其實(shí)是 Windows NT 特有的文件系統(tǒng)在做怪。有一點(diǎn)常識(shí)的人都知道在 NT 提供了一種完全不同于 FAT 的文件系統(tǒng): NTFS,這種被稱之為新技術(shù)文件系統(tǒng)的技術(shù)使得 NT 具有了較高的安全機(jī)制,但也正是因?yàn)樗a(chǎn)生了不少令人頭痛的隱患。大家可能不知道, NTFS 支持包含在一個(gè)文件中的多數(shù)據(jù)流,而這個(gè)包含了所有內(nèi)容的主數(shù)據(jù)流被稱之為“DATA”,因此使得在瀏覽器里直接訪問 NTFS 系統(tǒng)的這個(gè)特性而輕易的捕獲在文件中的腳本程序成為了可能。然而直接導(dǎo)致 ::$DATA 的原因是由于 IIS 在解析文件名的時(shí)候出了問題,它沒有很好地規(guī)范文件名。
我們?cè)撊绾谓鉀Q這個(gè)問題呢?辦法有幾種:
a、是將 .asp 文件存放的目錄設(shè)置為不可讀(ASP 仍能執(zhí)行),這樣 html、 css 等文件就不能放在這個(gè)目錄下,否則它們將不能被瀏覽。
b、是安裝微軟提供的補(bǔ)丁程序,下載的地址如下(注意針對(duì)不同的系統(tǒng)有不同的補(bǔ)。
該補(bǔ)丁是針對(duì) IIS3, Intel 平臺(tái)
ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis3-datafix/iis3fixi.exe
該補(bǔ)丁是針對(duì) IIS3, Intel 平臺(tái)
ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis3-datafix/iis3fixa.exe
該補(bǔ)丁是針對(duì) IIS4, Alpha 平臺(tái)
ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixi.exe
該補(bǔ)丁是針對(duì) IIS4, Alpha 平臺(tái)
ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixa.exe
c、是在服務(wù)器上安裝 ie4.01sp1,這個(gè)是否有效,作者本人沒具體試過。
d、存粹作者的個(gè)人意見,盡量安裝英文版的 NT,而不要使用中文版,究其原因作者也說不清,只是根據(jù)實(shí)踐經(jīng)驗(yàn)英文版的 NT 較中文版 bug 少,如果哪位朋友知道原因千萬要告訴我。
三 . 支持 ASP 的免費(fèi)主頁空間以及虛擬主機(jī)服務(wù)的服務(wù)器面臨的問題
1、服務(wù)器上的 ASP 代碼很可能被人其他擁有 asp 權(quán)限的人非法獲取。
舉個(gè)很簡單的例子,在微軟提供的 ASP1.0 的例程里有一個(gè) .asp 文件專門用來查看其它 .asp 文件的源代碼,該文件為 ASPSamp/Samples/code.asp。如果有人把這個(gè)程序上傳的服務(wù)器,而服務(wù)器端沒有任何防范措施的話,他就可以很容易地查看他人的程序。
例如 :
code.asp?source=/directory/file.asp
2、使用的 ACCESS mdb 數(shù)據(jù)庫可能被人下載一般來說在提供 asp 權(quán)限的免費(fèi)主頁服務(wù)器上不可能提供代為設(shè)定 DSN 的服務(wù),因此 asp 程序使用的數(shù)據(jù)庫通常都局限在使用 mdb 庫,而 mdb 遠(yuǎn)端數(shù)據(jù)庫所在的位置是使用我們?cè)诘谑钠谥兄v到過的 DSN-less 方法直接在 asp 中指定的,方法如下 :
正如前文所言,在這種情況下 mdb 庫很可能被他人下載,從而造成諸如密碼等的泄露。
所以,作為 webmaster 應(yīng)該采取一定的措施,嚴(yán)禁 code.asp 之類的程序(似乎很難辦到 , 但可以定期檢索特征代碼),限制 mdb 的下載。
3、來自強(qiáng)大的 filesystemobject 組件的威脅
IIS3、 IIS4 的 ASP 的文件操作都可以通過 filesystemobject 實(shí)現(xiàn),包括文本文件的讀寫目錄操作、文件的拷貝改名刪除等,但是這個(gè)強(qiáng)大的功能也留下了非常危險(xiǎn)的“后門”。利用 filesystemobjet 可以篡改下載 fat 分區(qū)上的任何文件。即使是 ntfs 分區(qū),如果權(quán)限沒有設(shè)定好的話,同樣也能破壞,一不小心你就可能遭受“滅頂之災(zāi)”。遺憾的是很多 webmaster 只知道讓 web 服務(wù)器運(yùn)行起來,很少對(duì) ntfs 進(jìn)行權(quán)限設(shè)置,而 NT 目錄權(quán)限的默認(rèn)設(shè)置偏偏安全性又低得可怕。因此,如果你是 Webmaster,作者強(qiáng)烈建議你密切關(guān)注服務(wù)器的設(shè)置,盡量將 web 目錄建在 ntfs 分區(qū)上,目錄不要設(shè)定 everyone full control,即使是是管理員組的成員一般也沒什么必要 full control,只要有讀取、更改權(quán)限就足夠了。
四、 ASP 應(yīng)用程序可能面臨的攻擊過去許多 Internet 上 CGI 寫的留言本或 BBS 是把客戶輸入的留言變?yōu)橐粋(gè)變量,然后再把這個(gè)變量插入到顯示留言的 HTML 文件里,因此客戶輸入的文本如要在 HTML 文件里顯示就得符合 HTML 標(biāo)準(zhǔn),而 CGI 程序里一般都加入了特定的 HTML 語言。當(dāng)客戶輸入內(nèi)容,插入 HTML 文件時(shí),即同時(shí)插入到了頭尾 HTML 語句中,如:
< font> 客戶輸入的變量 < /font> 但如果把前后的 HTML 標(biāo)記給敝屏了,就可以做很多事情了。
如輸入時(shí)打上:
< /font> 符合 HTML 標(biāo)準(zhǔn)的語句 < font> 前后的 < font> 是用來敝屏 CGI 中的 HTML 語句用的。插入到 HTML 文件里的就變成了:
< font>< /font> 符合 HTML 標(biāo)準(zhǔn)的語句 < font>< /font> 由于這樣一個(gè)特性,使得寫個(gè) javascript 的死循環(huán)變得非常容易,只要在輸入框中輸入:
< a href="URL" onMouseover="while(1){window.close(\\\\\\\\\\\\\\\'/\\\\\\\\\\\\\\\')}"> 或 < a herf="URL" onMousever="while(ture){window.close(\\\\\\\\\\\\\\\'/\\\\\\\\\\\\\\\')}"> 那么就能讓其他查看該留言的客戶的瀏覽器因死循環(huán)而死掉。 ASP 開發(fā)的程序同樣可能存在這個(gè)問題,因此當(dāng)你用 asp 編寫類似程序時(shí)應(yīng)該做好對(duì)此類操作的防范,譬如可以寫一段程序判斷客戶端的輸入,并屏蔽掉所有的 HTML、 Javascript 語句。
看完本期后,如果你非常的震驚,那么你必須徹底對(duì)你現(xiàn)有的網(wǎng)站或 asp 程序進(jìn)行一翻檢測(cè),看看是否存在上述漏洞。如果你對(duì)文中所談到的漏洞都有所了解并已有足夠的對(duì)策,那么在恭喜你的同時(shí),還是要提醒你經(jīng)常查看你的網(wǎng)站和 asp 程序,如果你有數(shù)據(jù)庫也應(yīng)該經(jīng)常查看,以防他人利用一些我們未知的漏洞進(jìn)行攻擊。最后,如果你對(duì)本文所談?wù)摰?asp 安全性問題有什么獨(dú)特的見解,或?qū)β┒从行碌陌l(fā)現(xiàn),希望能來信同我探討。