此文为代码审计学习笔记,请大家支持正版,购买正版。
漏洞和操作系统、webserver、PHP版本以及配置等密切相关,Phpstudy是一个集成开发环境,可以在各种php、webserver之间切换。
下面是和安全相关的选项,这些选项只有在服务重启之后才会生效
1. register_globals(全局变量注册开关,使GET、POST等方式提交上来的数据变成全局变量)
该选项在设置为 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。
php
if($ user==' admin') {
echo 'true';
//do something
}
?>
思考利用:可以利用该特性,通过GET或POST人为传递给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 的所有者是用户 b 并且与文件 a. php 不在属于同一个用户的文件夹中,
当启用了安全模式时,使用 a 用户执行 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.其他指令说明