代码审计之PHP核心配置详解
代码审计之PHP核心配置详解
- 1.register_globals(全局变量注册开关)
- 2.allow_url_include(是否允许包含远程文件)
- 3.magic_quotes_gpc(魔术引号自动过滤)
- 4.magic_quotes_runtime(魔术引号自动过滤)
- 5.magic_quotes_sybase(魔术引号自动过滤)
- 6.safe_mode(安全模式)
- 7.open_basedir PHP可访问目录
- 8.disable_functions(禁用函数)
- 9.display_errors和error_reporting错误显示
PHP_INI_*
常量的定义
1.register_globals(全局变量注册开关)
该选项在设置为on的情况下,会直接把用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。
register_globals
在 PHP版本小于等于4.2.3时设置为PHP_INI_ALL
,从 PHP 5.3.0起被废弃,不推荐使用,在PHP 5.4.0中移除了该选项
当register_globals
设置为on且PHP版本低于5.4.0时,如下代码输出结果为true:
<?phpif($user=='admin') {echo 'true';//do something}
2.allow_url_include(是否允许包含远程文件)
在该配置为on的情况下,它可以直接包含远程文件,当存在include ($var)
且$var
可控的情况下,可以直接控制$var
变量来执行PHP代码
allow_url_include
在PHP5.2.0后默认设置为off,配置范围是PHP_INI_ALL
。与之类似的配置有allow_url_fopen
,配置是否允许打开远程文件**
配置allow_url_include
为on,可以直接包含远程文件。测试代码如下:
<?phpinclude $_GET['a'];
3.magic_quotes_gpc(魔术引号自动过滤)
当该选项设置为on时,会自动在GET、POST、COOKIE
变量中的单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\),但是在PHP 5中magic_quotes_gpc
并不会过滤$_SERVER
变量,导致很多类似client-ip、referer
一类的漏洞能够利用
在PHP 5.3之后的不推荐使用
magic_quotes_gpc
,PHP5.4之后干脆被取消。在PHP版本小于4.2.3时,配置范围是PHP_INI_ALL
;在PHP版本大于4.2.3时,是PHP_INI_PERDIR
<?phpecho $_GET['seay'];
4.magic_quotes_runtime(魔术引号自动过滤)
magic_quotes_runtime
也是自动在单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\)。它跟magic_quotes_gpc
的区别是,处理的对象不一样,magic_quotes_runtime
只对从数据库或者文件中获取的数据进行过滤
很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发攻击
magic_quotes_runtime
在PHP 5.4之后也被取消,配置范围是PHP_INI_ALL
#文件1.txt1'2"3\4#文件1.php<?phpini_set("magic_quotes_runtime", "1");echo file_get_contents("1.txt");
5.magic_quotes_sybase(魔术引号自动过滤)
magic_quotes_sybase
指令用于自动过滤特殊字符,当设置为on时,它会覆盖掉magic_quotes_gpc=on
的配置,也就是说,即使配置了gpc=on
也是没有效果的。这个指令与gpc的共同点是处理的对象一致,即都对GET、POST、Cookie进行处理。而它们之前的区别在于处理方式不一样,magic_quotes_sybase
仅仅是转义了空字符和把单引号(‘)变成了双引号(’')
它的配置范围是
PHP_INI_ALL
,在PHP 5.4.0中移除了该选项
<?phpecho $_GET['a'];?>
6.safe_mode(安全模式)
安全模式是PHP内嵌的一种安全机制
safe_mode
指令的配置范围为PHP_INI_SYSTEM
,PHP 5.4之后被取消
这个配置会出现下面限制:
所有文件操作函数(例如unlink()、file()和include()
)等都会受到限制。例如,文件a.php和文件c.txt的文件所有者是用户a,文件b.txt的所有者是用户b并且与文件a.php不在属于同一个用户的文件夹中,当启用了安全模式时,使用a用户执行a.php,删除文件c.txt可成功删除,但是删除文件b.php会失败。对文件操作的include等函数也一样,如果有一些脚本文件放在非Web服务启动用户所有的目录下,需要利用include等函数来加载一些类或函数,可以使用safe_mode_include_dir
指令来配置可以包含的路径
通过函数popen()、system()以及exec()
等函数执行命令或程序会提示错误。如果我们需要使用一些外部脚本,可以把它们集中放在一个目录下,然后使用safe_mode_exec_dir
指令指向脚本的目录
7.open_basedir PHP可访问目录
open_basedir
指令用来限制PHP只能访问哪些目录,通常我们只需要设置Web文件目录即可
如果需要加载外部脚本,也需要把脚本所在目录路径加入到open_basedir
指令中,多个目录以分号(;
)分割。
使用
open_basedir
需要注意的一点是,指定的限制实际上是前缀,而不是目录名。例如,如果配置open_basedir=/www/a
,那么目录/www/a
和/www/ab
都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用斜线结束路径名。例如设置成:open_basedir=/www/a/
该指令的配置范围在 PHP版本小于5.2.3时是PHP_INI_SYSTEM
,在PHP版本大于等于5.2.3是PHP_INI_ALL
8.disable_functions(禁用函数)
在正式的生产环境中,为了更安全地运行PHP,也可以使用disable_functions
指令来禁止一些敏感函数的使用。当你想用本指令禁止一些危险函数时,切记要把dl()
函数也加到禁止列表,因为攻击者可以利用dl()
函数来加载自定义的PHP扩展以突破disable_functions
指令的限制
本指令配置范围为
php.ini only
。配置禁用函数时使用逗号分割函数名,例如:disable_functions=phpinfo,eval,passthru,exec,system
9.display_errors和error_reporting错误显示
display_errors
表明是否显示PHP脚本内部错误的选项,在调试PHP的时候,通常都把PHP错误显示打开,但是在生产环境中,建议关闭PHP错误回显,即设置display_errors=off
,以避免带来一些安全隐患
在设置display_errors=on
时,还可以配置的一个指令是error_reporting
,这个选项用来配置错误显示的级别,可使用数字也可使用内置常量配置
这两个指令的配置范围都是
PHP_INI_ALL
来源地址:https://blog.csdn.net/Gherbirthday0916/article/details/130173968
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341