zoukankan      html  css  js  c++  java
  • 【php安全】eval的禁止【原创】

    前段时间,网站遭受了黑客的入侵,后来在排查中发现了一个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 function

    eval是zend的,因此不是PHP_FUNCTION 函数;

    那么php怎么禁止eval呢?

    如果想禁掉eval可以用php的扩展 Suhosin

    安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可!

    总结,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

    1、安装编译工具
    yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils  patch perl

    2、安装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模块路径

    3、配置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函数

    4、测试
    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也是类似的用法。
  • 相关阅读:
    在一个字符串中找到第一个只出现一次的字符
    查找最小的k个数
    动规:最大上升子序列
    平衡二叉树
    【笔记】php和mysql结合 搞了一个表出来
    设计模式心得(既设计模式篇终章):描述设计模式时的通用公式
    分享系列 之 linux IO原理与几种零拷贝机制的实现
    近期分享:BIO 与 NIO 的实质区别到底是什么?
    源码阅读笔记 之 ThreadLocal —— 不复杂,却有点绕的一个 per thread API
    小脑袋瓜充满了问号:为什么AMQP可以叫做 Advanced?JMS就要low一等吗?
  • 原文地址:https://www.cnblogs.com/linewman/p/9918131.html
Copyright © 2011-2022 走看看