PHP核心配置
2018-12-19 本文已影响0人
Echocipher
代码在不同环境下执行结果会有不同,不同的版本会指令的变更,所以代码审计前要很熟悉各个版本配置文件的核心指令,官方配置说明地址:http://www.php.net/manual/zh/ini.list.php
PHP_INI_*常量定义
常量 | 含义 |
---|---|
PHP_INI_USER | PHP脚本/Windows注册表中设置 |
PHP_INI_PERDIR | 在php.ini/.htaccess/httpd.conf中设置 |
PHP_INI_SYSTEM | 在php.ini/httpd.conf中设置 |
PHP_IN_ALL | 任何地方设置 |
php.ini only | 仅能在php.ini中配置 |
影响php脚本安全的配置列表以及核心配置选项
- register_globals(全局变量注册开关):直接把用户GET,POST提交上来的参数注册成全局变量并初始化值为参数对应的值,使得参数可以直接在脚本中使用。
get post当register_globals设置为on,且PHP版本低于5.40时,以下代码输出为true
register_globals在PHP版本小于等于4.2.3时设置为PHP_INI_ALL,在PHP 5.3.0起被废弃,不推荐使用,PHP 5.4.0中移除了该选项。
- allow_url_include(是否包含远程文件):当存在include($var)且$var可控的情况下,可以直接控制变量执行php代码。
当allow_url_include设置为off,且PHP版本高于5.2.0时,以下代码可以包含远程文件。
与此类似的配置还有allow_url_fopen,但是没有allow_url_include大。
- magic_quotes_gpc(魔术引号自动过滤):开启以后会对GET、POST、COOKIE变量中的单引号,双引号,反斜杠,以及空字符(NULL)前面加上反斜杠,但是PHP 5中并不会过滤$_SERVER变量,导致cient-ip,referer一类的漏洞可以利用,PHP 5.4 之后被取消,当PHP版本小于4.2.3时是PHP_INI_ALL,在版本大于4.2.3时是PHP_INI_PERDIR。
对于$_SERVER不会过滤,详细见 :http://php.net/manual/zh/reserved.variables.server.php
referer- magic_quotes_runtime(魔术引号自动过滤):与magic_quotes_gpc相同的是加反斜杠,区别是处理对象不同,它只从数据库或者文件中获取的数据进行过滤。在PHP 5.4之后被取消,配置范围是PHP_INI_ALL。
只有部分函数受影响,所以这个配置是可以绕过的。
- magic_quotes_sybase(魔术引号自动过滤):用于自动过滤特殊字符,当设置为on的时候会覆盖掉magic_quotes_gpc的配置,同样对GET、POST、Cookie进行处理,但是仅仅转移空字符和把单引号变成双引号,与gpc相比,这个指令使用的更少,配置范围是PHP_INI_ALL,PHP 5.4.0之后移除了该选项。
- safe_mode(安全模式):PHP 5.4.0之后被取消,这个配置会出现如下限制:
- 所有的文件操作函数(unlink()、file()、include())等都会被限制,如果有一些脚本文件放在非启动用户所有的目录下,需要利用inclde等函数来加载类或者函数时,可以使用safe_mode_include_dir指令来配置可以包含的路径。
- 通过函数popen()、system()以及exec()等函数执行命令或程序时会提示错误,如果需要使用外部脚本时,我们可以把他们集中放在一个目录,然后使用safe_mode_exec_dir来指定脚本的目录。
- open_basedir:PHP 可访问目录:用来限制只能访问哪些目录,通常设置web文件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到指令中,多个目录以分号分隔。限制目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上也会有一定的影响,当PHP版本小于5.2.3时是 PHP_INI_SYSTEM,大于5.2.3时是 PHP_INI_ALL。
指令限制的是前缀,而不是目录名,如 open_base_dir=/www/a,则目录/www/a与/www/ab都是可以访问的。如果想限定在指定目录,则以斜线结束,如:/www/a/
- disable_functions(禁用函数):可以禁止一些敏感函数的使用,配置范围是 php.ini only,配置禁用函数时以都好分割函数名。
记得dl()函数也要加载到禁止列表,因为攻击者可以用dl()函数来加载自定义PHP扩展来突破指令限制。
- display_errors与error_reporting 错误显示:调试PHP时,一般打开错误显示,但是生产环境中,建议关闭错误回显,以免带来安全隐患,当display_errors=on时,还可以配置error_reporting,来配置错误显示的级别。这两个指令配置范围都是 PHP_INI_ALL.。