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