康劍萍 王沈敏
(上海市質(zhì)量監(jiān)督檢驗(yàn)技術(shù)研究院 上海市 201114)
隨著互聯(lián)網(wǎng)技術(shù)廣泛深入地應(yīng)用,網(wǎng)絡(luò)安全問題不斷涌現(xiàn),特別是基于B/S 架構(gòu)的應(yīng)用軟件的缺陷和漏洞成為黑客攻擊的主要目標(biāo)。滲透測試(Penetration Testing)是軟件安全測試的主要方法,它通過模擬使用黑客的技術(shù)和方法,挖掘目標(biāo)系統(tǒng)的安全漏洞,并取得系統(tǒng)的控制權(quán),是一種發(fā)現(xiàn)業(yè)務(wù)系統(tǒng)安全隱患的評估方法。同樣,滲透測試也包括黑盒測試、白盒測試和隱秘測試[1]。
本文主要從服務(wù)器安全驗(yàn)證的角度對暴力破解、文件上傳等常見漏洞的原因進(jìn)行分析,并給出了其相應(yīng)的防范措施。
軟件的安全漏洞是軟件脆弱性的表現(xiàn),它的這種缺陷威脅著系統(tǒng)或應(yīng)用數(shù)據(jù)的完整性、保密性、可用性和訪問控制等方面,使整個(gè)系統(tǒng)面臨著巨大的安全風(fēng)險(xiǎn)。安全漏洞足以引發(fā)惡性攻擊事件,盜取成千上萬用戶的隱私資料;肆意傳播惡意病毒,造成系統(tǒng)的嚴(yán)重故障甚至癱瘓;持續(xù)性攻擊,使網(wǎng)絡(luò)癱瘓或正常訪問受到嚴(yán)重影響。
目前,B/S 架構(gòu)的應(yīng)用軟件常見的漏銅包括:SQL 注入、XSS(跨站腳本)攻擊、CSRF 攻擊、DDoS 攻擊、暴力破解、文件包含、文件上傳、越權(quán)漏洞、不安全的數(shù)據(jù)傳輸和存儲(chǔ)等。漏洞的產(chǎn)生有多種原因,計(jì)算機(jī)的馮諾依曼體系結(jié)構(gòu)決定了漏銅存在的必然性,TCP/IP 協(xié)議的互通互聯(lián)、開放性也給黑客入侵創(chuàng)造了的條件,同時(shí),軟件開發(fā)人員缺乏經(jīng)驗(yàn)、疏忽大意也是造成漏洞的主要原因。
暴力破解也稱窮舉法,是攻擊者使用密碼字典對系統(tǒng)登錄的用戶名和密碼進(jìn)行枚舉,直到能夠登錄為止。一般使用自動(dòng)化工具借助字典進(jìn)行連續(xù)性的攻擊,從理論上說,只要字典足夠強(qiáng)大、時(shí)間足夠充裕,破解總是能成功。攻擊者也可以通過撞庫的方式更高效地破解,但實(shí)際上暴力破解不會(huì)100%成功,系統(tǒng)管理員很可能會(huì)忽略它的危害。
如果一個(gè)B/S 架構(gòu)的軟件(如網(wǎng)站)沒有對登錄接口實(shí)施防暴力破解的措施,或者采取 了不合理的措施,那么這個(gè)網(wǎng)站就存在暴力破解漏洞。
登錄接口設(shè)置驗(yàn)證碼是防止暴力破解和機(jī)器識別的主要措施,不安全的驗(yàn)證碼是暴力破解得以實(shí)現(xiàn)的主要原因之一,驗(yàn)證碼主要包括客戶端驗(yàn)證和服務(wù)器端驗(yàn)證,其中客戶端驗(yàn)證形同虛設(shè),不能攔截暴力破解,而服務(wù)器端驗(yàn)證不嚴(yán)格的話也會(huì)出現(xiàn)一些問題。
從圖1中看出,驗(yàn)證碼是通過前端的JavaScript在瀏覽器中驗(yàn)證,我們用滲透測試工具Burpsuite抓取這個(gè)登錄包,用戶名和密碼不變,把驗(yàn)證碼改成錯(cuò)誤的或刪除,重放一次,查看服務(wù)器返回response中的信息,顯示登錄成功,可以說明驗(yàn)證在客戶端實(shí)現(xiàn),重放數(shù)據(jù)包成功地繞過了前端的認(rèn)證。然后通過Burpsuite 中的intruder 功能,導(dǎo)入用戶名和密碼字典,理論上只要字典的內(nèi)容足夠強(qiáng)大,就能成功地實(shí)施暴力破解。
除了驗(yàn)證碼在在前端驗(yàn)證外,不安全的因素還有驗(yàn)證碼在cookie 或在前端代碼中泄露,容易被截獲,截獲后很容易進(jìn)行暴力破解。
圖1:客戶端驗(yàn)證登錄流程
圖2:服務(wù)端驗(yàn)證登錄流程
從圖2 可以看出客戶端輸入的驗(yàn)證碼經(jīng)過了后端服務(wù)器的驗(yàn)證,這樣就給暴力破解帶來了難度,如果驗(yàn)證碼是一次一用,重放爆破就不能輕易實(shí)現(xiàn)。在Burpsuite 的intruder 中把用戶名和密碼作為可變參數(shù),驗(yàn)證碼是常量進(jìn)行爆破,如果驗(yàn)證碼是一次一用的話,同一個(gè)驗(yàn)證碼就不能通過后臺(tái)多次驗(yàn)證,也就不能爆破用戶名和密碼。
從確保安全的角度看,驗(yàn)證碼需要在服務(wù)端進(jìn)行驗(yàn)證,但是如果在服務(wù)端考慮不夠嚴(yán)格的話也會(huì)出現(xiàn)一些問題。有些驗(yàn)證碼沒有設(shè)置過期時(shí)間,導(dǎo)致在后臺(tái)長期可用;有些驗(yàn)證碼校驗(yàn)不嚴(yán)格,邏輯出現(xiàn)問題;有些驗(yàn)證碼設(shè)計(jì)太簡單和有規(guī)律,容易被猜測。其中沒有設(shè)置過期時(shí)間尤為重要,在php 中session 默認(rèn)的過期時(shí)間是24 分鐘,如果沒有配置的話,這個(gè)session 中的驗(yàn)證碼就可重復(fù)使用,從而出現(xiàn)繞過服務(wù)器驗(yàn)證進(jìn)行暴力破解的漏洞。在實(shí)際應(yīng)用中可以設(shè)置session 的過期時(shí)間,或者在驗(yàn)證碼用過之后就銷毀,達(dá)到一次一用的目的。
總結(jié)一下,防止暴力破解主要有以下措施:
(1)設(shè)置復(fù)雜密碼,應(yīng)該有長度要求和復(fù)雜度檢查(數(shù)字、字母和特殊字符的組合);
(2)登錄接口啟用安全的驗(yàn)證碼,驗(yàn)證碼在服務(wù)器端產(chǎn)生,并且保證一次一用;
(3)要對登錄行為進(jìn)行判斷和限制,多次登錄失敗應(yīng)有限制登錄措施;
(4)高安全性應(yīng)用場所是否啟用了雙因素認(rèn)證[2],可以啟用OTP 或USBkey 等措施。
文件上傳是日常網(wǎng)頁中常見的功能,也是容易產(chǎn)生攻擊的接口。如果把含有惡意代碼的文件上傳到服務(wù)器并執(zhí)行,就會(huì)產(chǎn)生文件上傳漏洞[3]。通過上傳一個(gè)帶有webshell 的木馬,執(zhí)行后攻擊者有可能獲取服務(wù)器的權(quán)限。
在網(wǎng)站或應(yīng)用系統(tǒng)上傳文件時(shí),如果未對文件進(jìn)行嚴(yán)格的校驗(yàn)和過濾,就容易造成文件上傳漏洞。一些文件上傳功能實(shí)現(xiàn)代碼沒有對上傳的文件類型及文件后綴進(jìn)行限制,造成了允許用戶上傳任意類型的文件,特別是一些可執(zhí)行文件(比如:php、exe 等),將病毒、木馬、惡意腳本或包含了腳本的圖片上傳到服務(wù)器,然后在服務(wù)器端執(zhí)行,造成服務(wù)器數(shù)據(jù)被盜或更嚴(yán)重的惡性癱瘓事件。
如果對上傳文件做了驗(yàn)證是否就安全了呢?答案是否定的。主要有以下原因:
(1)用JavaScript 在客戶端對文件類型進(jìn)行驗(yàn)證;
(2)在后端沒有對文件進(jìn)行嚴(yán)格地驗(yàn)證并做相應(yīng)改變。
在客戶端用Javascript 代碼驗(yàn)證上傳的文件類型,可以很容易繞過??梢栽跒g覽器端修改代碼或者設(shè)置成不加載所有Javascript,或者用滲透測試工具burpsuite 抓包后改包,先上傳一個(gè)后綴名為圖片(jpg/png/gif)的木馬,然后用burpsuite 攔截,再把擴(kuò)展名改成php 上傳,服務(wù)端沒有驗(yàn)證文件后綴名,這樣就成功地就繞過了客戶端的過濾。
或者我們可以直接刪除前端代碼中onsubmit 事件中驗(yàn)證上傳文件的相關(guān)代碼即可,比如刪除如下的checkfile()。
而驗(yàn)證后綴名的代碼都在前端的script 中執(zhí)行,不加載同樣可繞過。
當(dāng)瀏覽器對一個(gè)文件進(jìn)行識別時(shí),它會(huì)對這個(gè)文件定一個(gè)類型,并把這個(gè)類型放在http 頭里面,即放在Content-Type 中,上傳一個(gè)圖片的話Content-Type:image/png。在服務(wù)器端的全局變量從Content-Type 中獲取文件的類型,再把此類型與程序設(shè)置好的類型進(jìn)行比較,相同就驗(yàn)證成功,文件可上傳。這里有個(gè)很大的隱患,客戶端是可以控制Content-Type 中的內(nèi)容,即可以修改成所需類型。選擇一個(gè)php 類型的木馬上傳,通過burpsuite 抓包后把Content-Type:text/php 改成Content-Type:image/png,重放后顯示文件上傳成功。服務(wù)端只對文件類型,未對文件擴(kuò)展名進(jìn)行驗(yàn)證,繞過了服務(wù)端的檢查。那么,如果服務(wù)端既檢查了文件類型,又檢查了文件擴(kuò)展名,是否就沒有上傳漏洞了呢?我們試著把文件的后綴名改成 .php.jpg 就能成功上傳,并且能執(zhí)行此php 代碼。所以,必須通過重建文件并重命名文件的方式來阻止篡改文件擴(kuò)展名。服務(wù)端驗(yàn)證比較成熟的代碼如下:
總結(jié)一下,防止文件上傳漏洞的主要措施如下:
(1)禁止用戶上傳可執(zhí)行文件,比如:php、asp、exe 等;
(2)在服務(wù)端同時(shí)檢查文件類型和文件擴(kuò)展名;
(3)在服務(wù)端分析上傳的文件,重新創(chuàng)建并重新命名。
本文通過對網(wǎng)絡(luò)應(yīng)用軟件的滲透測試,以其中的暴力破解漏洞和文件上傳漏洞為例,詳細(xì)闡述了引起這些漏洞的相似原因:只在客戶端對驗(yàn)證碼、文件類型等做了相關(guān)驗(yàn)證,并沒有做服務(wù)器端驗(yàn)證,或者服務(wù)器端雖然做了驗(yàn)證,但沒有做嚴(yán)格的校驗(yàn)和過濾,造成抓包后驗(yàn)證容易被繞過,進(jìn)而通過竊取密碼或上傳木馬等操作獲取服務(wù)器的控制權(quán)。同時(shí),敘述了針對這些漏洞的防范措施,以避免發(fā)生不安全的事件。綜上所述,在客戶端的驗(yàn)證只能是輔助性的,最多起到對格式的限制作用,起不到實(shí)際性的作用,只有在服務(wù)器端進(jìn)行嚴(yán)格的校驗(yàn),才能避免此類漏洞的產(chǎn)生。