前言
在web蓬勃發(fā)展的今天,xss毫無(wú)疑問(wèn)已經(jīng)變成最“流行”的漏洞,我曾經(jīng)在安全公司的滲透測(cè)試報(bào)告里看到列為數(shù)十的高危xss漏洞,也看到越來(lái)越多的安 全研究人員將目標(biāo)投向xss攻擊,發(fā)現(xiàn)100個(gè)甚至1000個(gè)之上的xss。
xss變得如此流行的原因我猜測(cè)有幾點(diǎn),首先輸入輸出是一個(gè)應(yīng)用程序最基本的 交互,一個(gè)提供服務(wù)的應(yīng)用程序可以不操作數(shù)據(jù)庫(kù),可以不與系統(tǒng)交互,但是肯定會(huì)將程序的處理結(jié)果返回給瀏覽器,加上程序員如果意識(shí)不到位,就必然發(fā)生 xss,對(duì)于一個(gè)互聯(lián)網(wǎng)公司,這兩方面的因素加起來(lái)就會(huì)導(dǎo)致這個(gè)漏洞數(shù)量就非常可觀,所以可以經(jīng)常見到互聯(lián)網(wǎng)公司如騰訊,新浪,百度,搜狐等等的xss漏 洞報(bào)告。
但是,在談?wù)搙ss的時(shí)候往往大家都會(huì)說(shuō)這是一個(gè)xss漏洞,而不會(huì)提到這是個(gè)什么類型的xss漏洞,甚至這是個(gè)什么場(chǎng)景下的xss漏洞,包括有效的攻擊 方式上都不會(huì)去提,即使提到也是一些傳說(shuō)的危害譬如蠕蟲,譬如掛馬,譬如竊取用戶信息,乃至釣魚攻擊。
甚至由于種種原因,大家往往關(guān)注漏洞兩個(gè)字甚于前面 的xss。作為安全研究人員,這是一種不負(fù)責(zé)任的行為,這種行為的后果就是網(wǎng)絡(luò)安全淡化為web安全,web安全淡化為xss,而xss淡化為 alert(),總有一天程序員會(huì)不再信任我們,真正的威脅依然停留在系統(tǒng)里。這方面也有國(guó)際上的原因,太多的安全研究人員將重點(diǎn)放在xss的研究上,我 不知道是否是國(guó)外的安全水平已經(jīng)達(dá)到如此需要關(guān)注xss的水平,盡管xss是最普遍的漏洞,但是從黑客的利用程度上來(lái)看遠(yuǎn)遠(yuǎn)不如一個(gè)命令執(zhí)行,一個(gè)文件上 傳漏洞來(lái)得實(shí)在。我相信Google已經(jīng)達(dá)到這水平,但那只是Google,不是我們。
我這里不想談?wù)撊绾畏婪秞ss漏洞,如果在你的系統(tǒng)里發(fā)現(xiàn)1000個(gè)之上的xss,那你就應(yīng)該停止尋找更多的xss而該去想想如何從根源上杜絕xss,即 使杜絕不了xss那也應(yīng)該想想xss在這里是不是有什么可預(yù)見的風(fēng)險(xiǎn),如果有的話那有什么方式可以將xss的危害弱化乃至一段時(shí)期內(nèi)可以接受的程度。作為 一個(gè)黑客實(shí)用主義者,我這里將描述一次xss滲透測(cè)試的簡(jiǎn)單思想以及實(shí)現(xiàn),與學(xué)院派不同,滲透測(cè)試不能只是說(shuō)說(shuō)而已,必須真實(shí)的獲取自己想要的東西才可以 是成功。
xss滲透測(cè)試基本思路
在談?wù)摼唧w的xss攻擊之前,我們一定要清楚地知道我們的xss所處的位置在哪以及我們的xss的類型,也就是我上面說(shuō)的xss攻擊場(chǎng)景。反射型的xss 比起持久型的xss來(lái)效果是不同的,訪問(wèn)量大的xss點(diǎn)與訪問(wèn)量小的xss點(diǎn)是不同的,發(fā)生在http://www.google.com和發(fā)生在https://www.google.com的xss點(diǎn)是不同的(你應(yīng)該知道為什么不同),發(fā)生在前臺(tái)的xss點(diǎn)與發(fā)生在后臺(tái)的xss點(diǎn)同樣不同。分析 應(yīng)用程序我們可以很快確認(rèn)我們的xss點(diǎn)的場(chǎng)景,這在開放的程序里比較好確認(rèn),后面我們將講述如何在一個(gè)黑盒的環(huán)境下分析出攻擊的場(chǎng)景。
在確認(rèn)好xss點(diǎn)的場(chǎng)景之后,我們可以根據(jù)我們的目的來(lái)決定后續(xù)的攻擊方向和思路。如果發(fā)生的點(diǎn)是一個(gè)持久型的并且訪問(wèn)量比較大,你可以依據(jù)自己的喜好是 否來(lái)引起一次混亂;如果你有幸發(fā)現(xiàn)發(fā)生的點(diǎn)是在管理員的后臺(tái)或者你可以通過(guò)某些方式和管理員的后臺(tái)進(jìn)行交互,那么你可以考慮是否需要通過(guò)竊取管理員的 cookie來(lái)嘗試進(jìn)入后臺(tái),到目前為止,竊取cookie依然是最有效的攻擊方式,盡管某些xss攻擊平臺(tái)可以演示很炫的攻擊效果(前提是你的目標(biāo)會(huì)在 一個(gè)頁(yè)面停留2個(gè)小時(shí),這種情況比較少發(fā)生);如果發(fā)生的點(diǎn)是一款開源的或者所有數(shù)據(jù)請(qǐng)求你都可以分析的程序,你可以考慮利用xss做一些數(shù)據(jù)提交,但是 前提是依賴于你的xss點(diǎn)發(fā)生的場(chǎng)景;或者大氣點(diǎn),有瀏覽器0day的直接上瀏覽器0day吧,成本有點(diǎn)高,看收獲值不值得了,目前為止貌似這么說(shuō)的比這 么做的多:)
攻擊方向和思路確定之后后面的就是一些常規(guī)的體力活了,編寫攻擊代碼,獲取最終想要的東西,但是這過(guò)程可能并不是一帆風(fēng)順,甚至需要反復(fù)的調(diào)試攻擊代碼以保證最終的效果跟預(yù)期的一致。
一次黑盒的xss滲透測(cè)試
因?yàn)槟承┰蛭覀兒芟霚y(cè)試下國(guó)內(nèi)一個(gè)比較有名的評(píng)論網(wǎng)站,我們簡(jiǎn)單測(cè)試常規(guī)的安全漏洞之后我們沒有發(fā)現(xiàn)什么有意思的如SQL注射之類的安全漏洞,甚至我們 還沒有辦法找到它的后臺(tái),但是我們發(fā)現(xiàn)了他們的一個(gè)xss漏洞,比較悲觀的是這是一個(gè)反射型的xss漏洞,所以我們不能直接把他頁(yè)面黑了(如果是持久類型 的xss,攻擊目的就是破壞或者測(cè)試的話就可以考慮這么做,當(dāng)然,如果是為了YY也是可以的)。我們不要YY,我們要shell。
通過(guò)對(duì)站點(diǎn)的分析我們發(fā) 現(xiàn)系統(tǒng)有個(gè)投稿功能,通過(guò)審核之后就可以發(fā)表。既然會(huì)有審核那么就意味著應(yīng)該有后臺(tái)之類的東西,同時(shí)我們實(shí)際上獲得了一個(gè)和管理員交互的平臺(tái),因?yàn)槲覀儗?的內(nèi)容他們肯定會(huì)看。于是我們將編寫好的xss exploit url寫到文章里,并且聲稱在他們的站點(diǎn)內(nèi)發(fā)現(xiàn)了一個(gè)黃色的文章。這個(gè)xss exploit url會(huì)請(qǐng)求我的某個(gè)php文件,這個(gè)文件將記錄所有請(qǐng)求的referer,cookie,ip,瀏覽器類型和當(dāng)前的location。
等待幾十分鐘之 后,我們順利獲得了這些基礎(chǔ)信息,但是我們發(fā)現(xiàn)這里的location和referer只能獲得我們的xss exploit url,這跟我們希望獲得的管理員后臺(tái)并不一致。分析管理員在后臺(tái)的操作我們大概可以知道他是點(diǎn)擊連接來(lái)訪問(wèn)這個(gè)url的,那么我們是可以獲得 opener窗口的一些信息的,包括location等等。在獲得location之后我們還是很失望,這只是一個(gè)內(nèi)容展現(xiàn)的窗口,并不是后臺(tái)的真正管理 的地址,后臺(tái)應(yīng)該是有一個(gè)iframe類的東西,于是我們?cè)俅瓮ㄟ^(guò)top.location獲得后臺(tái)的地址,這次對(duì)了,在我們的面前出現(xiàn)了后臺(tái)登陸的地 址,后面的利用竊取的cookie進(jìn)入后臺(tái)很可行哦:)但是我們?cè)趪L試?yán)胏ookie進(jìn)入后臺(tái)時(shí)依然出了問(wèn)題,我們的cookie看起來(lái)并不有效,這是 為什么呢?后來(lái)幾次測(cè)試之后才發(fā)現(xiàn)程序做了cdn,我們?cè)L問(wèn)到的登錄地址并不是cookie所在的服務(wù)器,做了個(gè)host之后我們順利登錄進(jìn)后臺(tái),后臺(tái)界 面出來(lái)的一瞬間讓人感覺真是幸福:)
后面的就簡(jiǎn)單,找后臺(tái)的上傳,傳webshell,涂首頁(yè):)
很明顯,在這樣一個(gè)場(chǎng)景下如果說(shuō)到xss來(lái)做蠕蟲肯定是不現(xiàn)實(shí)的,對(duì)于一個(gè)評(píng)論網(wǎng)站來(lái)說(shuō)釣魚也沒有什么實(shí)際意義,對(duì)一個(gè)連用戶機(jī)制都沒有或者有用戶機(jī)制但 是用戶交互比較低的應(yīng)用程序來(lái)說(shuō)偷取用戶cookie同樣也沒有價(jià)值。而真正攻擊的過(guò)程中也不是簡(jiǎn)單的說(shuō)說(shuō)那么容易,應(yīng)用程序有很多機(jī)會(huì)可以防止這種攻擊 的發(fā)生,包括cookie和ip綁定,cookie做httponly,后臺(tái)設(shè)置登錄ip限制等等(不要跟我說(shuō)那些看起來(lái)很神仙可以反彈的xss工具,這 就跟物理學(xué)里面的理想環(huán)境里的實(shí)驗(yàn)一樣不靠譜)。
在對(duì)未知的程序進(jìn)行測(cè)試時(shí),可能某些xss點(diǎn)發(fā)生在后臺(tái)等我們未知的地方,而如果我們直接提交敏感的語(yǔ)句 如[HTML_REMOVED]alert()[HTML_REMOVED]等過(guò)去的時(shí)候,我們是無(wú)法知道程序的返回結(jié)果的,而且一旦程序?qū)斎胱隽颂?理,在后臺(tái)出現(xiàn)亂碼等字符時(shí),很容易引起別人的警覺。這個(gè)時(shí)候我們引入類似于滲透測(cè)試中經(jīng)常使用的掃描的手法,在xss滲透測(cè)試時(shí)我們可以利用
一次白盒的xss滲透測(cè)試
因?yàn)槟承┰蛭覀兿牒诘裟硞€(gè)人的blog,該blog系統(tǒng)的源碼我們可以從網(wǎng)上獲取到,在簡(jiǎn)單審核一些代碼之后我們沒有發(fā)現(xiàn)明顯的SQL注射之類的漏洞, 但是發(fā)現(xiàn)了幾個(gè)非常有意思的xss漏洞,該漏洞同樣是反射型的xss,但是因?yàn)槌绦虻脑蚩梢允沟胑xploit url變形得非常隱蔽。由于程序開源,我們通過(guò)本地搭建該環(huán)境可以輕松構(gòu)造出可以加管理員,可以在后臺(tái)寫shell的小型exploit,并且將 exploit通過(guò)遠(yuǎn)程的方式隱藏在前面的exploit url里。
通過(guò)分析該程序發(fā)現(xiàn)在評(píng)論回復(fù)時(shí)只有登錄才可以回復(fù),而目標(biāo)經(jīng)常性回復(fù)別人的評(píng)論,所以我們發(fā)表了一個(gè)評(píng)論并且將exploit url寫在里面,通過(guò)一些手段誘使目標(biāo)會(huì)訪問(wèn)該url。在等待幾個(gè)小時(shí)之后,我們看到該評(píng)論已經(jīng)被管理員回復(fù),那么我們的exploit也應(yīng)該是被順利執(zhí) 行了。上后臺(tái)用定義好的賬戶登錄,很順利,shell也已經(jīng)存在。OK,最后就是涂首頁(yè):)
對(duì)于這部分沒有什么特別好說(shuō)的,因?yàn)樗械臄?shù)據(jù)和邏輯都是公開的,但是非常重要的一點(diǎn)依然是我們的場(chǎng)景。在某些應(yīng)用程序里,因?yàn)榍芭_(tái)的交互比較多,發(fā)生 xss的點(diǎn)是前臺(tái),大部分用戶的操作也都是前臺(tái)發(fā)生的,但是這部分的權(quán)限非常沒有意義,我們往往需要特定目標(biāo)先訪問(wèn)后臺(tái),然后從后臺(tái)訪問(wèn)我們的xss點(diǎn)才 能獲取相應(yīng)的權(quán)限。這部分的攻擊就變得比較困難了,而上面的攻擊里,由于目標(biāo)肯定會(huì)先訪問(wèn)后臺(tái)然后訪問(wèn)該xss點(diǎn),所以xss變得有趣多了。
總結(jié)
xss的利用是一件非常有意思的事情,甚至可以獨(dú)立于xss的查找成為一門學(xué)問(wèn),最關(guān)鍵的一點(diǎn)是所有的xss都不要脫離場(chǎng)景,脫離場(chǎng)景地談?wù)撀┒春懿回?fù)責(zé)任。我給出的例子都是比較簡(jiǎn)單的,希望可以與大家更多地討論更多的有意思的攻擊。
下一篇:SQL注入漏洞