直播中
網(wǎng)絡(luò)安全已經(jīng)成為互聯(lián)網(wǎng)最熱門的話題之一,與現(xiàn)實(shí)相對(duì)應(yīng)的,網(wǎng)絡(luò)安全的部屬、實(shí)現(xiàn)也就成為一個(gè)企業(yè)特別關(guān)心的問題。所以,現(xiàn)在我們可以很容易的看到各個(gè)企業(yè)在設(shè)計(jì)自己網(wǎng)絡(luò)、構(gòu)建企業(yè)網(wǎng)站的時(shí)候,對(duì)于網(wǎng)絡(luò)安全的投入還是比較大方的,特別是一些敏感信息比較多的網(wǎng)站,比如銀行、證券等企業(yè),對(duì)于網(wǎng)絡(luò)安全更是不遺余力,市場(chǎng)上各種宣傳、廣告,也都大力推廣各種安全產(chǎn)品,比如防火墻、入侵檢測(cè)、企業(yè)防病毒等一系列的產(chǎn)品。但是,是不是使用了這些產(chǎn)品,網(wǎng)絡(luò)特別是網(wǎng)站就真的安全了?不一定,即使這些安全設(shè)備最高檔、設(shè)置也很合理,網(wǎng)站還是有被攻擊甚至完全被控制的可能。我們知道,現(xiàn)在的網(wǎng)站特別是稍微大一點(diǎn)的網(wǎng)站,一般都采用ASP、PHP或者JSP等腳本語(yǔ)言來(lái)連接數(shù)據(jù)庫(kù),取得數(shù)據(jù)庫(kù)里面的數(shù)據(jù)生成動(dòng)態(tài)網(wǎng)頁(yè),這樣,當(dāng)一個(gè)網(wǎng)站完全建立的以后,程序就會(huì)很多,特別是網(wǎng)頁(yè)設(shè)計(jì)的特殊性,服務(wù)器與用戶的交互程序特別多,所以,如果程序員不是很有經(jīng)驗(yàn)或者沒有強(qiáng)烈的安全意識(shí),程序的漏洞就會(huì)很多,給網(wǎng)站帶來(lái)不可估量的安全隱患。這些程序漏洞,一定程度上,可能比網(wǎng)站服務(wù)器的漏洞更加嚴(yán)重,因?yàn)檫@些漏洞防火墻或者入侵檢測(cè)系統(tǒng)根本無(wú)法防止。
一、編程漏洞的形成
編程漏洞怎么形成的呢?我們需要對(duì)網(wǎng)頁(yè)編程有比較全面的認(rèn)識(shí)才可以理解。首先,我們來(lái)看看網(wǎng)頁(yè)編程的特點(diǎn)。
1、網(wǎng)頁(yè)編程交互性強(qiáng)
之所以采用各種語(yǔ)言來(lái)設(shè)計(jì)網(wǎng)站而不直接采用HTML,目的就是為了更好的管理網(wǎng)站資源,增加網(wǎng)站與瀏覽者之間的交互。所以,在網(wǎng)站設(shè)計(jì)的時(shí)候,一些常見的交互編程是少不了的,比如留言版、BBS論壇,聊天室等,這些程序最大的共同點(diǎn)就是用戶輸入很多資料,通過這些資料與其他瀏覽者交流或者與網(wǎng)站管理者交流。而交互的特點(diǎn),正式漏洞形成的一大原因,因?yàn)橛脩糨斎胄畔⑹遣豢深A(yù)測(cè)的,如果程序沒有考慮到或者考慮不全面一些安全問題,用戶輸入就有可能成為攻擊事件,不管有意還是無(wú)意。
2、網(wǎng)頁(yè)編程字符處理特別多
上面我們談到,交互其實(shí)就是信息的流通。所以,這些信息的處理就是大問題,怎樣嚴(yán)格控制用戶輸入信息的內(nèi)容、信息格式、信息長(zhǎng)度都是編程需要考慮的問題。
3、網(wǎng)頁(yè)編程涉及安全最里層
我們知道,網(wǎng)頁(yè)編程直接和服務(wù)器打交道,這些程序都是直接和網(wǎng)站目錄、網(wǎng)站數(shù)據(jù)庫(kù)設(shè)置網(wǎng)站設(shè)置、系統(tǒng)設(shè)置相關(guān),通過這些程序,可以訪問網(wǎng)站目錄、設(shè)置等幾乎所有服務(wù)器內(nèi)容。仔細(xì)想,這些程序其實(shí)都是很有潛在安全問題的,因?yàn)樗鼈兲舾辛恕K?,如果程序設(shè)計(jì)有漏洞,幾乎就等于網(wǎng)站有漏洞,甚至完全開放。
4、網(wǎng)頁(yè)編程整體人員基礎(chǔ)較差
網(wǎng)頁(yè)編程人員的技術(shù)素質(zhì),這個(gè)問題其實(shí)我們可能比較少關(guān)注。在部分傳統(tǒng)程序員眼中,網(wǎng)頁(yè)程序設(shè)計(jì)其實(shí)不能稱為程序員,他們認(rèn)為網(wǎng)頁(yè)程序設(shè)計(jì),只需要美工好就可以了,完全沒有技巧可言,不叫真正的編程。之所以形成這種觀點(diǎn),有幾個(gè)原因。一是網(wǎng)頁(yè)編程相對(duì)比較簡(jiǎn)單,變化較少,基本上,網(wǎng)頁(yè)編程可以很簡(jiǎn)單的概括出幾個(gè)類型:留言版、論壇、聊天室、郵件列表、新聞發(fā)布、軟件下載等,而這些類型的編程,大部分都有模式可循,和傳統(tǒng)編程相比,的確比較簡(jiǎn)單,任意掌握;二是網(wǎng)頁(yè)編程人員大部分半路出家,專業(yè)的程序員相對(duì)較少,編程的系統(tǒng)訓(xùn)練較少,可能編程的基礎(chǔ)也比較弱,所以,編程方面可以還是有一些缺陷的;三是部分網(wǎng)站直接下載網(wǎng)上免費(fèi)程序來(lái)建立網(wǎng)站,這些程序的健壯性、安全性都沒有嚴(yán)格考慮,如果網(wǎng)站采用者不自己修改這些程序而直接照搬得話,很可能存在嚴(yán)重安全問題。
二、編程漏洞的類型
網(wǎng)頁(yè)編程相對(duì)比較簡(jiǎn)單,漏洞的形成實(shí)例雖然很多,但是,都有一些內(nèi)在地共同點(diǎn)可以尋找,以此歸納出一些共同的特點(diǎn),供我們參考。
1、用戶輸入驗(yàn)證不全面
在網(wǎng)站編程而言,有一個(gè)規(guī)則可能我們需要牢記,那就是對(duì)于用戶和用戶的輸入,都必須抱懷疑態(tài)度,不能完全信任。所以,對(duì)于用戶的輸入,不能簡(jiǎn)單的直接采用,而必須經(jīng)過嚴(yán)格驗(yàn)證,確定用戶的輸入是否符合輸入規(guī)則才可以現(xiàn)實(shí)、錄入數(shù)據(jù)庫(kù)??偨Y(jié)用戶輸入驗(yàn)證,應(yīng)該包括以下幾個(gè)方面。
(1)輸入信息長(zhǎng)度驗(yàn)證
這一點(diǎn)可能我們比較少注意,因?yàn)槲覀兺J(rèn)為一般用戶不會(huì)故意將輸入過分拉長(zhǎng),稍微有一些用戶可能搗亂,但是,在這一點(diǎn)上可能沒有危害。其實(shí),只要我們仔細(xì)考慮,如果不進(jìn)行輸入驗(yàn)證,可能的危害會(huì)相當(dāng)大,為什么?如果用戶輸入的信息達(dá)到幾個(gè)兆,而我們的程序又沒有驗(yàn)證長(zhǎng)度的話,想想的危害就有:a、程序驗(yàn)證出錯(cuò);b、變量占用大量?jī)?nèi)存,出現(xiàn)內(nèi)存溢出,至使服務(wù)器服務(wù)停止甚至關(guān)機(jī)。這樣的危害多大?
(2)輸入信息敏感字符檢查
這一點(diǎn)平時(shí)在設(shè)計(jì)程序的時(shí)候我們可能都有注意,主要關(guān)注的是一些JavaScript的敏感字符,比如在設(shè)計(jì)留言版的時(shí)候,我們會(huì)將“<”等符號(hào)的信息去除,以免用戶留下頁(yè)面炸彈。但是,是否這些就已經(jīng)足夠了呢?還遠(yuǎn)遠(yuǎn)不夠。我們還有很多沒有注意到,以下幾個(gè)方面我們需要特別注意。
a、留言版內(nèi)容信息的過濾
這一點(diǎn)上面已經(jīng)提到,平時(shí)也使用較多。
b、用戶名信息的過濾
這一點(diǎn)其實(shí)我們常常驗(yàn)證,但是,用戶名的驗(yàn)證我們往往只是驗(yàn)證長(zhǎng)度,沒有驗(yàn)證JavaScript或者HTML的標(biāo)記,這樣就容易形成漏洞。比如用戶在用戶名填入“<h1>黑</h1>”,一般的用戶名驗(yàn)證都可以通過,但是,顯示在網(wǎng)頁(yè)中卻是很不美觀的。這個(gè)輸入沒有破壞,但是,如果用戶名驗(yàn)證不嚴(yán),沒有長(zhǎng)度限制,后果怎樣呢?這樣的漏洞在網(wǎng)上很多!
c、Email信息的驗(yàn)證
Email信息我們往往也只驗(yàn)證是否含有“@”符號(hào),其他沒有限制,容易形成兩個(gè)漏洞:一是輸入信息過長(zhǎng)的內(nèi)存溢出漏洞;二是含有JavaScrript等字符信息,造成顯示用戶Email的時(shí)候形成頁(yè)面炸彈等。
d、搜索信息的驗(yàn)證
搜索信息也要驗(yàn)證嗎?當(dāng)然要驗(yàn)證!盡管搜索信息不會(huì)直接保存到網(wǎng)站服務(wù)器,但是,搜索信息確與數(shù)據(jù)庫(kù)或者服務(wù)器所有文件密切相關(guān),如果搜索信息有問題,很容易就會(huì)暴露一些本來(lái)不應(yīng)該暴露的數(shù)據(jù)庫(kù)信息或者文件信息。而且,如果用戶對(duì)程序比較了解,那么這種情況就更加需要注意,用戶可能會(huì)利用對(duì)于程序的了解,來(lái)設(shè)計(jì)一些很特別的搜索信息,而這些搜索信息其實(shí)是會(huì)檢索其他不應(yīng)該檢索的數(shù)據(jù)庫(kù)表的,必然,用戶賬號(hào)密碼表等。因此,那些從網(wǎng)上下載回來(lái)的程序,一般不適宜于直接使用,因?yàn)樗鼈兊脑a都可以被所有人知道,安全性當(dāng)然不是很好。在這種情況下,我們一般驗(yàn)證一些常見的用于數(shù)據(jù)庫(kù)操作的語(yǔ)句,必然搜索信息是否含有“Select”等,這樣來(lái)限制用戶輸入,避免信息的泄露。
2、頁(yè)面行為方式缺乏邏輯
可能這一點(diǎn)看起來(lái)很不好理解,頁(yè)面行為方式是什么呢?我們現(xiàn)在舉例說明。在一般的網(wǎng)站中,注冊(cè)新用戶的時(shí)候,一般會(huì)首先要求用戶輸入自己需要注冊(cè)的賬號(hào)信息,以此來(lái)驗(yàn)證該賬號(hào)是否已經(jīng)存在,確保用戶的單一性。這樣的要求,網(wǎng)站編程者的考慮很好,必然新浪注冊(cè)新用戶的時(shí)候,就是這樣要求的。然而,如果編程不謹(jǐn)慎,卻容易造成一個(gè)很大的漏洞,致使用戶信息流失、出錯(cuò)等情況的發(fā)生。這種情況怎樣產(chǎn)生的呢?其實(shí)很簡(jiǎn)單,這些頁(yè)面在編程的時(shí)候,認(rèn)為如果用戶的注冊(cè)信息通過了剛才我們提到的“檢測(cè)時(shí)候存在該賬號(hào)”,那么,程序就認(rèn)為這個(gè)賬號(hào)一定不存在,可以注冊(cè),在真正的注冊(cè)頁(yè)面中,直接使用“Insert Into”語(yǔ)句將注冊(cè)信息插入用戶數(shù)據(jù)庫(kù)就可以了。仔細(xì)看看這樣的注冊(cè)過程,我們發(fā)現(xiàn)有一個(gè)大的漏洞,那就是,將注冊(cè)信息插入數(shù)據(jù)庫(kù)之前,并沒有再一次檢查這個(gè)用戶是否存在,而是很簡(jiǎn)單的信任前一個(gè)檢測(cè)頁(yè)面?zhèn)鱽?lái)的賬號(hào)信息。我們知道,HTML文件是可以閱讀源代碼并且也可以直接保存的,如果用戶將注冊(cè)通過的頁(yè)面保存并且將上面的賬號(hào)信息修改為一個(gè)已經(jīng)存在的賬號(hào),由于程序認(rèn)為該賬號(hào)已經(jīng)通過檢測(cè),于是,直接將該賬號(hào)插入數(shù)據(jù)庫(kù),結(jié)果,原來(lái)?yè)碛性撡~號(hào)的用戶就被刪除或者信息被修改了。而如果這個(gè)賬號(hào)剛好是一個(gè)管理員賬號(hào),結(jié)果會(huì)怎樣呢?
可能我們認(rèn)為以上的情況很簡(jiǎn)單,的確簡(jiǎn)單,但是這種方式編程的程序員卻很多,隨便在網(wǎng)上找,我們可以找到很多這種方式編程的源代碼和已經(jīng)采用的程序。
以上就是就是頁(yè)面行為方式缺乏邏輯的典型舉例,還有沒有其他的舉例呢?我們大家都很熟悉的一個(gè)例子。在電子商務(wù)初期,一些電子商務(wù)網(wǎng)站的程序很多存在這樣的漏洞,用戶可以隨意定義自己購(gòu)買商品的價(jià)格!其實(shí)也就是這個(gè)原因造成的。
3、編程方式不成熟
很多時(shí)候,我們可能根本沒有意識(shí)到一些漏洞的產(chǎn)生,這時(shí)候,不是我們沒有注意安全問題,而是我們?nèi)鄙俳?jīng)驗(yàn)。這種情況,我們就需要多了解一些網(wǎng)絡(luò)攻擊者的進(jìn)攻方式,以此來(lái)修改程序,加固網(wǎng)絡(luò)、程序安全。我們已經(jīng)知道的一些漏洞就是這種情況產(chǎn)生的。在一些賬號(hào)密碼驗(yàn)證中,有萬(wàn)能密碼的存在就是這樣產(chǎn)生的,在下面的舉例中我們會(huì)詳細(xì)介紹。
4、沒有基于內(nèi)容的檢測(cè)
上面第一條我們提到檢測(cè)的漏洞,這里,我們專門提出基于內(nèi)容的檢測(cè)。前面多是技術(shù)上的考慮,這里,確實(shí)基于國(guó)家法律法規(guī)的考慮。一個(gè)網(wǎng)站的設(shè)計(jì)完成,除了技術(shù)的完善以外,還需要這個(gè)網(wǎng)站在國(guó)家法律法規(guī)內(nèi)發(fā)布信息,不能隨意讓自己的網(wǎng)站成為一些別用心的人發(fā)布不法信息的平臺(tái)。所以 ,我們有必要對(duì)所有用戶輸入而且有可能顯示給其他用戶的信息進(jìn)行內(nèi)容檢測(cè),一般有幾類:
(1)粗話的檢測(cè),一般我們檢測(cè)一些常見的粗話;
(2)敏感詞匯的檢測(cè),必然“法輪”“明慧”等這些詞;
(3)關(guān)系政治的詞匯,最好全部過濾,比如“共產(chǎn)黨”等;
(4)國(guó)家領(lǐng)導(dǎo)人的姓名,最好過濾;
當(dāng)然,以上的一些規(guī)則,不一定全部要這樣,可以根據(jù)自己留言、或者論壇的性質(zhì)來(lái)決定那些需要嚴(yán)格過濾。
三、攻擊實(shí)例
以下的實(shí)例,可能網(wǎng)絡(luò)上有些網(wǎng)站剛好存在這些問題,希望存在問題的網(wǎng)站能夠及時(shí)修改程序改正,讀者也不要利用這些漏洞做不符合國(guó)家法律法規(guī)的事情。
1、萬(wàn)能密碼
這個(gè)漏洞,一些讀者可能已經(jīng)知道,但是,由于網(wǎng)絡(luò)上依然很多網(wǎng)站存在這些漏洞,我們還是有必要詳細(xì)、全面的了解這個(gè)漏洞的形成原因和嚴(yán)重后果。首先,我們來(lái)看看漏洞的產(chǎn)生。這個(gè)漏洞是因?yàn)樵诔绦蝌?yàn)證賬號(hào)密碼的時(shí)候程序不嚴(yán)謹(jǐn)造成的。我們?cè)诔绦蛟O(shè)計(jì)的時(shí)候,常常將賬號(hào)、密碼放在一個(gè)叫“User”的數(shù)據(jù)表中,設(shè)置“username”和“password”兩個(gè)字段,當(dāng)驗(yàn)證的時(shí)候,檢查用戶的輸入是否存在于這個(gè)數(shù)據(jù)表,如果存在,證明這個(gè)用戶合法;不存在,證明用戶不合法。漏洞的出現(xiàn),就是這個(gè)驗(yàn)證代碼的編寫不嚴(yán)謹(jǐn)造成的,我們來(lái)看原代碼。
‘連接數(shù)據(jù)庫(kù)
Set Conn=Server.CreateObject("ADODB.Connection")
Connstr="DBQ="+server.mappath("db\news.mdb")+";DefaultDir=;DRIVER={Microsoft Access
Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;
MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
‘打開數(shù)據(jù)庫(kù)連接
Conn.Open connstr
‘?dāng)?shù)據(jù)庫(kù)選擇語(yǔ)句
mysql="select * from user where userid=’”&txtuserid&”’ and pwd=‘”&txtpwd&” "
set rs=server.createobject("adodb.recordset")
rs.open mysql,conn,1,1
if not (rs.eof) then
rs.close
conn.close
response.redirect"ok_login.asp"
end if
在以上的代碼中,我們看mysql的定義,這里的txtuserid和txtpwd都是直接來(lái)自用戶的輸入,如果用戶構(gòu)造特殊的用戶名或者密碼,就可以直接讓這里的Select條件為“真”,完全不必理會(huì)是否有合法賬號(hào)密碼。我們這里不直接給出萬(wàn)能密碼,希望有經(jīng)驗(yàn)的讀者仔細(xì)分析select語(yǔ)句,找出可能的漏洞。
以上漏洞的修改其實(shí)很多方法,我們這里提出幾種比較完善的方法參考。首先,我們可以對(duì)用戶輸入的賬號(hào)、密碼進(jìn)行嚴(yán)格檢查,除了二十六個(gè)字母和十個(gè)數(shù)字,其他任何字符都是非法的,也就是過濾那些非法的字符,確保用戶輸入合法。注意,這個(gè)過濾要針對(duì)用戶名和密碼兩個(gè)進(jìn)行;二是修改以上的select語(yǔ)句或者下面的if語(yǔ)句,從程序設(shè)計(jì)角度堵塞漏洞的產(chǎn)生;三是檢驗(yàn)用戶的輸入信息長(zhǎng)度,限制輸入信息在8個(gè)字母內(nèi),這樣,也能防止漏洞的產(chǎn)生,不過,這個(gè)方法不是很好,最好利用第一種方法。
2、取得別人賬號(hào)
這個(gè)漏洞原因已經(jīng)在上面分析了,我們現(xiàn)在來(lái)看實(shí)例。首先,我們進(jìn)入一個(gè)注冊(cè)頁(yè)面(圖1)并且隨意輸入一個(gè)賬號(hào),發(fā)現(xiàn)出現(xiàn)賬號(hào)已經(jīng)存在的信息(圖2):
這樣,我們知道這個(gè)賬號(hào)已經(jīng)存在,怎樣取得這個(gè)賬號(hào)的使用權(quán)呢?我們使用另外一個(gè)賬號(hào)注冊(cè),如果這個(gè)賬號(hào)不存在,會(huì)出現(xiàn)以下的頁(yè)面(圖3)
以上頁(yè)面,就是正常的注冊(cè)頁(yè)面,我們可以發(fā)現(xiàn)在“用戶名稱”后面,發(fā)現(xiàn)了需要注冊(cè)的“kkkkkkkkk”賬號(hào),再看看這個(gè)頁(yè)面的源代碼,查找這個(gè)賬號(hào),看這個(gè)賬號(hào)出現(xiàn)在哪些地方,我們只看關(guān)鍵的代碼:
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
<div align="center">
<input type="hidden" name="Step" value="2">
<input type="hidden" name="recName" value=kkkkkkkkk>
<table width="500" border="0" cellspacing="0" cellpadding="2">
<tr bgcolor="#000000">
<td>
<div align="center"><b><font color="#FFFFFF">普通會(huì)員注冊(cè)</font></b></div>
</td>
</tr>
</table>
在上面的代碼中,我們發(fā)現(xiàn)有兩個(gè)hidden類型的表單項(xiàng),第一個(gè)是“Step”,第二個(gè)是“recName”,從名字我們知道,第一個(gè)是注冊(cè)的步驟,對(duì)我們沒有意義;第二個(gè)是注冊(cè)的用戶名,為什么要使用“hidden”類型表單保存呢?就是為了在以下的正式注冊(cè)中直接使用這個(gè)作為用戶名。發(fā)現(xiàn)什么沒有?我們可以將這里的注冊(cè)名修改為我們剛才試驗(yàn)時(shí)候使用的注冊(cè)名“andy”,然后保存為一個(gè)HTML文件,再一次打開,填寫必要信息提交,結(jié)果,我們已經(jīng)取得該賬號(hào)的“合法”使用權(quán)。在這里需要注意的一點(diǎn)是,在以下語(yǔ)句中:
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
如果我們直接保存頁(yè)面到本機(jī),提交的時(shí)候會(huì)出錯(cuò)的,因?yàn)楸緳C(jī)不存在member/register1.jsp文件,我們必須將這里該為正確的網(wǎng)址,也就是在前面加上該網(wǎng)站的網(wǎng)址才可以提交。另外,并不是所有使用這種分步驗(yàn)證方式注冊(cè)的網(wǎng)站都存在這個(gè)漏洞。
3、繞過驗(yàn)證的“頁(yè)面炸彈”
即使頁(yè)面有嚴(yán)格的驗(yàn)證,有時(shí)候,我們還是可以繞過這些驗(yàn)證來(lái)提交一些不合法的信息,最簡(jiǎn)單的就是采用JavaScript方式驗(yàn)證的程序,因?yàn)镴avaScript的特殊性,我們可以將提交信息的頁(yè)面保存到本地計(jì)算機(jī),然后將這些JavaScript程序刪除,再提交攻擊信息,這樣,輕松的,我們就可以繞過頁(yè)面信息驗(yàn)證了。
四、總結(jié)
以上我們介紹了網(wǎng)頁(yè)編程中容易出現(xiàn)的一些漏洞,這些漏洞,其實(shí)并不只是在網(wǎng)頁(yè)編程中出現(xiàn),在其他的編程中,也有一定的參考價(jià)值。從以上的介紹中可以知道,安全的概念其實(shí)貫穿在整個(gè)網(wǎng)頁(yè)設(shè)計(jì)過程中,隨時(shí)我們都要考慮到安全的問題,這樣,我們的網(wǎng)站才會(huì)多一些安全性;同樣的,作為網(wǎng)絡(luò)攻擊者,如果隨時(shí)注意一些編程漏洞,很容易,網(wǎng)站的漏洞就可以找出來(lái)。