• PHP核心配置详解


    代码在不同的环境下的执行结果也会大不相同,可能就因为一个配置的原因,导致一个非常高危的漏洞可以利用;也
    可能因为配置的问题,导致你鼓捣很久都无法成功构造利用漏洞的代码。
    不同PHP版本中配置指令一些不一样的地方,新的版本可能会增加或者删除部分指令,改变指令默认设置或者是固定设置指令,因此在代码审计之前必须要非常熟悉PHP各个版本中的配置文件的核心指令,才能更高效的挖掘漏洞。
                                                                PHP_INI_*常量的定义
        

        1. register_globals(全局变量注册开关)
        该选项设置为on的情况下,会直接把用户GET、POST等方式提交上来的参数注册成全局变量,并初始化值为参数对应的值,使得提交的参数直接可以在脚本中使用。
        register_globals在PHP版本小于等于4.2.3时设置为PHP_INI_ALL,从PHP5.3.0开始被废弃,不推荐使用,PHP5.4.0移除了该选项。
        2. allow_url_include(是否允许远程包含)
        该配置为on的情况下,它可以直接包含远程文件,当存在include($var)切$var可控的情况下,可以直接控制$var变量来执行PHP代码。include等函数支持ftp、http等协议。
        allow_url_include在PHP5.2.0后的默认版本设置为off,配置范围是PHP_INI_ALL。
        
        与之类似的配置有allow_url_fopen,配置是否允许远程打开文件。这会激活URL形式的fopen封装协议使得可以访问URL对象,例如文件。
        3. magic_quotes_gpc(魔术引号自动过滤)
        magic_quotes_gpc在安全方面做出了很大的贡献,只要他被开启,在不存在编码或者其他特殊情况的绕过的情况下,可以使得很多漏洞无法被利用。当它设置为on时,会自动在GET、POST、COOKIE变量中的单引号(')、双引号(")、

        反斜杠()及空字符(NULL)的前面加上反斜杠(),但是PHP 5中的magic_quotes_gpc不会过滤$_SERVER变量,导致很多类似client-ip、referer一类的漏洞能够利用。
        在PHP5.3之后不推荐使用magic_quotes_gpc;在PHP5.4以后的版本取消了该配置。在PHP版本小于4.2.3时,配置范围是PHP_INI_ALL;在PHP版本大于4.2.3时,是PHP_INI_PERDIR。
        测试代码php版本5.2.17

     <?php
            echo $_GET['shell'];//GET域内变量的单引号会转义
            echo '<br>';
            print_r( $_SERVER);//SERVER域内变量的单引号不会被转义

      

        4. magic_quotes_runtime(魔术引号自动过滤)
        magic_quotes_runtime也是自动在自动在单引号(')、双引号(")、反斜杠()及控字符(NULL)的前面加上反斜杠()。他跟magic_quotes_gpc的区别是,处理的对象不一样,magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤,它的作用也非常大。很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据也同样会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据库即可触发攻击。
        同样的在PHP5.4以后的版本magic_quotes_runtime被取消了,配置范围是PHP_INI_ALL。
        有一个点需要注意,只有部分函数受它影响,所以在某些情况下这个配置是可以绕过的,受影响的列表包括
        get_meta_tags()、file_get_contents()file()、fgets()、fwrite()、fread()、fputcsv()、stream_socket_recvfrom()、exec()system()、passthru()、stream_get_contents()、bzread()、gzfile()、gzgets()、gzwrite()、gzread()、exif_read_data()、dba_insert()、dba_replace()、dba_fetch()、ibase_fetch_row()、ibase_fetch_assoc()、ibase_fetch_object()、mssql_fetch_row()、mssql_fetch_object()、mssql_fetch_array()、mssql_fetch_assoc()、mysqli_fetch_row()、mysqli_fetch_assoc()、pg_fetch_array()、pg_fetch_object()、pg_fetch_all()、pg_select()、sybase_fetch_object()、sybase_fetch_array()、sybase_fetch_assoc()、SplFileObject::fgets()、SplFileObject::fgetcsv()、SplFileObject::fwrite()

    p测试代码
    #
    文件test.txt 1'2"34 php代码 <?php echo file_get_contents('test.txt');

     
        5. magic_quotes_sybase(魔术引号自动过滤)
        magic_quotes_sybase指令用于自动过滤特殊字符,当设置为on时,他会覆盖掉magic_quotes_gpc=on的设置,也就是说即使配置了gpc=on也是没有效果的。
        这个指令与gpc的共同点就时处理的对象一致,即都是对GET、POST、Cookie(由request传递来的参数)进行处理。
        它们的区别在于处理的方式不一样,magic_quotes_sybase仅仅是转移了空字符和把单引号(')变成了两个单引号('')。
        与GPC相比,这条指令用的更少,配置范围是PHP_INI_ALL,在PHP5.4.0中移除了该指令。

     
        6. safe_mode(安全模式)
        安全模式是一种PHP内嵌的一种安全机制,当safe_mode=on时,联动可以配置的指令有safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。
        safe_mode指令的配置范围为PHP_INI_SYSTEM,PHP5.4之后被取消
        这个配置会出现下面的限制:
            a. 所有的文件操作函数(例如unlink()、file()、和include())等都会受到限制。
            b. 通过函数popen()、system()以及exec()等函数执行命令或程序会提示错误。
        7. open_basedir(PHP可访问目录)
        open_basedir指令用来限制PHP只能访问那些目录,通常我们只需要设置Web文件目录即可。如果需要加载外部脚本,也需要把脚本所在目录路径加入到open_basedir指令中,多个目录以分号(;)分割。
        使用open_basedir需要注意的一点是,指定的显示实际上是前缀,而不是目录名。例如,如果配置的open_basedir=/www/a,那么目录/www/a和/www/ab都是可以访问的。所以如果要将访问仅限制在指定目录中,请用斜线结束路径名。例如设置成open_basedir=/www/a/
        当open_basedir配置目录后,执行脚本访问其他文件都需要验证文件路径,因此执行效率上会有一定的影响。
        该指令的配置范围在PHP5.2.3时是PHP_INI_SYSTEM,在PHP大于等于5.2.3时是PHP_INI_ALL。
        8. disable_functions(禁用函数)
        在正式的生产环境中,为了更安全地运行PHP,也可以使用disable_functions指令来禁止一些敏感函数的使用。当你想用本指令禁止一些危险函数时,切记要把dl()函数也加到禁止列表中,因为攻击者可以利用dl()函数来加载自定义的PHP扩展以突破disable_function指令的限制。
        本指令的范围是php.ini only。配置禁用函数时使用逗号分隔函数名。例如:disable_functions=phpinfo;eval;system;exec
        9. disable_errors和error_reporting错误显示
        disable_errors表明是否显示PHP脚本内部错误选项,在调试PHP的时候,通常都把PHP错误显示打开,但是在生产环境中,建议关闭PHP错误回显,即设置为disable_errors=off,以避免由于错误回显导致的安全问题。
        在设置disable_errors=on时,还可以配置的一个指令是error_reporting,这个选项来配置错误显示的级别,可以用数字也可以用内置的常量配置。
        这两个指令的配置范围都是PHP_INI_ALL

  • 相关阅读:
    jQuery选择器汇总
    jQuery源码分析系列:总体架构
    jQuery源码分析系列:队列操作
    jQuery源码分析系列:事件
    jQuery源码分析系列:数据缓存
    jQuery源码分析系列:Deferred延迟队列
    Redis基本数据类型与内部存储结构
    oracle 学习笔记1
    设计模式学习1
    注册DEV控件
  • 原文地址:https://www.cnblogs.com/ersuani/p/13927718.html
Copyright © 2020-2023  润新知