通過修改PHP源代碼解決Nginx下WebShell跨站的問題

Nginx / Lighttpd + PHP FastCGI的方式正在被越來越多的網站應用,其中讓需要虛擬主機支持的用戶最煩心的一件事情莫過於站點權限隔離。 目前無論是spawn-cgi或者是php-fpm的方式,都無法動態轉變執行用戶。儘管可以通過給不同網站以不同的用戶身份執行FastCGI,但這也同樣失去了FastCGI統一管理的優勢,需要爲每個網站保留足夠的處理進程而不是整體規劃。

Google搜之有兩個比較廣爲流傳的方法,其中最完美的莫過於直接修改PHP源代碼,對打開目錄進行鑑權(搜出來的資料最早是anxsoft.com提供的代碼)。

因爲需要更改php源程序後,重新編譯php。在使用fpm方式安裝時,打補丁過程中會修改php的文件,所以需要在打完fpm補丁後再修改php源程序。

 


tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
cd php-5.2.14/

vi main/fopen_wrappers.c
 



找到php_check_open_basedir_ex方法,在char *end;和pathbuf = estrdup(PG(open_basedir));之間插入以下的代碼:

 


char path_copy[MAXPATHLEN];
int path_len;
path_len = strlen(path);
if (path_len >= MAXPATHLEN) {
errno = EPERM;
return -1;
}
if (path_len > 0 && path[path_len-1] == PHP_DIR_SEPARATOR) {
memcpy(path_copy, path, path_len+1);
while (path_len > 1 && path_copy[path_len-1] == PHP_DIR_SEPARATOR) path_len--;
path_copy[path_len] = '\0';
path = (const char *)&path_copy;
}

char *env_doc_root;
if (PG(doc_root)) {
env_doc_root = estrdup(PG(doc_root));
} else {
env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
}
if (env_doc_root) {
int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
efree(env_doc_root);
if (res_root == 0) {
return 0;
}
if (res_root == -2) {
errno = EPERM;
return -1;
}
}

 



然後編譯安裝php。

並php.ini的open_basedir配置
open_basedir = "/tmp/:/var/tmp/"

這樣就徹底解決了,webshell跨站點目錄訪問問題。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章