我们怎么来设置php禁止运行的函数呢?

其实,我们可以在php.ini文件进行设置,如图

此时,我们可以看到,我的本地php环境中,并没用禁止任何php函数的运行,接下来,我们在本地运行以下代码:

phpinfo.php 源代码:

<?php

phpinfo();

?>

开启浏览器访问,phpinfo信息正常显示的,如图

当我们将phpinfo函数disable掉之后,效果又是怎样的呢?

如图:

重新启动Apache使该设置生效,然后,通过浏览器重新访问phpinfo.php文件,如图:

看到了吗:Warning: phpinfo() has been disabled for security reasons in D:\WWW\phpinfo.php on line 2

说明我们已经将phpinfo函数成功禁用了,这样,或许系统就会更加的安全了。

如需禁用多个php函数,要用英文半角逗号分开,如下:

disable_functions = passthru,exec,system,popen,chroot,scandir,chgrp,chown,escapesh

ellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status

建议在php.ini文件中禁用以上的这些php函数,要用的时候,再解禁。

我们可以使用MKDuse大牛写的一个php探针来检测我们安装的php环境中扩展/函数等开关的情况。

比如,我刚才禁用了phpinfo函数,则探针程序返回如下信息:

是不是很好用呢,代码贴上,供大家参考:

dis_func.php 源代码:

<?php

header("content-Type: text/html; charset=gb2312");

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/html; charset=utf-8" />

<title>PHP 探针 v1.0</title>

<style type="text/css">

<!--

body{text-align:center;margin-top:20px;background-color:#a9b674;}

#overview{width:700px;margin:0 auto;text-align:left;}

a{text-decoration:underline;color:#992700;}

.strong{color:#992700;}

.basew{width:300px;}

-->

</style>

</head>

<body>

<div id="overview">

<div id="copyright">版权信息

<a href="hello.php?typ=baseinfo">[基本信息]</a> <a href="hello.php?typ=superinfo">[高级信息]</a>

<?php

if (function_exists("phpinfo")){

echo'<a href="hello.php?typ=phpinfo">[phpinfo]</a>';}

echo'<br />php探针v1.0 by MKDuse(blueidea-id)<br /></div>';

if (empty($_GET['typ'])){

baseinfo();}

else{

switch ($_GET['typ']){

case 'phpinfo':

phpinfoview();

break;

case 'superinfo':

superinfo();

break;

case 'baseinfo':

baseinfo();

break;

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 $overview;

}

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()

{

var time;

time=new Date();

return time.getTime();

}

start_time=gettime();

</script>

<?php

echo '<h2>带宽测试</h2>';

for ($i=0;$i<100;$i++){

print "<!--1234567890#########0#########0#########0#########0#########0#########0#########0#########012345-->";}

?>

<p id="dk"></p>

<script language="javascript" type='text/javascript'>

var timea;

var netspeed;

timea=gettime()-start_time;

netspeed=Math.round(10/timea*1000);

document.getElementByIdx("dk").innerHTML="向客户端发送10KB数据,耗时"+timea+"ms<br />您与此服务器的连接速度为"+netspeed+"kb/s";

</script>

<?php

echo'<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)){

echo'没有禁用</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>

那么,是不是我们通过disable_functions来禁用了php相应函数,渗透测试的时候就没法使用相应的php函数了呢,比如我禁用了phpinfo函数,是否就没有其他的办法来直接运行phpinfo函数了呢?

答案是否。

我们可以通过dl函数来运行时加载一个php扩展,然后,运行扩展里面的php函数,从而达到绕过disable_functions设置的黑名单函数。

但是,前提是dl函数能够被执行,也就是说,dl函数是激活了的,enable_dl = Off(说明dl函数是处于非激活状态),如图:

enable_dl = Off,这样的设置会使php系统更加的安全。

接下来

证明:

如果通过disable_functions设置禁用了phpinfo函数,还有其他的办法可以直接运行phpinfo函数。

首先,我们要知道phpinfo这个函数在哪个php扩展里面:

<?php

$arr = get_loaded_extensions();

foreach($arr as $key => $value)

{

echo $value;

echo ':';

print_r(get_extension_funcs($value));

echo '<br />';

}

?>

通过以上代码可知:phpinfo函数是standard扩展里面的第25个函数,如图:

此时,我们就可以验证以上的证明了,在渗透测试的时候,如果站点服务器禁用了phpinfo函数,而没有禁用dl函数,那么,我们可以自己手动上传一个standard扩展到站点的可写目录,然后,通过调用自己上传的standard扩展里的phpinfo函数,从而实现获取目标服务器的相关信息。

总结:

使用disable_functions设置禁用函数的黑名单。

在disable_functions设置的时候,记得第一件事就是先将dl函数禁止运行(设置enable = Off),然后,才是禁用其他的函数:如:exec,system,eval等等。

使用extension_loaded函数来检测一个php扩展是否已经加载,其对应的get方法get_loaded_extensions,是获取已经加载的所有php扩展,如果想开关该php扩展,可以在php.ini文件中设置。

get_extension_funcs函数可以返回某个已加载的php模块里面的所有函数。

disable_functions(禁用php函数)的更多相关文章

  1. php 如何禁用eval() 函数实例详解

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险并经常会出现一些问题,今天我们就一起来看看eval函数对数组的操作及php 如何禁用eval() 函数: <?php $ ...

  2. php 禁用eval( )函数

    php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的. 但是eval()对于php安全来说具有很大的杀伤力,因此一般不用的情况下为了防 ...

  3. 禁用PHP函数,可以对php.ini进行配置

    php.ini 里有个 disable_functions 开关选项,此选项可关闭一些危险的函数,比如system,exec 等.比如: disable_functions = phpinfo , 如 ...

  4. 转:窗口启用/禁用功能函数EnableWindow的使用

    在非MFC环境中如何使控件或者窗口禁用呢?起初是想通过发送消息来实现,但找来找去都木有找到控件禁用的消息(也是是博主木有找到的缘故),所以只能另辟蹊径,使用 EnableWindow这个函数, 该函数 ...

  5. 窗口启用/禁用功能函数EnableWindow的使用

    在非MFC环境中如何使控件或者窗口禁用呢?起初是想通过发送消息来实现,但找来找去都木有找到控件禁用的消息(也是是博主木有找到的缘故),所以只能另辟蹊径,使用 EnableWindow这个函数, 该函数 ...

  6. disable_functions php-fpm root

    php.ini disable_functions 禁用某些函数 需要时注意打开 php-fpm 对应conf user group为root时 ERROR: [pool www] please sp ...

  7. [web安全原理]PHP命令执行漏洞基础

    前言 PHP命令执行漏洞 应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命 ...

  8. 有些需要禁用的PHP危险函数(disable_functions)

    phpinfo() 功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息. 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec(). 危险等级 ...

  9. 一些需要禁用的PHP危险函数(disable_functions)

    一些需要禁用的PHP危险函数(disable_functions)   有时候为了安全我们需要禁掉一些PHP危险函数,整理如下需要的朋友可以参考下 phpinfo() 功能描述:输出 PHP 环境信息 ...

随机推荐

  1. Android 获取系统短信内容

    //这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...

  2. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  3. 深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

    首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

  4. ruby eclipse调试

    rubyinstaller 1.9.3eclipse Keplermarketplace ruby dltk 5.0ruby devkit(Ruby 1.8.7 and 1.9.3) DevKit-t ...

  5. -_-#【Better Code】

    i++ 与 ++i 的性能区别 if (true) { console.log('hi') } if (!false) { console.log('hi~') } true && c ...

  6. ☀【JS】有效状态机

    JavaScript与有限状态机http://www.ruanyifeng.com/blog/2013/09/finite-state_machine_for_javascript.html

  7. SharePoint 2010 安装简介及相关补丁下载

    转:http://www.cnblogs.com/jianyus/archive/2011/10/28/2228212.html 1.安装Windows Server 2008 系统,这个我就不说了, ...

  8. [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码

    转自:http://www.cnblogs.com/gispeng/archive/2008/10/06/1304534.html    [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码 ( ...

  9. Text Reverse

    Text Reverse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  10. MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

    原文地址:http://liangweilinux.blog.51cto.com/8340258/1728131 首先在此感谢下我的老师年一线实战经验,我当然不能和我的老师平起平坐,得到老师三分之一的 ...