成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP場(chǎng)景中g(shù)etshell防御思路分享

安全 應(yīng)用安全
WEB應(yīng)用漏洞導(dǎo)致的入侵時(shí)有發(fā)生,掃描器和WAF并不能解決所有的問(wèn)題,于是嘗試在主機(jī)側(cè)針對(duì)PHP環(huán)境做了一個(gè)防御方案。很榮幸的邀請(qǐng)到TSRC部分白帽子做了一次對(duì)抗演習(xí),本文主要分享一下防御思路。防御方案主要想解決的問(wèn)題是getshell、主機(jī)敏感文件泄漏等問(wèn)題。

1 背景概述

WEB應(yīng)用漏洞導(dǎo)致的入侵時(shí)有發(fā)生,掃描器和WAF并不能解決所有的問(wèn)題,于是嘗試在主機(jī)側(cè)針對(duì)PHP環(huán)境做了一個(gè)防御方案。很榮幸的邀請(qǐng)到TSRC部分白帽子做了一次對(duì)抗演習(xí),本文主要分享一下防御思路。

防御方案主要想解決的問(wèn)題是getshell、主機(jī)敏感文件泄漏等問(wèn)題。于是乎出了下面這樣一個(gè)題目:部署了防御方案的Nginx + PHP 的WEB環(huán)境,提供一個(gè)上傳入口,可上傳任意文件。找到WEB目錄下的一個(gè)flag文件讀取到內(nèi)容即算突破。

2 PHP擴(kuò)展

防御方案使用了PHP擴(kuò)展來(lái)完成阻斷。PHP內(nèi)核支持C/C++開(kāi)發(fā)一些擴(kuò)展功能,并且提供了一個(gè)框架 – ext_skel幫助生成基本的代碼簡(jiǎn)化開(kāi)發(fā),由于PHP擴(kuò)展并不涉及底層的資源管理,所以編寫(xiě)一個(gè)PHP擴(kuò)展和編寫(xiě)一個(gè)C應(yīng)用程序是一樣的。下圖展示了PHP擴(kuò)展所處的結(jié)構(gòu)層次,擴(kuò)展位于PHP內(nèi)核ZEND 和 PHP應(yīng)用層代碼之間,那么利用PHP擴(kuò)展可以:

1) 監(jiān)控PHP應(yīng)用層代碼的執(zhí)行細(xì)節(jié),包括執(zhí)行CGI、函數(shù)名、參數(shù)等;

2) 調(diào)用PHP內(nèi)核ZEND提供的API接口,包括禁用類(lèi)、修改配置選項(xiàng)等。

PHP場(chǎng)景中g(shù)etshell防御思路分享

圖1 PHP語(yǔ)言的結(jié)構(gòu)

3 相關(guān)知識(shí)

3.1 HOOKPHP代碼

PHP是解釋型語(yǔ)言,代碼被翻譯為中間字節(jié)碼由ZEND引擎解析執(zhí)行。PHP把中間字節(jié)碼稱(chēng)之為OPCODE,每個(gè)OPCODE對(duì)應(yīng)ZEND底層的一個(gè)處理函數(shù),ZEND引擎最終執(zhí)行這個(gè)處理函數(shù)。實(shí)現(xiàn)HOOK功能只需要改變HOOK OPCODE對(duì)應(yīng)的處理函數(shù)即可,而ZEND預(yù)先就提供了一個(gè)現(xiàn)成的接口:zend_set_user_opcode_handler。防御方案只需要HOOK以下三個(gè)OPCODE:

ZEND_INCLUDE_OR_EVAL — eval、require等

ZEND_DO_FCALL — 函數(shù)執(zhí)行system等

ZEND_DO_FCALL_BY_NAME — 變量函數(shù)執(zhí)行 $func = “system”;$func();

舉例:

ZEND_DO_FCALL這個(gè)OPCODE對(duì)應(yīng)的功能是函數(shù)調(diào)用,如果需要HOOK所有的函數(shù)調(diào)用:

1) 在模塊初始化函數(shù)中使用zend_set_user_opcode_handler修改ZEND_DO_FCALL新的處理函數(shù)為mysub:

PHP_MINIT_FUNCTION(phpips){

zend_set_user_opcode_handler(ZEND_DO_FCALL, mysub);

return SUCCESS;

}

2) 在自定義函數(shù)中實(shí)現(xiàn)自己需要的功能并返回原來(lái)的處理函數(shù):

void mysub(){

自定義功能;

return ZEND_USER_OPCODE_DISPATCH;

}

3.2 ZEND接口

HOOK之外還需要獲取一些基本信息或功能,比如:

1) 獲取執(zhí)行的PHP腳本名,可調(diào)用ZEND的接口zend_get_executed_filename:

char *cgi_name = (char*)zend_get_executed_filename(TSRMLS_C);

2) 禁用一些類(lèi)庫(kù),可使用zend_disable_class接口;

ZEND提供了很多豐富的接口,可根據(jù)需求選擇調(diào)用。

3.3 數(shù)據(jù)結(jié)構(gòu)

PHP是弱類(lèi)型語(yǔ)言,其上層并不區(qū)分變量類(lèi)型,變量底層對(duì)應(yīng)的是一個(gè)union結(jié)構(gòu)體,以php-5.3.6版本舉例,結(jié)構(gòu)體在Zend/zend.h文件中定義;內(nèi)容如下:

typedef union _zvalue_value {

long lval; /* longvalue */

double dval; /* double value */

struct {

char *val;

int len;

} str;

HashTable *ht; /* hash table value*/

zend_object_value obj;

} zvalue_value;

PHP是在底層區(qū)分開(kāi)了變量類(lèi)型;在union結(jié)構(gòu)體中有個(gè)非常重要的結(jié)構(gòu)體HashTable,PHP中的數(shù)組結(jié)構(gòu)就是利用HashTable這個(gè)結(jié)構(gòu)體實(shí)現(xiàn),如果變量是個(gè)數(shù)組,獲取變量?jī)?nèi)容需要遍歷這塊HashTable,數(shù)據(jù)結(jié)構(gòu)這塊不做太多介紹。ZEND底層用zval這個(gè)結(jié)構(gòu)體存儲(chǔ)變量,同時(shí)ZEND提供了幾個(gè)宏可以方便的轉(zhuǎn)換zval到具體的數(shù)據(jù)類(lèi)型,比如把zval類(lèi)型轉(zhuǎn)換為字符串 – zval el; Z_STRVAL_P(el),常用的還有:

Z_LVAL_P、Z_DVAL_P、Z_ARRVAL_P等,以上宏列表在 Zend/zend_operators.h有定義。

4 規(guī)則策略

4.1 基本思路

我們需要解決的問(wèn)題是getshell、主機(jī)敏感文件泄漏等問(wèn)題。如果限制住PHP腳本執(zhí)行命令 和 翻閱文件的功能,就達(dá)到了目的。同時(shí),由于讀取文件的接口非常多,使用場(chǎng)景也較多,因此采取禁用打開(kāi)目錄接口來(lái)側(cè)面達(dá)到禁止翻閱文件的目的,不能遍歷目錄便無(wú)法得到文件名,可以有效的達(dá)到目標(biāo)。故最終形成的最終策略如下:

1) 禁用掉執(zhí)行命令的接口

2) 禁用掉打開(kāi)目錄的接口

禁用函數(shù)有一些需要注意的問(wèn)題:

1) PHP接口還是比較繁多復(fù)雜的,除了system、exec、opendir、scandir常用函數(shù)之外,一些生僻函數(shù)比如glob等函數(shù)都要考慮全面,另外還有一些回調(diào)函數(shù)、反射類(lèi)(PS:部分考慮不全被blackeye和雪人繞過(guò))

2) PHP SPL提供的一些類(lèi)庫(kù)有文件管理的功能,也需要禁止,比如DirectoryIterator(不過(guò)好像沒(méi)有白帽子使用過(guò)SPL)

4.2 對(duì)抗變形

PHP使用assert或preg_replace /e執(zhí)行代碼,調(diào)用zend_get_executed_filename獲取的PHP腳本名中會(huì)帶有辨別標(biāo)識(shí),assert對(duì)應(yīng)的是assert code,preg_replace對(duì)應(yīng)的是regexp code;當(dāng)發(fā)現(xiàn)這些特殊的腳本執(zhí)行了system等4.1中提高的高危函數(shù)直接阻斷。以下圖的nonalphanumeric -webshell舉例:

變形webshell解析后的形式和$_GET[1]($_GET[2])類(lèi)似,比如傳入1=assert&2=system(whoami)執(zhí)行代碼,PHP擴(kuò)展層監(jiān)控到system函數(shù)執(zhí)行,并且發(fā)現(xiàn)PHP腳本名帶regexp code標(biāo)識(shí),清晰的知道是preg_replace的代碼執(zhí)行了調(diào)用了system,阻斷system。Assert函數(shù)同理。總結(jié):擴(kuò)展并不關(guān)注在靜態(tài)層如何編碼運(yùn)算或加密,擴(kuò)展只監(jiān)控最后的行為,所以可以很好的解決目前的變形難題。

 

1

 

圖2nonalphanumeric – webshell

4.3 減少誤殺

有時(shí)正常的PHP腳本也需要用到命令執(zhí)行的功能,如何保證其正常運(yùn)行,不被我們的防御策略阻斷呢?這里提供三種思路:

1) 寫(xiě)入權(quán)限和執(zhí)行命令權(quán)限互斥

考慮到入侵者利用上傳漏洞或者其他0DAY getshell得到的文件大多會(huì)有W寫(xiě)權(quán)限,防御方往往希望阻止這部分文件擁有過(guò)高的權(quán)限。

那么,我們可以去除正常PHP腳本的可寫(xiě)權(quán)限,然后只對(duì)有寫(xiě)權(quán)限的PHP腳本實(shí)施命令執(zhí)行等防御策略的阻斷邏輯。這樣即不會(huì)影響到業(yè)務(wù)的使用,又達(dá)到了預(yù)設(shè)場(chǎng)景的防護(hù)目標(biāo)。不過(guò)這樣的思路,需要禁用chmod等可以修改文件權(quán)限的函數(shù)。

2) 使用白名單邏輯

粗暴一點(diǎn)的可以用文件名白名單,也就是業(yè)務(wù)報(bào)備過(guò)的文件不受阻斷,其它不認(rèn)識(shí)的文件一律禁止。優(yōu)雅一點(diǎn)的可以對(duì)函數(shù)參數(shù)做白名單,比如提取正常PHP腳本執(zhí)行命令的參數(shù)或者代碼特征,對(duì)其進(jìn)行放行,不認(rèn)識(shí)的特征一律阻斷。

3) 使用黑名單邏輯

設(shè)定一些已知惡意腳本的黑特征參數(shù),類(lèi)似于殺毒軟件早期的特征碼思路。

上述思路在企業(yè)推廣時(shí),需要和業(yè)務(wù)有足夠充分的配合,也都有不完美的地方,如果大家有更多方案或者思路,歡迎與我共同探討。

5 未來(lái)

利用PHP擴(kuò)展可以做的事情還是比較多,比如在漏洞檢測(cè)方面、對(duì)數(shù)據(jù)庫(kù)函數(shù)參數(shù)過(guò)濾、阻斷SQL注入、阻斷存儲(chǔ)型XSS等場(chǎng)景都有非常大的想象空間。甚至在代碼審計(jì)這塊也可以考慮,國(guó)內(nèi)有個(gè)大牛已經(jīng)有比較成熟的開(kāi)源產(chǎn)品,TAINT (作者:laruence),大家可能都已經(jīng)比較熟悉了,就暫時(shí)不做贅述了。

行文比較倉(cāng)促,有不足的地方請(qǐng)諒解,有任意疑問(wèn)或建議歡迎聯(lián)系pandas(小毛驢)切磋交流。

責(zé)任編輯:藍(lán)雨淚 來(lái)源: TSRC
相關(guān)推薦

2010-09-16 20:54:21

2013-10-12 13:40:09

2010-10-25 12:10:39

SQL注入

2009-03-11 17:04:53

2023-12-03 21:52:20

2010-08-19 13:49:50

2024-04-19 13:57:30

索引數(shù)據(jù)庫(kù)查詢(xún)

2009-08-05 09:09:33

2013-04-23 08:59:19

2017-09-15 11:29:41

2015-07-09 09:35:37

2009-12-07 11:11:46

PHP顯示圖片

2009-12-09 17:33:22

PHP性能優(yōu)化

2015-09-22 10:25:13

2023-05-10 10:46:38

2018-10-24 10:38:44

云計(jì)算云租戶(hù)企業(yè)云

2011-07-30 13:01:23

2009-12-03 16:54:36

PHP獲取中國(guó)IP段

2009-05-18 10:23:43

文件上傳PHPFILE函數(shù)

2010-03-24 11:21:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩有码一区 | 日韩久久精品视频 | 中文字幕在线观看国产 | 亚洲国产一区二区在线 | 国产一区二区在线免费观看 | 久久精品中文字幕 | 国产亚洲欧美另类一区二区三区 | 日本爱爱 | 日韩av一区二区在线观看 | 一区二区在线不卡 | 久久久久久久久91 | 黄色三级在线播放 | 青青青伊人 | 国产成人精品免高潮在线观看 | 日本免费在线 | 国产精品我不卡 | 欧美高清视频 | 久久无毛 | 国产精品片| 日韩欧美视频 | 一本一道久久a久久精品蜜桃 | 99久久电影 | 在线婷婷 | 精品国产欧美一区二区三区成人 | 一区二区在线免费观看 | h在线| 欧美激情在线精品一区二区三区 | 亚洲成人三级 | 国产成人av免费看 | 午夜专区 | 手机在线观看av | 国产日韩一区二区三免费 | 亚洲精品国产综合区久久久久久久 | 亚洲国产精品一区二区第一页 | 午夜精品在线观看 | 欧美日韩精品中文字幕 | 精品久久99 | 亚洲国产精品一区二区久久 | 精品国产一区二区三区久久狼黑人 | www.久久| 在线视频91|