不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 電腦安全 > 系統(tǒng)安全 >

PHP場景中g(shù)etshell防御思路是什么

時間: 加城1195 分享

  PHP場景中g(shù)etshell防御思路可能很多人都不知道,那么具體原理思路是什么呢?下面一起看看PHP場景中g(shù)etshell防御思路分享,希望能幫到需要的人!

  PHP擴(kuò)展

  防御方案使用了PHP擴(kuò)展來完成阻斷。PHP內(nèi)核支持C/C++開發(fā)一些擴(kuò)展功能,并且提供了一個框架 – ext_skel幫助生成基本的代碼簡化開發(fā),由于PHP擴(kuò)展并不涉及底層的資源管理,所以編寫一個PHP擴(kuò)展和編寫一個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接口,包括禁用類、修改配置選項等。

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

  3 相關(guān)知識

  3.1 HOOKPHP代碼

  PHP是解釋型語言,代碼被翻譯為中間字節(jié)碼由ZEND引擎解析執(zhí)行。PHP把中間字節(jié)碼稱之為OPCODE,每個OPCODE對應(yīng)ZEND底層的一個處理函數(shù),ZEND引擎最終執(zhí)行這個處理函數(shù)。實現(xiàn)HOOK功能只需要改變HOOK OPCODE對應(yīng)的處理函數(shù)即可,而ZEND預(yù)先就提供了一個現(xiàn)成的接口:zend_set_user_opcode_handler。防御方案只需要HOOK以下三個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這個OPCODE對應(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ù)中實現(xiàn)自己需要的功能并返回原來的處理函數(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) 禁用一些類庫,可使用zend_disable_class接口;

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

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

  PHP是弱類型語言,其上層并不區(qū)分變量類型,變量底層對應(yīng)的是一個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ū)分開了變量類型;在union結(jié)構(gòu)體中有個非常重要的結(jié)構(gòu)體HashTable,PHP中的數(shù)組結(jié)構(gòu)就是利用HashTable這個結(jié)構(gòu)體實現(xiàn),如果變量是個數(shù)組,獲取變量內(nèi)容需要遍歷這塊HashTable,數(shù)據(jù)結(jié)構(gòu)這塊不做太多介紹。ZEND底層用zval這個結(jié)構(gòu)體存儲變量,同時ZEND提供了幾個宏可以方便的轉(zhuǎn)換zval到具體的數(shù)據(jù)類型,比如把zval類型轉(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 基本思路

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

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

  2) 禁用掉打開目錄的接口

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

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

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

  4.2 對抗變形

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

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

  1

  圖2nonalphanumeric – webshell

  4.3 減少誤殺

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

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

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

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

  2) 使用白名單邏輯

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

  3) 使用黑名單邏輯

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

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

  補充:校園網(wǎng)安全維護(hù)技巧

  校園網(wǎng)絡(luò)分為內(nèi)網(wǎng)和外網(wǎng),就是說他們可以上學(xué)校的內(nèi)網(wǎng)也可以同時上互聯(lián)網(wǎng),大學(xué)的學(xué)生平時要玩游戲購物,學(xué)校本身有自己的服務(wù)器需要維護(hù);

  在大環(huán)境下,首先在校園網(wǎng)之間及其互聯(lián)網(wǎng)接入處,需要設(shè)置防火墻設(shè)備,防止外部攻擊,并且要經(jīng)常更新抵御外來攻擊;

  由于要保護(hù)校園網(wǎng)所有用戶的安全,我們要安全加固,除了防火墻還要增加如ips,ids等防病毒入侵檢測設(shè)備對外部數(shù)據(jù)進(jìn)行分析檢測,確保校園網(wǎng)的安全;

  外面做好防護(hù)措施,內(nèi)部同樣要做好防護(hù)措施,因為有的學(xué)生電腦可能帶回家或者在外面感染,所以內(nèi)部核心交換機(jī)上要設(shè)置vlan隔離,旁掛安全設(shè)備對端口進(jìn)行檢測防護(hù);

  內(nèi)網(wǎng)可能有ddos攻擊或者arp病毒等傳播,所以我們要對服務(wù)器或者電腦安裝殺毒軟件,特別是學(xué)校服務(wù)器系統(tǒng)等,安全正版安全軟件,保護(hù)重要電腦的安全;

  對服務(wù)器本身我們要安全server版系統(tǒng),經(jīng)常修復(fù)漏洞及更新安全軟件,普通電腦一般都是撥號上網(wǎng),如果有異常上層設(shè)備監(jiān)測一般不影響其他電腦。做好安全防范措施,未雨綢繆。

  相關(guān)閱讀:提高服務(wù)器安全性的技巧

  1.經(jīng)常更改系統(tǒng)管理員密碼。---->且密碼最好是大小寫都有

  2.定期更新系統(tǒng)補丁。---->開啟自動更新,并設(shè)定到晚上重啟。

  3.檢查系統(tǒng)是否多出超級管理員,檢查是否有帳號被克隆在“開始”>運行中輸入“cmd”>在輸入 net localgroup administrators

  4.在“開始”>運行中輸入“msconfig”檢查隨機(jī)啟動的程序和服務(wù),關(guān)掉不必要的隨機(jī)啟動程序和服務(wù)。

  5.服務(wù)器上的所有程序盡量安裝程序的最新穩(wěn)定版。

  6.檢查SERVU是否被創(chuàng)建有執(zhí)行權(quán)限的用戶或者對C盤有讀寫權(quán)限的用戶,并且給SERVU設(shè)置一個登錄密碼。如果需要請給serv_u設(shè)置獨立啟動賬戶。

  7.不要隨意安裝任何的第三方軟件。例如XX優(yōu)化軟件,XX插件之類的,更不要在服務(wù)器上注冊未知的組件。

  8.不要隨意在服務(wù)器上使用IE訪問任何網(wǎng)站,杜絕隱患那是必須的。

  9. 檢查系統(tǒng)日志的“安全性”條目,在右側(cè)查看近期“審核成功”的登錄

  10.不要在服務(wù)器上雙擊運行任何程序,不然怎么中了木馬都不知道。

  11.不要在服務(wù)器上用IE打開用戶的硬盤中的網(wǎng)頁,這是危險的行為。

  12.不要在服務(wù)器上瀏覽圖片,以前windows就出過GDI 的安全漏洞。

  13.及時的更新病毒庫,查殺病毒。

  14.定時的查看系統(tǒng)各個盤符的磁盤權(quán)限,是否為設(shè)定的安全權(quán)限。

  15.確保你自己的電腦安全,如果自己的電腦不安全,服務(wù)器也可能不太安全。


php防御相關(guān)文章:

1.怎么利用3389端口攻破服務(wù)器

2.如何預(yù)防網(wǎng)站被攻擊

3.如何防范SQL注入漏洞及檢測

4.服務(wù)器基礎(chǔ)知識大全

5.淺談網(wǎng)站服務(wù)器安全維護(hù)技巧

4016524