康志輝
廈門(mén)軟件職業(yè)技術(shù)學(xué)院,福建廈門(mén) 361024
基于PHP擴(kuò)展的webshell檢測(cè)研究
康志輝
廈門(mén)軟件職業(yè)技術(shù)學(xué)院,福建廈門(mén) 361024
webshell通常是以網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境,也可以將其稱(chēng)為網(wǎng)頁(yè)后門(mén)。本文主要介紹從php內(nèi)核基礎(chǔ)利用hook技術(shù)實(shí)現(xiàn)一種基于php擴(kuò)展的webshell防御機(jī)制。使用該方法可以有效防御變形webshell,彌補(bǔ)傳統(tǒng)防御檢測(cè)機(jī)制的不足。
webshell,api hook,zend engine
隨著全球信息技術(shù)的快速發(fā)展,尤其是因特網(wǎng)的出現(xiàn),互聯(lián)網(wǎng)成為人們快速獲取、發(fā)布和傳遞信息的重要渠道[1]。隨著互聯(lián)網(wǎng)的普及使得web應(yīng)用得到了迅速的普及,從大型的新聞網(wǎng)站到企業(yè)門(mén)戶(hù),從電子商務(wù)平臺(tái)到各種服務(wù)型的網(wǎng)站。由于開(kāi)發(fā)人員的技術(shù)參差不齊,系統(tǒng)在設(shè)計(jì)開(kāi)發(fā)過(guò)程中對(duì)于安全的考慮不完善導(dǎo)致漏洞的產(chǎn)生,例如:SQL注入、跨站腳本攻擊、任意文件上傳漏洞。黑客在得到web系統(tǒng)漏洞后一般會(huì)通過(guò)上傳webshell得到服務(wù)器的低級(jí)權(quán)限。
1)webshell概述。
webshell是以網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境,也可以成為網(wǎng)頁(yè)后門(mén),黑客在入侵一個(gè)網(wǎng)站后通常會(huì)將后門(mén)文件與正常的網(wǎng)頁(yè)文件放在一起。并通過(guò)篡改文件時(shí)間并通過(guò)服務(wù)器漏洞進(jìn)行隱藏。由于webshell基于http通信,并不會(huì)在系統(tǒng)日志中留下痕跡,只會(huì)在中間件日志留下訪問(wèn)記錄,使得管理很難在第一時(shí)間發(fā)現(xiàn)入侵痕跡。
2)檢測(cè)方案。
傳統(tǒng)的webshell檢測(cè)方案基于特征碼查殺。對(duì)于特征碼較為明顯的webshell檢測(cè)效果較于明顯[2]。但是由于查殺方式過(guò)于粗暴,使得誤報(bào)率大大提高。另一種是基于語(yǔ)法分析的檢測(cè)方案。根據(jù)語(yǔ)言掃描編譯實(shí)現(xiàn)的方式,對(duì)代碼進(jìn)行剝離,注釋?zhuān)治鲎兞?、函?shù)、字符串、語(yǔ)言結(jié)構(gòu)。通過(guò)這種方式可以完美解決漏報(bào)的情況。以上兩種方式都是在被黑以后進(jìn)行的檢測(cè),無(wú)法再被黑過(guò)程中觸發(fā)規(guī)則并攔截攻擊,較為被動(dòng)。本文將通過(guò)php底層引擎的api hook技術(shù)實(shí)現(xiàn)webshell的主動(dòng)防御檢測(cè)。
3)基于api hook的主動(dòng)防御原理。
基于api hook的主動(dòng)防御最早出現(xiàn)在國(guó)內(nèi)微點(diǎn)殺毒軟件上。該程序通過(guò)hook api調(diào)用,當(dāng)惡意程序調(diào)用危險(xiǎn)api時(shí)觸發(fā)主動(dòng)防御。通過(guò)此原理,我們可以通過(guò)zend engine提供的接口輕松實(shí)現(xiàn)webshell主動(dòng)防御檢測(cè)。
1.1 PHP內(nèi)核與擴(kuò)展
1)php內(nèi)核執(zhí)行流程。
php代碼執(zhí)行過(guò)程中分為四個(gè)階段,分別是將php代碼通過(guò)Zend/zend_language_scanner.c將Zend/ zend_language_scanner.l中的規(guī)則進(jìn)行詞法分析后轉(zhuǎn)換為語(yǔ)言片段(tokens),然后將語(yǔ)言片段(tokens)轉(zhuǎn)換為表達(dá)式,接著將表達(dá)式編譯成opcode(opcode是php腳本編譯后的中間語(yǔ)言,類(lèi)似java的ByteCode)。最后順序執(zhí)行opcode,從而實(shí)現(xiàn)php腳本的功能。
2)php擴(kuò)展。
防御方案使用了php擴(kuò)展來(lái)完成,php由純c語(yǔ)言實(shí)現(xiàn),所以?xún)?nèi)核支持使用c進(jìn)行擴(kuò)展功能的開(kāi)發(fā),并在源碼包中提供了擴(kuò)展生成擴(kuò)展ext_skel生成擴(kuò)展demo便于簡(jiǎn)化開(kāi)發(fā)。php擴(kuò)展位于內(nèi)核zend引擎和php代碼層之間。那么利用擴(kuò)展就可以實(shí)現(xiàn)監(jiān)控代碼層執(zhí)行細(xì)節(jié),同時(shí)可以調(diào)用底層的api接口。
通過(guò)ext_skel生成擴(kuò)展開(kāi)發(fā)框架以后,可以發(fā)現(xiàn)擴(kuò)展開(kāi)發(fā)需要聲明并實(shí)現(xiàn)PHP_MINIT_FUNCTION(加載模塊調(diào)用函數(shù)),PHP_MSHUTDOWN_FUNCTION(卸載模塊調(diào)用函數(shù)),PHP_RINIT_FUNCTION(請(qǐng)求調(diào)用函數(shù)),PHP_ RSHUTDOWN_FUNCTION(請(qǐng)求結(jié)束調(diào)用的函數(shù)),PHP_ MINFO_FUNCTION(模塊信息函數(shù)),以及PHP_FUNCTION(導(dǎo)出函數(shù))。
1.2 具體實(shí)現(xiàn)
php是解釋型語(yǔ)言,代碼被翻譯為opcode由ZEND引擎解析執(zhí)行,每個(gè)opcode對(duì)應(yīng)zend底層一個(gè)處理函數(shù)。通過(guò)hook opcode對(duì)應(yīng)的處理函數(shù)即可實(shí)現(xiàn)攔截webshell執(zhí)行。通過(guò)taint擴(kuò)展的源碼分析發(fā)現(xiàn)zend引擎提供了zend_set_user_opcode_handler接口(int zend_set_user_opcode_handler ( zend_uchar opcode, opcode_handler_t handler ))第一個(gè)參數(shù)為需要操作的opcode。第二個(gè)為hook后的處理函數(shù)。通過(guò)zend_set_user_opcode_handler接口即可輕易實(shí)現(xiàn)hook opcode方案。通過(guò)對(duì)源碼的搜索以及webshell功能分析,只需要將
ZEND_INCLUDE_OR_EVAL(eval、require等),ZEND_ DO_FCALL(函數(shù)執(zhí)行system等) ,
ZEND_DO_FCALL_BY_NAME(變量函數(shù)執(zhí)行 $func = “system”;$func();)三個(gè)處理函數(shù)在擴(kuò)展中PHP_ MINIT_FUNCTION中使用zend_set_user_opcode_ handler進(jìn)行處理即可。黑客通過(guò)任意文件上傳漏洞,將webshell上傳到目錄中。通用解決方案是在文件上傳后進(jìn)行訪問(wèn)時(shí)。通過(guò)文件所在路徑是否在黑名單中進(jìn)行判斷。如果觸發(fā)黑名單中規(guī)則即視為攻擊并及時(shí)攔截攻擊。
圖1 webshell防御實(shí)現(xiàn)過(guò)程
擴(kuò)展開(kāi)發(fā)完成后通過(guò)make && make install編譯并加入到php.ini中,后重啟webserver使用現(xiàn)有webshell進(jìn)行測(cè)試,通過(guò)小馬寫(xiě)入webshell。訪問(wèn)webshell,成功的攔截結(jié)果得到如圖2所示。
通過(guò)zend底層提供的zend_set_user_opcode_ handler接口可輕易實(shí)現(xiàn)hook opcode達(dá)到webshell攔截目的。文中代碼由于未考慮生產(chǎn)環(huán)境,容易出現(xiàn)誤殺現(xiàn)象導(dǎo)致正常業(yè)務(wù)崩潰。并且由于是基于擴(kuò)展開(kāi)發(fā),在部署及配置方面并不是很方便。還需要根據(jù)業(yè)務(wù)需求進(jìn)行修改調(diào)整。
[1]張彥.計(jì)算機(jī)網(wǎng)頁(yè)制作技術(shù)應(yīng)用及流程管理[J].價(jià)值工程,2015.
[2]胡建康,徐震,馬多賀,等.基于決策樹(shù)的Webshell檢測(cè)方法研究[J].網(wǎng)絡(luò)新媒體技術(shù),2012.
圖2 模擬webshell攻擊及攔截webshell攻擊
TP3
A
1674-6708(2015)148-0123-02