PHP安全选项配置学习笔记

此文为代码审计学习笔记,请大家支持正版,购买正版。


漏洞和操作系统、webserverPHP版本以及配置等密切相关,Phpstudy是一个集成开发环境,可以在各种phpwebserver之间切换。


下面是和安全相关的选项,这些选项只有在服务重启之后才会生效

1. register_globals(全局变量注册开关,使GETPOST等方式提交上来的数据变成全局变量)

该选项在设置为 on 的情况下,会直接把用户 GET、 POST 等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。

register_ globals 在 PHP 版本小于等于 4. 2. 3 时设置为 PHP_ INI_ ALL, 从 PHP   5. 3. 0 起被废弃,不推荐使用,在 PHP   5. 4. 0 中移除了该选项(不再支持了!在php.ini中添上也没有用处)。

当 register_ globals 设置为 on 且 PHP 版本低于 5. 4. 0 时,如下代码输出结果为 true

 if$ user==' admin')   

 echo   'true'; 

 //do   something 

}

?>

思考利用:可以利用该特性,通过GETPOST人为传递给web页面特定变量,从而改变逻辑,达到漏洞利用的目的。

 

 

 

2. allow_ url_ include( 是否允许包含远程文件)

这个配置指令对 PHP 安全的影响不可小觑。在该配置为 on 的情况下,它可以直接包含远程文件,当存在 include$ var) 且$ var 可控的情况下,可以直接控制$ var 变量来执行 PHP 代码。 

allow_ url_ include 在 PHP 5. 2. 0 后默认设置为 off, 配置范围是 PHP_ INI_ ALL。 

与之类似的配置有 allow_ url_ fopen, 配置是否允许打开远程文件,不过该参数对安全的影响没有 allow_ url_ include 大,故这里不详细介绍。

 

 

 

3. magic_ quotes_ gpc( 魔术引号自动过滤,在 GET、 POST、 COOKIE 变量中的单引号(')、双引号(")、反斜杠(\)及空字符( NULL) 的前面加上反斜杠(\)) 

magic_ quotes_ gpc 在安全方面做了很大的贡献,只要它被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被利用,它也是让渗透测试人员很头疼的一个东西。

当该选项设置为 on 时,会自动在 GET、 POST、 COOKIE 变量中的单引号(')、双引号(")、反斜杠(\)及空字符( NULL) 的前面加上反斜杠(\),

但是在 PHP   5 中 magic_ quotes_ gpc 并不会过滤$_ SERVER 变量,导致很多类似 client- ip、 referer 一类的漏洞能够利用。

在 PHP   5. 3 之后的不推荐使用 magic_ quotes_ gpc, PHP   5. 4 之后干脆被取消,所以你下载 PHP   5. 4 之后的版本并打开配置文件会发现找不到这个配置选项。

在 PHP 版本小于 4. 2. 3 时,配置范围是 PHP_ INI_ ALL; 在 PHP 版本大于 4. 2. 3 时,是 PHP_ INI_ PERDIR

 

 

 

4. magic_ quotes_ runtime( 魔术引号自动过滤,对于某些函数,这些函数是读取数据库或者文件,读取时候在单引号(')、双引号(")、反斜杠(\)及空字符( NULL) 的前面加上反斜杠(\,防止二次漏洞利用) 

magic_ quotes_ runtime 也是自动在单引号(')、双引号(")、反斜杠(\)及空字符( NULL) 的前面加上反斜杠(\)。

它跟 magic_ quotes_ gpc 的区别是,处理的对象不一样, magic_ quotes_ runtime 只对从数据库或者文件中获取的数据进行过滤,它的作用也非常大,

因为很多程序员只对外部输入的数据进行过滤,

却没有想过从数据库获取的数据同样也会有特殊字符存在,

所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发攻击。

同样, magic_ quotes_ runtime 在 PHP   5. 4 之后也被取消,配置范围是 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_ array()、

mysqli_ fetch_ assoc()、 mysqli_ fetch_ object()、 pg_ fetch_ row()、 pg_ 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()。

 

 

 

5. magic_ quotes_ sybase( 魔术引号自动过滤,对GET、 POST、 Cookie 进行处理,转义了空字符和把单引号(')变成了双引号(''),排名顺序比GPC高级)

 magic_ quotes_ sybase 指令用于自动过滤特殊字符,当设置为 on 时,它会覆盖掉 magic_ quotes_ gpc= on 的配置,也就是说,即使配置了 gpc= on 也是没有效果的。

这个指令与 gpc 的共同点是处理的对象一致,即都对GET、 POST、 Cookie 进行处理。而它们之前的区别在于处理方式不一样,

 magic_ quotes_ sybase 仅仅是转义了空字符和把单引号(')变成了双引号('')。

与 gpc 相比,这个指令使用得更少,它的配置范围是 PHP_ INI_ ALL, 在 PHP   5. 4. 0 中移除了该选项。

‘变成“     %00变成\0

 

 

 

6. safe_ mode( 安全模式,控制PHP可以include等函数的目录或者执行外部脚本的路径)

安全模式是 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, PHP   5. 4 之后被取消。

这个配置会出现下面限制: 

1) 所有文件操作函数(例如 unlink()、 file() 和 include()) 等都会受到限制。

例如,文件 a. php 和文件 c. txt 的文件所有者是用户 a, 文件 b. txt 的所有者是用户 并且与文件 a. php 不在属于同一个用户的文件夹中,

当启用了安全模式时,使用 用户执行 a. php, 删除文件 c. txt 可成功删除,但是删除文件 b. php 会失败。

对文件操作的 include 等函数也一样,如果有一些脚本文件放在非 Web 服务启动用户所有的目录下,需要利用 include 等函数来加载一些类或函数,可以使用

safe_ mode_ include_ dir 指令来配置可以包含的路径。

2) 通过函数 popen()、 system() 以及 exec() 等函数执行命令或程序会提示错误。

如果我们需要使用一些外部脚本,可以把它们集中放在一个目录下,然后使用 safe_ mode_ exec_ dir 指令指向脚本的目录。

下面是启用 safe_ mode 指令时受影响的函数、变量及配置指令的完整列表:

 apache_ request_ headers()、 ackticks()、 hdir()、 hgrp()、 chmode()、 chown()、 copy()、 dbase_ open()、 dbmopen()、 dl()、 exec()、 filepro()、 filepro_ retrieve()、 ilepro_ rowcount()、 fopen()、 header()、 highlight_ file()、 ifx_*、 ingres_*、 link()、 mail()、 max_ execution_ time()、 mkdir()、 move_ uploaded_ file()、 mysql_*、 parse_ ini_ file()、 passthru()、 pg_ lo_ import()、 popen()、 posix_ mkfifo()、 putenv()、 rename()、 zmdir()、 set_ time_ limit()、 shell_ exec()、 show_ source()、 symlink()、 system()、 touch()。 

 

 

 

7. open_ basedir(限制PHP可以访问的目录)

PHP 可访问目录 open_ basedir 指令用来限制 PHP 只能访问哪些目录,

通常我们只需要设置 Web 文件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到 open_ basedir 指令中,

多个目录以分号(;)分割。使用 open_ basedir 需要注意的一点是,指定的限制实际上是前缀,而不是目录名。例如,如果配置 open_ basedir=/ www/ a

 那么目录/ www/ a / www/ ab 都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用斜线结束路径名。例如设置成: open_ basedir=/ www/ a/。 

当 open_ basedir 配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上面也会有一定的影响。

该指令的配置范围在 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 (是否显示PHP错误,以及显示错误的级别)

错误显示 display_ errors 表明是否显示 PHP 脚本内部错误的选项

在调试 PHP 的时候,通常都把 PHP 错误显示打开,但是在生产环境中,建议关闭 PHP 错误回显,即设置 display_ errors= off, 

以避免带来一些安全隐患。在设置 display_ errors= on 时,还可以配置的一个指令是 error_ reporting, 这个选项用来配置错误显示的级别,

可使用数字也可使用内置常量配置,数字格式与常量格式的详细信息如表 1- 2 所示。

这两个指令的配置范围都是 PHP_ INI_ ALL




10.其他指令说明

PHP安全选项配置学习笔记_第1张图片

你可能感兴趣的:(WEB安全)