廖 微
(軍事科學(xué)院系統(tǒng)工程研究院軍事新能源技術(shù)研究所 北京 102300) (nyyth2019@163.com)
5G的普及使得人類(lèi)社會(huì)步入了新的發(fā)展階段,電子設(shè)備遍及國(guó)民生活的方方面面.伴隨著智能化出現(xiàn)的是迅速增長(zhǎng)的電力需求.在這種趨勢(shì)下,現(xiàn)有的集中式發(fā)電系統(tǒng)結(jié)構(gòu)復(fù)雜、成本高,而且遠(yuǎn)距離傳輸和高強(qiáng)度運(yùn)行難以滿足更加多樣化和高質(zhì)量的供電需求[1-2].為了充分利用可再生能源發(fā)電的技術(shù)優(yōu)勢(shì),分布式的微電網(wǎng)模式成為人們的關(guān)注熱點(diǎn).智能微電網(wǎng)是與傳統(tǒng)的集中式電網(wǎng)系統(tǒng)相對(duì)的概念.它在傳統(tǒng)的輸配電基礎(chǔ)上,將可再生能源發(fā)電技術(shù)作為新型分布式電源,通過(guò)部署集成能源管理系統(tǒng)(EMS)和物聯(lián)網(wǎng)技術(shù)實(shí)現(xiàn)了一種新的環(huán)境友好型發(fā)電模式[3].按照一定的拓?fù)浣Y(jié)構(gòu),多個(gè)分布式電源及負(fù)載等可以形成獨(dú)立、小型的網(wǎng)絡(luò)并關(guān)聯(lián)至傳統(tǒng)的主網(wǎng)中,由靜態(tài)開(kāi)關(guān)作為中間樞紐.其中,微電網(wǎng)能量管理系統(tǒng)(MGEMS)需要借助互聯(lián)網(wǎng)技術(shù)收集和處理大量的實(shí)時(shí)數(shù)據(jù),進(jìn)行調(diào)度決策和管理控制,是整個(gè)系統(tǒng)的控制中樞.一旦其中的Web應(yīng)用存在漏洞,攻擊者就能夠攻擊系統(tǒng)服務(wù)器,竊取電力數(shù)據(jù)甚至擾亂電能的正常傳輸與配送.因此,針對(duì)MGEMS設(shè)計(jì)和實(shí)現(xiàn)完備的Web應(yīng)用漏洞檢測(cè)工具進(jìn)行測(cè)試并提前發(fā)現(xiàn)漏洞,必然能夠提高整個(gè)智能微電網(wǎng)系統(tǒng)的安全性.
2020年,國(guó)家信息安全漏洞共享平臺(tái)(CNVD)共收錄19 964個(gè)漏洞,其中,中高危漏洞共計(jì)17 542個(gè),所占比重高達(dá)87.9%,相較于2019年同比增加24.39%.圖1是不同漏洞類(lèi)型的分布圖.
圖1 2020年不同類(lèi)型漏洞占比
可以看出,Web應(yīng)用程序漏洞位居第2位,僅次于未詳細(xì)列出的其他所有漏洞類(lèi)型總和.不僅如此,這些漏洞數(shù)量并不包括未被發(fā)現(xiàn)或者黑客團(tuán)隊(duì)發(fā)現(xiàn)自行利用的,這種隱藏的漏洞可能才是最影響Web安全性的.比如2015年Hacking Team數(shù)據(jù)泄露事件就造成了很大的影響.Hacking Team是一家專(zhuān)門(mén)從事監(jiān)視技術(shù)的公司,主要協(xié)助政府監(jiān)控公民,被某組織攻擊后,包括多個(gè)0day漏洞的exp,公民信息文件在內(nèi)的400 G的數(shù)據(jù)在網(wǎng)絡(luò)上公開(kāi).其中的幾個(gè)flash漏洞可以影響幾乎所有的Web應(yīng)用并無(wú)法在短時(shí)間內(nèi)修復(fù),這使得許多用戶的信息被竊取.此外,由于Web應(yīng)用的用戶群體龐大,信息傳播速度更快,造成的危害難以想象.
在智能微電網(wǎng)系統(tǒng)中,MGEMS包含大量的物聯(lián)網(wǎng)數(shù)據(jù)交互和操縱過(guò)程,不可避免地要大規(guī)模應(yīng)用Web技術(shù),這使其面臨更多的潛在漏洞[4].一旦被不法分子發(fā)現(xiàn)和利用,不僅用戶的用電數(shù)據(jù)和個(gè)人隱私信息被泄露和推斷,整個(gè)電力調(diào)配系統(tǒng)也很容易被惡意操縱,影響國(guó)民生產(chǎn)生活的整個(gè)過(guò)程.因此,本文針對(duì)智能微電網(wǎng)系統(tǒng)中涉及的Web安全,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)較為全面的漏洞檢測(cè)框架,以增強(qiáng)智能微電網(wǎng)系統(tǒng)的安全性和可靠性.
智能微電網(wǎng)是相對(duì)于傳統(tǒng)智能電網(wǎng)的一個(gè)概念,它將可再生能源技術(shù)、分布式電源、儲(chǔ)能裝置、能源管理系統(tǒng)和輸配電基礎(chǔ)設(shè)施高度集成[5].它既可以看作是電力系統(tǒng)中一個(gè)可控制的調(diào)度單元,能在數(shù)秒內(nèi)對(duì)中央控制系統(tǒng)的指令作出反應(yīng).同時(shí)也可以看作是針對(duì)用戶的可定制電源,以滿足多樣化的用電需求.其智能化主要體現(xiàn)在微電網(wǎng)中采用多樣化的傳感技術(shù)和物聯(lián)網(wǎng)設(shè)備來(lái)監(jiān)測(cè)底層運(yùn)行數(shù)據(jù)并進(jìn)行有效控制,通過(guò)模型仿真進(jìn)行實(shí)時(shí)分析,挖掘電力特征并制定合理的輸配電策略.如圖2所示,這一切的控制中樞就是其內(nèi)部的微網(wǎng)能量管理系統(tǒng),是保證微網(wǎng)安全運(yùn)行、有效調(diào)度決策的最重要組成部分.
微電網(wǎng)的概念最早由美國(guó)提出,因此美國(guó)在相關(guān)領(lǐng)域的研究和實(shí)踐起步更早,發(fā)展更快,成果更突出.歐洲自1998年逐步開(kāi)始對(duì)微電網(wǎng)進(jìn)行研發(fā),針對(duì)相關(guān)的能源集成、協(xié)調(diào)控制等管理方案形成了一套基本的理論體系.我國(guó)微電網(wǎng)雖然仍處于起步階段,但也吸引了大量的人力物力資源,通過(guò)在研究項(xiàng)目中不斷實(shí)踐和摸索,取得了一定成果并確定了基本的技術(shù)路線和發(fā)展目標(biāo).其中,促進(jìn)微電網(wǎng)系統(tǒng)智能化、安全化是主要研究方向之一.
圖2 微電網(wǎng)控制結(jié)構(gòu)
Web應(yīng)用中的漏洞主要可以分為2大類(lèi):
一類(lèi)是Web應(yīng)用所依托的服務(wù)器和數(shù)據(jù)庫(kù)軟件自身的漏洞[6].這些漏洞和桌面應(yīng)用程序的漏洞比較類(lèi)似,主要有緩沖區(qū)溢出、遠(yuǎn)程代碼執(zhí)行、拒絕服務(wù)等.現(xiàn)在比較受歡迎的Apache,IIS,Nginx等服務(wù)器以及常用的數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL,MS SQL Server,Oracle等都或多或少出現(xiàn)過(guò)一些比較嚴(yán)重的漏洞.由于幾乎每個(gè)Web應(yīng)用中都會(huì)用到服務(wù)器和數(shù)據(jù)庫(kù)軟件,一旦這些軟件出現(xiàn)問(wèn)題,就很可能被攻擊者批量利用,影響會(huì)非常大.
另一類(lèi)是Web應(yīng)用本身出現(xiàn)的漏洞,可以分為以下4類(lèi):
1) SQL注入漏洞.
SQL注入漏洞是Web應(yīng)用中最常見(jiàn)的一種漏洞,通過(guò)該漏洞可以獲取數(shù)據(jù)庫(kù)中的信息,讀取本地文件,甚至執(zhí)行一些命令.SQL注入漏洞在1999年就已出現(xiàn),并在2003年前后危害到達(dá)頂峰[7].即使到現(xiàn)在它仍然是OWASP TOP10上的前幾位.
2) 跨腳本攻擊(XSS)漏洞.
跨站腳本攻擊(cross site script, CSS)漏洞主要在前端出現(xiàn),但同樣也是由于后臺(tái)程序過(guò)濾不嚴(yán)導(dǎo)致的.為了避免與層疊樣式表CSS命名沖突,將其簡(jiǎn)稱為XSS[8].
3) 跨站請(qǐng)求偽造(CSRF)漏洞.
CSRF是一種欺騙用戶的瀏覽器跨站點(diǎn)去訪問(wèn)一個(gè)需要認(rèn)證的網(wǎng)站,并執(zhí)行非自愿操作的攻擊手段[9].在實(shí)際攻擊中,CSRF漏洞常常和XSS漏洞配合使用,特別是當(dāng)網(wǎng)站存在同源策略的限制時(shí).
4) 未授權(quán)訪問(wèn)漏洞.
在Web應(yīng)用中用戶需要登錄才能訪問(wèn)頁(yè)面中的某些內(nèi)容.但當(dāng)不同的用戶僅僅是通過(guò)URL中的ID參數(shù)來(lái)區(qū)分而不添加訪問(wèn)控制時(shí),他們彼此之間就可以相互查看或修改個(gè)人信息[10].
以上只是列舉的Web應(yīng)用中常見(jiàn)的漏洞,并不局限于此.因此,能夠檢測(cè)和識(shí)別Web系統(tǒng)中潛在的漏洞威脅對(duì)維護(hù)整個(gè)網(wǎng)絡(luò)空間的安全是至關(guān)重要的.
為了減少Web應(yīng)用漏洞的危害,國(guó)內(nèi)外已有許多面向企業(yè)的Web漏洞檢測(cè)工具出現(xiàn).這些工具主要是向網(wǎng)站服務(wù)器發(fā)送不同的HTTP數(shù)據(jù)包,通過(guò)分析響應(yīng)結(jié)果,探測(cè)網(wǎng)站服務(wù)器版本和數(shù)據(jù)庫(kù)版本,然后根據(jù)探測(cè)的信息向網(wǎng)站服務(wù)器發(fā)送已知類(lèi)型漏洞的payload,同樣,分析返回結(jié)果判斷是否存在漏洞,最后生成結(jié)果報(bào)表.
在國(guó)外相對(duì)比較成熟的如Acunetix[11], Web Vulnerability Scanner[12],由Java開(kāi)發(fā),支持ajax解析、flash內(nèi)容檢索,有業(yè)內(nèi)較為先進(jìn)的SQL注入和XSS漏洞測(cè)試引擎,穩(wěn)定性較好,有豐富的報(bào)告功能.
在國(guó)內(nèi),各大安全公司也推出了不少相關(guān)產(chǎn)品,如:360推出的網(wǎng)站安全檢測(cè)平臺(tái);保護(hù)傘網(wǎng)絡(luò)開(kāi)發(fā)的Safe3 Scanner;知道創(chuàng)宇公司推出的Websaber網(wǎng)站應(yīng)用安全評(píng)估系統(tǒng).這些系統(tǒng)能夠發(fā)現(xiàn)常見(jiàn)類(lèi)型的Web應(yīng)用漏洞,提出解決方案,適合常規(guī)的自動(dòng)化測(cè)試.
然而Web漏洞的成因和利用方式都是多種多樣的,用戶的需求也是不同的,這些工具仍存在以下局限性[13]:
1) 較為臃腫,多個(gè)功能集成在一起,用戶不易選擇;
2) 速度和掃描的深入度不足;
3) 靈活性較差,不易配合人工的測(cè)試使用.
針對(duì)以上問(wèn)題,本文設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)完備的漏洞檢測(cè)框架,可以由用戶自由選擇掃描引擎,用于輔助安全人員進(jìn)行漏洞檢測(cè)或自動(dòng)化地漏洞掃描.整個(gè)框架包含站點(diǎn)地圖繪制、HTTP代理、請(qǐng)求重放和入侵等多個(gè)程序模塊,以輔助智能微電網(wǎng)系統(tǒng)的人工測(cè)試,便于安全人員把握Web應(yīng)用結(jié)構(gòu),完成HTTP流量分析和Fuzzing測(cè)試等;自動(dòng)化掃描的程序模塊既包括單頁(yè)面掃描也包括整站掃描,其中單頁(yè)面掃描可以選擇調(diào)用Sqlmap,nmap等安全工具,支持輸入命令與安全工具交互,也可以用框架自帶的引擎進(jìn)行掃描,并返回發(fā)現(xiàn)的漏洞詳情.最后,使用PyQt的樣式設(shè)計(jì)語(yǔ)言QSS設(shè)計(jì)了整個(gè)程序的界面,優(yōu)化用戶使用感,并將各模塊封裝在單獨(dú)的API文件中,便于后續(xù)的擴(kuò)展和功能完善.
本文設(shè)計(jì)的漏洞檢測(cè)框架如圖3所示,該框架包括站點(diǎn)地圖、HTTP代理、請(qǐng)求重放、入侵、掃描5個(gè)功能模塊.各模塊之間既可以獨(dú)立使用,也可以相互調(diào)用輸出結(jié)果.
圖3 漏洞檢測(cè)框架總體設(shè)計(jì)
該模塊通過(guò)用戶輸入域名,選擇需要使用的協(xié)程數(shù)等參數(shù)后會(huì)掃描該域名下的所有頁(yè)面,并以目錄樹(shù)的形式展現(xiàn).當(dāng)使用者點(diǎn)擊目錄樹(shù)中爬取到的URL時(shí),可以在內(nèi)嵌的瀏覽器中預(yù)覽每個(gè)頁(yè)面以及爬取時(shí)的請(qǐng)求/響應(yīng)包.
3.1.1 高效判重?cái)?shù)據(jù)結(jié)構(gòu)Bloom Filter
URL爬取的難點(diǎn)是URL的去重[14].本文框架使用Python的一個(gè)擴(kuò)展包BitVector實(shí)現(xiàn)了高效判重的Bloom Filter數(shù)據(jù)結(jié)構(gòu).該結(jié)構(gòu)在1970年由Bloom提出.Bloom Filter的核心思想是利用多個(gè)Hash函數(shù)將URL映射到某些集合里.因?yàn)閱蝹€(gè)Hash函數(shù)出現(xiàn)沖突的可能性比較高,遇到?jīng)_突時(shí)就用另外的Hash函數(shù)再次映射,從而減少了沖突[15].但它有一定的誤判率,在判斷某元素是否存在集合中時(shí)可能誤判,誤判率會(huì)隨著元素個(gè)數(shù)的增多而增大.如果應(yīng)用在該模塊的爬蟲(chóng)URL去重中,較低的誤判率是可以接受的,誤判1次只是多爬1個(gè)頁(yè)面而已.為了減少空間的占用,Bloom Filter使用位數(shù)組對(duì)元素的Hash進(jìn)行存儲(chǔ),占用的內(nèi)存比其他數(shù)據(jù)結(jié)構(gòu)要小得多.
3.1.2 并發(fā)
為了提高爬取的速度,本文框架使用協(xié)程進(jìn)行并發(fā),將每個(gè)耗時(shí)的IO操作封裝成一個(gè)協(xié)程.協(xié)程類(lèi)似于一個(gè)個(gè)函數(shù),一個(gè)函數(shù)執(zhí)行到一半時(shí)可以跳到另一個(gè)函數(shù)執(zhí)行,這種特性非常適合IO密集型程序的迸發(fā),實(shí)現(xiàn)非阻塞的異步IO[16].IO密集型的程序耗時(shí)主要發(fā)生在發(fā)出請(qǐng)求等待響應(yīng)的那段時(shí)間,有了協(xié)程就可以在剛發(fā)送完請(qǐng)求后跳到另一個(gè)協(xié)程執(zhí)行,收到響應(yīng)后再回來(lái)繼續(xù)執(zhí)行接下來(lái)的任務(wù),也就是同時(shí)可以并發(fā)幾個(gè)鏈接.協(xié)程實(shí)際上只在1個(gè)線程中運(yùn)行,主要利用線程內(nèi)任務(wù)的切換,一般不需要加鎖,并且占用資源較少.
3.1.3 模塊實(shí)現(xiàn)
算法1是針對(duì)站點(diǎn)地圖的并發(fā)式爬蟲(chóng)算法,使用Bloom Filter數(shù)據(jù)結(jié)構(gòu)進(jìn)行去重,并設(shè)計(jì)了一些正則表達(dá)式來(lái)匹配和抓取頁(yè)面中的鏈接.
算法1.站點(diǎn)地圖爬蟲(chóng)算法.
輸入:域名dname、協(xié)程數(shù)目n.
① 初始化爬取成功的URL隊(duì)列q,Bloom Filter數(shù)據(jù)結(jié)構(gòu)seen_url;
② 將域名的首頁(yè)URL放入q和seen_url;
③ 創(chuàng)建協(xié)程;
④ WHILE 隊(duì)列q非空
⑤ 從q中取出爬取到的url,輸出并發(fā)送請(qǐng)求;
⑥ IF響應(yīng)為重定向
⑦ THEN 添加其到q和seen_url中;
⑧ ELSE
⑨ 利用正則表達(dá)式從返回頁(yè)面中找到所有鏈接;
⑩ IF 域名協(xié)議符合要求且不在seen_url中
對(duì)于該模塊中的頁(yè)面預(yù)覽功能,通過(guò)PyQt的QWebView類(lèi)實(shí)現(xiàn).使用者點(diǎn)擊URL后,通過(guò)QWebView的load方法將其加載出來(lái),并根據(jù)程序界面大小調(diào)整頁(yè)面比例.請(qǐng)求/響應(yīng)包分析則需要通過(guò)Python的requests包獲得請(qǐng)求頭和響應(yīng)對(duì)象,并按HTTP包的規(guī)范重新組合請(qǐng)求頭部和主體部分,得到規(guī)范的HTTP請(qǐng)求包和響應(yīng)包,將其顯示在對(duì)應(yīng)文本框中.
首先瀏覽器需要設(shè)置好代理服務(wù)器地址,打開(kāi)本文框架HTTP代理功能,可以攔截瀏覽器的HTTP請(qǐng)求包,支持修改和釋放.攔截的HTTP請(qǐng)求包可以選擇發(fā)送到請(qǐng)求重放或入侵模塊,進(jìn)行后續(xù)處理.
3.2.1 Socket編程
Socket是網(wǎng)絡(luò)中主機(jī)間通信必不可少的部分,如果把網(wǎng)絡(luò)中的主機(jī)比喻為一部部電話機(jī),那么Socket就是電話線插口.本文只涉及用戶客戶端和Web服務(wù)器之間的通信,所以下面只簡(jiǎn)要說(shuō)明1個(gè)客戶端和1個(gè)服務(wù)器間的通信過(guò)程[17].
假設(shè)A是服務(wù)器,B是客戶端,那么A會(huì)將Socket綁定到1個(gè)端口,然后監(jiān)聽(tīng)這個(gè)端口,等待接受客戶端的連接.每當(dāng)有1個(gè)客戶端發(fā)送請(qǐng)求就會(huì)新開(kāi)1個(gè)Socket,用于和該客戶端通信.客戶端只要知道服務(wù)器的地址就可以新建1個(gè)Socket來(lái)請(qǐng)求連接服務(wù)器.兩者連接后,使用send,recv等函數(shù)進(jìn)行通信,完畢后可以用close關(guān)閉連接.
3.2.2 模塊實(shí)現(xiàn)
該模塊的核心部分是HTTP請(qǐng)求的攔截和釋放,使用Python的套接字模塊Socket實(shí)現(xiàn)與瀏覽器及目標(biāo)服務(wù)器的通信,并用Select模塊實(shí)現(xiàn)IO多路復(fù)用,防止線程一直等待1個(gè)Socket降低整個(gè)程序的效率.這里使用Select而不是poll或epoll主要是考慮到可移植性,因?yàn)镾elect既可用于Windows平臺(tái)也可用于Linux平臺(tái).
首先,給定host和port為(“127.0.0.1”,6666),并將瀏覽器HTTP代理服務(wù)器地址也設(shè)置為(“127.0.0.1”,6666).服務(wù)器端會(huì)新建1個(gè)Socket綁定在這個(gè)地址并監(jiān)聽(tīng),等待接收請(qǐng)求.當(dāng)用戶訪問(wèn)網(wǎng)頁(yè)時(shí),瀏覽器會(huì)將請(qǐng)求發(fā)送到本程序,服務(wù)器端接收請(qǐng)求后,新建1個(gè)Socket并新開(kāi)啟1個(gè)線程Proxy用于和瀏覽器傳輸數(shù)據(jù),從而避免當(dāng)1個(gè)線程有多個(gè)Socket在通信時(shí),程序不知道將接收到的請(qǐng)求傳給哪一個(gè)Socket.新開(kāi)啟的線程Proxy會(huì)接收瀏覽器發(fā)來(lái)的請(qǐng)求并解碼,然后提取出請(qǐng)求目標(biāo)的主機(jī)號(hào)、端口、請(qǐng)求主體內(nèi)容等信息,和通信用的Socket一起用字典存儲(chǔ)起來(lái),并放到隊(duì)列中,交給主進(jìn)程處理.主進(jìn)程會(huì)從隊(duì)列中取出該請(qǐng)求,并顯示到文本框中.
請(qǐng)求重放模塊可以接收由HTTP代理模塊發(fā)過(guò)來(lái)的請(qǐng)求,或由使用者自行輸入請(qǐng)求包,由此發(fā)送請(qǐng)求后可以得到響應(yīng)包.
該模塊中主要用到Python的http.client模塊,首先和目標(biāo)服務(wù)器建立連接,連接對(duì)象為conn,然后根據(jù)HTTP請(qǐng)求包的特點(diǎn)提取出請(qǐng)求的路徑、請(qǐng)求頭部、POST參數(shù)等,然后用http.client的request方法向目標(biāo)服務(wù)器發(fā)送請(qǐng)求,并得到響應(yīng)對(duì)象.響應(yīng)對(duì)象中有狀態(tài)碼、響應(yīng)HTTP協(xié)議版本、響應(yīng)主體等信息,需要將其重新組合成標(biāo)準(zhǔn)形式的響應(yīng)字符串,然后顯示在文本框內(nèi).程序執(zhí)行流程如圖4所示:
圖4 請(qǐng)求重放模塊程序執(zhí)行流程
可以用一系列測(cè)試字符串替換請(qǐng)求包中的某位置字符串并發(fā)送請(qǐng)求,用于密碼爆破或Fuzzing測(cè)試.因?yàn)檩d荷位置標(biāo)記、載荷設(shè)置等都是比較基礎(chǔ)的字符串操作,故該模塊的核心在開(kāi)始攻擊后的部分,如算法2所示:
算法2.站點(diǎn)入侵算法.
輸入:目標(biāo)服務(wù)器地址target、目標(biāo)服務(wù)器端口號(hào)port、請(qǐng)求包、相應(yīng)隊(duì)列deque.
① 標(biāo)記載荷位置、輸入或?qū)胼d荷集;
② IF 攻擊類(lèi)型為“Sniper”
③ THEN 使用載荷集中的載荷逐一替換請(qǐng)求包中被標(biāo)記的位置(即每次只替換1個(gè)位置);
④ ELSE IF 攻擊類(lèi)型為“Battering ram”
⑤ THEN使用載荷集中的載荷同時(shí)替換被標(biāo)記的所有位置(即每次替換多個(gè)位置);
⑥ END IF
⑦ 使用SocketHTTP函數(shù)發(fā)送修改后的請(qǐng)求;
⑧ 將得到的響應(yīng)以及關(guān)鍵信息放入deque中;
⑨ 主進(jìn)程從deque中取出響應(yīng)信息,以表格形式顯示;
⑩ IF 結(jié)果存在異常
由于每個(gè)發(fā)送的請(qǐng)求相互獨(dú)立,沒(méi)有需要共享的變量,也不需要加鎖,所以可以將載荷集劃分成幾個(gè)部分,交給不同的線程處理,效率比較高.
前4個(gè)模塊屬于輔助人工測(cè)試的模塊,漏洞掃描模塊主要是自動(dòng)化的漏洞掃描,分為單頁(yè)面的漏洞掃描和整站漏洞掃描,其中單頁(yè)面掃描可以選擇調(diào)用其他安全工具如Sqlmap.主要檢測(cè)的漏洞有SQL注入和XSS跨站腳本攻擊.
3.5.1 外部工具調(diào)用
在該模塊中,我們使用PyQt的QProcess新建1個(gè)子進(jìn)程,這個(gè)子進(jìn)程會(huì)執(zhí)行預(yù)設(shè)的或用戶自行輸入的命令,打開(kāi)所選擇的工具,將該子進(jìn)程輸出的信號(hào)綁定到1個(gè)槽中,一旦輸出緩沖區(qū)中有字符串就會(huì)將緩沖區(qū)內(nèi)的內(nèi)容添加到文本框中.另外,由于有時(shí)需要與工具進(jìn)行交互,所以在界面中保留1個(gè)輸入框,用QProcess的write方法將命令通過(guò)管道寫(xiě)入子進(jìn)程,當(dāng)子進(jìn)程結(jié)束時(shí)輸入無(wú)效.
以Sqlmap的調(diào)用為例,預(yù)設(shè)的命令是“python2 sqlmap.py -u [url]”,這里[url]要用輸入框中的URL替換,Sqlmap會(huì)檢測(cè)該URL對(duì)應(yīng)頁(yè)面的所有SQL漏洞.
3.5.2 單頁(yè)面漏洞掃描
和外部工具的調(diào)用類(lèi)似,單頁(yè)面漏洞掃描同樣需要開(kāi)啟1個(gè)子進(jìn)程調(diào)用對(duì)應(yīng)文件.單頁(yè)面掃描時(shí)間復(fù)雜度不大,所以無(wú)需使用并行的方法加速.子進(jìn)程每檢測(cè)到1個(gè)漏洞就將輸出通過(guò)管道傳遞給主進(jìn)程,主進(jìn)程再將其顯示在文本框內(nèi).掃描的主要原理是將攻擊載荷加到請(qǐng)求的GET參數(shù)或POST參數(shù)中,通過(guò)分析響應(yīng)結(jié)果判斷頁(yè)面是否存在漏洞.
針對(duì)不同類(lèi)型的漏洞有不同的檢測(cè)方法,該模塊主要檢測(cè)SQL注入漏洞和XSS跨站腳本攻擊漏洞.SQL注入漏洞主要分為bool型盲注、報(bào)錯(cuò)注入等[18],它們的檢測(cè)方式也各不相同.對(duì)于bool型盲注,主要是通過(guò)在GET和POST參數(shù)部分加上或者替換類(lèi)似于and 1=1和and 1=2這樣的載荷,如果2次請(qǐng)求返回的頁(yè)面長(zhǎng)度不同,可以認(rèn)為2個(gè)載荷成功插入SQL查詢并且執(zhí)行,因此頁(yè)面存在bool型盲注漏洞.對(duì)于報(bào)錯(cuò)注入,通過(guò)在GET和POST參數(shù)部分加上可使Web后臺(tái)報(bào)錯(cuò)的載荷,例如單引號(hào).返回的頁(yè)面中如果有相關(guān)錯(cuò)誤信息則認(rèn)為存在報(bào)錯(cuò)注入.至于延時(shí)盲注,由于對(duì)程序效率影響比較大,這里不進(jìn)行檢測(cè).對(duì)于XSS漏洞的檢測(cè)與之類(lèi)似,在GET和POST參數(shù)中加上XSS攻擊載荷,然后發(fā)送請(qǐng)求,如果返回的頁(yè)面載荷被成功植入,則說(shuō)明頁(yè)面存在XSS漏洞.
所有掃描需要的載荷以及對(duì)應(yīng)的測(cè)試方式都存放在1個(gè)XML文件里,框架已經(jīng)有一些基本的載荷,使用者也可以自行添加,攻擊載荷形式如下:
〈bool〉
〈p1〉 OR 1=1〈/p1〉
〈p2〉 OR 1=2〈/p2〉
〈type〉0〈/type〉
〈/bool〉
bool表示該攻擊載荷用于檢測(cè)bool型盲注,p1和p2內(nèi)是攻擊載荷,需要分別添加到請(qǐng)求參數(shù)中,并判斷響應(yīng)長(zhǎng)度是否一樣.type標(biāo)簽表明載荷的使用規(guī)則,type為0時(shí)表明該載荷需要追加到參數(shù)后面,type為1時(shí)則表明需要用載荷替換參數(shù)內(nèi)容.
〈error〉
〈p〉′〈/p〉
〈grep〉語(yǔ)法錯(cuò)誤〈/grep〉
〈type〉0〈/type〉
〈/error〉
error表示檢測(cè)報(bào)錯(cuò)注入,與bool型盲注不同的是p內(nèi)是攻擊載荷,grep內(nèi)是需要從響應(yīng)中尋找的錯(cuò)誤信息.
〈xss〉
〈p〉lt;script>alert(1)</script>
〈/p〉
〈grep〉lt;script>alert(1)<
/script>〈/grep〉
〈type〉1〈/type〉
〈/xss〉
XSS表示檢測(cè)XSS漏洞,和報(bào)錯(cuò)注入檢測(cè)方式比較類(lèi)似.
3.5.3 整站漏洞掃描
實(shí)現(xiàn)整站掃描分為2部分:整站頁(yè)面的爬取和單頁(yè)面漏洞掃描.整站頁(yè)面的爬取用的是站點(diǎn)地圖模塊所使用的爬蟲(chóng)算法,單頁(yè)面漏洞掃描已經(jīng)在前文中進(jìn)行詳細(xì)敘述,只需將二者結(jié)合,即每爬取1個(gè)URL就使用漏洞掃描引擎進(jìn)行檢測(cè),實(shí)時(shí)返回結(jié)果.
Web應(yīng)用漏洞的自動(dòng)化掃描實(shí)際上就是模擬手工檢測(cè)的方式,向目標(biāo)網(wǎng)站發(fā)送請(qǐng)求并分析響應(yīng)情況.由于電網(wǎng)系統(tǒng)是國(guó)家的要害部門(mén),進(jìn)行真實(shí)環(huán)境的測(cè)試需要層層審批,因此通過(guò)自身可操縱的網(wǎng)站來(lái)模擬微電網(wǎng)中的能源管理系統(tǒng),進(jìn)行漏洞檢測(cè).
操作系統(tǒng):Windows 7 Ultimate;
CPU:Intel Core i5-5200u;
內(nèi)存:4.00 GB;
開(kāi)發(fā)工具:Python3.5+PyQt5+SQLite;
開(kāi)發(fā)環(huán)境:Sublime Text3.
4.2.1 站點(diǎn)地圖
用戶輸入域名,并選擇協(xié)程數(shù),點(diǎn)擊開(kāi)始,左邊會(huì)即時(shí)顯示掃描到的該域名下的頁(yè)面,以目錄樹(shù)的形式顯示,如果點(diǎn)擊停止則會(huì)中止掃描.如果點(diǎn)擊1個(gè)掃描到的URL,在右側(cè)欄中,上邊的內(nèi)嵌瀏覽器會(huì)展示該頁(yè)面,下邊的標(biāo)簽欄會(huì)顯示爬取該URL的請(qǐng)求包和響應(yīng)包,如圖5所示:
圖5 站點(diǎn)地圖
4.2.2 HTTP代理
當(dāng)打開(kāi)代理功能時(shí),設(shè)置瀏覽器的HTTP代理服務(wù)器為localhost:6666(該模塊的代理服務(wù)器會(huì)監(jiān)聽(tīng)本地的6666端口),那么訪問(wèn)HTTP網(wǎng)頁(yè)時(shí),請(qǐng)求會(huì)被攔截,并在如圖6所示的框中顯示出來(lái),此時(shí)所訪問(wèn)的頁(yè)面不會(huì)被加載.
圖6 HTTP代理界面
當(dāng)點(diǎn)擊釋放時(shí)請(qǐng)求會(huì)被發(fā)送,并將響應(yīng)返回給瀏覽器,百度的首頁(yè)加載成功,如圖7所示.
圖7 點(diǎn)擊釋放后的HTTP代理界面
對(duì)于每個(gè)攔截到的HTTP請(qǐng)求,還可以選擇發(fā)送到請(qǐng)求重放模塊或入侵模塊,如圖8所示.
圖8 發(fā)送攔截到的HTTP請(qǐng)求
4.2.3 請(qǐng)求重放
請(qǐng)求重放模塊可以接收由HTTP代理模塊傳來(lái)的請(qǐng)求,或者是由使用者自行輸入請(qǐng)求包,由此發(fā)送請(qǐng)求后可以得到響應(yīng)包,如圖9所示,右側(cè)顯示了相應(yīng)的頭部和主體HTML代碼.
圖9 請(qǐng)求重放界面
如果請(qǐng)求包中不存在Host頭部,則需要輸入目標(biāo)主機(jī)Host.
圖10 輸入目標(biāo)服務(wù)器Host
4.2.4 入侵
圖11 入侵模塊流程
該模塊首先需要給定1個(gè)請(qǐng)求包以及請(qǐng)求的服務(wù)器地址,這個(gè)可以由HTTP代理模塊傳入,或者由使用者自己輸入,如圖10所示.然后需要在請(qǐng)求包中標(biāo)記一些字符串,并選擇攻擊載荷,即1組字符串,該模塊會(huì)用這組字符串分別替換請(qǐng)求包中被標(biāo)記的字符串,并發(fā)送新的請(qǐng)求,將每個(gè)請(qǐng)求的響應(yīng)結(jié)果信息發(fā)送給主線程.該模塊可以用于密碼爆破、模糊測(cè)試等.完整流程如圖11所示.
4.2.5 掃描
在該模塊中,用戶在單頁(yè)面掃描選項(xiàng)卡中可以選擇調(diào)用其他安全工具,既可以通過(guò)自定義命令,也可以使用程序預(yù)設(shè)的命令.此處以Sqlmap為例,預(yù)設(shè)的命令是“python2 sqlmap.py -u [url]”,這里[url]要用輸入框中的URL替換,Sqlmap會(huì)檢測(cè)該URL對(duì)應(yīng)頁(yè)面的所有SQL漏洞,如圖12所示,檢測(cè)出了該測(cè)試網(wǎng)站中存在的SQL注入漏洞.
如圖13所示,如果不選擇工具(即選擇No tool選項(xiàng)),則會(huì)使用該框架自身的掃描引擎,可以看出,同樣檢測(cè)出相關(guān)漏洞,每檢測(cè)出1個(gè)漏洞會(huì)標(biāo)明它的類(lèi)型、URL以及使用的攻擊載荷.
另外,該模塊還支持整站掃描功能,自動(dòng)掃描某域名下的所有頁(yè)面,并檢測(cè)漏洞.由于整站掃描時(shí)頁(yè)面比較多,比較耗時(shí),所以使用協(xié)程來(lái)提高效率,將漏洞的檢測(cè)和頁(yè)面的爬取放到1個(gè)消息循環(huán)中,并使用多任務(wù)并行處理.用戶可以選擇協(xié)程的數(shù)量,協(xié)程數(shù)越多速度越快,但也越不穩(wěn)定,框架中默認(rèn)為50個(gè)協(xié)程.
圖12 使用Sqlmap進(jìn)行單頁(yè)面掃描
圖13 使用自身掃描引擎進(jìn)行單頁(yè)面掃描
為了更客觀地評(píng)測(cè)本文所提出的漏洞檢測(cè)框架,我們與文獻(xiàn)[19]進(jìn)行了系統(tǒng)性對(duì)比,如表1所示:
表1 系統(tǒng)對(duì)比分析
可以看出,本文提出的框架功能更為全面,漏洞掃描引擎更強(qiáng)大,且可擴(kuò)展性更強(qiáng).對(duì)于掃描粒度而言,文獻(xiàn)[19]更適合于單臺(tái)主機(jī)的本地掃描,而本文提出的框架更適合Web服務(wù)的安全性檢測(cè),服務(wù)范圍更廣.但該框架缺少檢測(cè)結(jié)果的可視化界面,對(duì)于非技術(shù)人員有一定的操作難度.
本文針對(duì)智能微電網(wǎng)能源管理系統(tǒng)中潛在的Web應(yīng)用漏洞設(shè)計(jì)實(shí)現(xiàn)了一個(gè)較為全面的漏洞檢測(cè)框架,用于輔助安全人員進(jìn)行漏洞檢測(cè)或自動(dòng)化的漏洞掃描.相比其他漏洞掃描工具,本文實(shí)現(xiàn)的框架功能較為豐富,包含5個(gè)功能模塊:站點(diǎn)地圖、HTTP代理、請(qǐng)求重放、入侵、掃描,可獨(dú)立使用,也可相互調(diào)用輸出結(jié)果.將每個(gè)功能封裝為單獨(dú)的文件和API接口,便于后續(xù)功能的擴(kuò)展.同時(shí)使用協(xié)程技術(shù)來(lái)提高檢測(cè)效率,占用資源較少.最后,通過(guò)實(shí)驗(yàn)對(duì)實(shí)際網(wǎng)站進(jìn)行測(cè)試,證明本文所提出的框架的有效性.
本文框架的穩(wěn)定性和易用性較好,但在功能上仍有許多待改進(jìn)和完善的地方,如增加更多種類(lèi)漏洞的檢測(cè),增加更多用戶可以控制的選項(xiàng).此外,增加一個(gè)生成漏洞結(jié)果報(bào)表的功能,更有助于微電網(wǎng)相關(guān)人員直觀地了解系統(tǒng)中的安全狀況,提升系統(tǒng)的可用性.