代码在不同环境下执行的结果大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用;也可能你已经找到的一个漏洞就因为你的配置有问题,导致你测试很久都无法构造有效的 exp,因此我们在做安全渗透或者代码审计的时候都要非常熟悉 PHP 各个版本中配置文件的核心指令,这样就能更高效的挖掘到高质量漏洞。
1.1 PHP 配置可被设定范围
PHP 的配置文件为 PHP.ini,里面的配置指令多达数百项。这些模式决定着一个 PHP的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以 PHP 脚本中用 ini_set()来设定,而有些则只能在 php.ini 或 httpd.conf 中去修改。
例如output_buffering指令是属于PHP_INI_PERDIR,因而就不能用ini_set()来设定。但但是 display_errors 指令是属于 PHP_INI_ALL 因而就可以在任何地方被设定,包括ini_set()。
下表是PHP_ini_*模式的定义
模式
定义
PHP_INI_USER
该配置选项可在用户的 PHP 脚本或 Windows 注册表中设置
PHP_INI_PERDIR
该配置选项可在 php.ini,.htaccess 或 httpd.conf 中设置
PHP_INI_SYSTEM
该配置选项可在 php.ini 或 httpd.conf 中设置
PHP_INI_ALL
该配置选项可在任何地方设置
php.ini only
该配置选项仅能在 php.ini 中设置
从表中可以看到,ini_set()的应用范围只能用于 PHP_INI_USER 和 PHP_INI_ALL 这两
种模式的配置。
PHP 配置项太多,我们不会全部说明,只会把跟安全有关的配置列出来讲解。
1.2 register_globals(全局变量注册开关)
配置解释:
当该配置设置为 on 时,会直接把用户 GET、POST 等方式提交上来的参数注册成全局变量并初
始化值为参数对应的值,使得参数可以直接在脚本中使用。
配置模式:
PHP_INI_ALL
默认配置:
register_globals = Off
该配置在PHP5.4.0 已经被移除,所以受影响的只有 5.4.0 之前的版本。
1.3 allow_url_include(是否允许包含远程文件)
配置解释:
在该配置为 on 的时,它可以直接包含远程文件。
配置模式:
PHP_INI_SYSTEM
默认配置:
从 PHP5.2.0 起,allow_url_include = Off
该配置造成安全问题在于,当包含文件 include($var)时,如果$var 可控,那么攻击者可以利用来远程执行代码。具体细节请参见“文件包含漏洞”的章节。
1.4 magic_quotes_gpc(魔术引号自动过滤)
配置解释:
当该选项配置为 on 时,会自动在 GET、POST、COOKIE 变量中的单引号(‘)、双引号(“)、反
斜杠(\)及空字符(NULL)的前面加上反斜杠(\)转义。
配置模式:
PHP_INI_PERDIR
默认配置:
magic_quotes_gpc = On
magic_quotes_gpc 在安全方面做了很大共享,只要它被开启,在不存在特殊编码或者
其他特殊绕过的情况下,可以使得很多漏洞无法被利用,这也正是让很多渗透测试人员头疼
的东西。它也有缺陷,就是不会过滤$_SERVER 变量,导致很多 client-ip,referer 一类的漏洞能够被利用。
来看简单的例子:
当配置为 off 时,输入的特殊符号被当成正常的输入,当配置为 on 时:
可以看到单引号被加了反斜杠做转义。
魔术引号自动过滤的配置有 3 个,它们分别是:
1.magic_quotes_gpc;
2.magic_quotes_runtime;
3.magic_quotes_sybase
这三个配置开启为 on 的时候都会过滤特殊字符,但是在 PHP5.4 之后的版本中(包括
5.4)被移除了。原因在于这些配置在实际运用中会把很多正常的符号过滤,对用户来说实
在不太友好。PHP 推荐开发人员使用其他过滤函数而不是利用配置文件进行过滤。
1.5 open_basedir PHP(PHP 可访问目录)
配置解释:
该配置将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。
配置模式:
PHP 版本<5.2.3: PHP_INI_SYSTEM
PHP 版本>=5.2.3:PHP_INI_ALL
默认配置:
open_basedir = NULL
使用该配置时,多个目录以分号;分割。值得注意的是,open_basedir 限制的是前缀,而不是目录名,比如 open_basedir=/www/a,那么目录/www/a 和目录/www/ab 都是可以访问的,所以如果要限定在指定的目录内,需要精确指定结束路径,比如设置成open_basedir =/www/a/。当该配置运行后,执行脚本访问其他文件都需要验证文件路径,因此对效率有
影响。
1.6 disable_functions(禁用函数)
配置解释:
本指令允许用户基于安全原因禁止某些函数。接受逗号分隔的函数名列表作为参数。
配置模式:
php.ini only
默认配置:
disable_functions = “”
当用户进制一些危险函数时,切记要把 dl()函数加到禁止列表,因为攻击者可以利用
dl()函数加载自定义的 PHP 扩展以突破 disable_functions 的限制。
配置禁用函数举例:disable_functions=phpinfo,eval,assert,system,passthru。
1.7 display_errors 和 error_reporting(报错显示)
配置解释:
该配置为 on 时,会把错误信息作为输出的一部分显示在屏幕上。
配置模式:
PHP_INI_ALL
默认配置:
display_errors = On
该配置对于开发过程中的调试非常有用。但是在实际使用环境中,建议关闭,以避免攻
击者通过报错内容搜集到有用的信息。当display_error=on时,还可以使error_reporting 来配置错误显示的级别。
error_reporting 也可以使用 error_reporting() 函数来设置当设置error_reporting(0)时,及时 display_error=on,也不会显示任何错误信息。
1.8 auto_prepend_file和auto_append_file(自动包含)
配置解释:
auto_prepend_file 设置在任何 PHP 文档之前自动包含的文件。
auto_apppend_file 设置在任何 PHP 文档之后自动包含的文件
配置模式:
PHP_INI_PERDIR
默认配置:
auto_prepend_file = “”
ato_append_file = “”
当设置 auto_prepend_file = ‘/www/1.php’时候,那么 1.php 都将被同路径下其他
PHP 文件运行之前包含。这项配置从安全上可用于网页监控。当出现黑客入侵时,运维人员
也要检查这类敏感配置,查看是否被黑客植入自动运行的木马。
你可能喜欢的文章
pwnhub公开赛WEB题解题思路pwnhub公开赛WEB题解题思路F5 BIG-IP CVE-2020-5902远程代码执行漏洞复现及修复方法SQL二次注入原理分析PHP反序列化字符逃逸详解Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)