首页 > 代码库 > 代码审计读书笔记一

代码审计读书笔记一

PHP核心配置详解

register_globals(全局变量注册开关)

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

配置范围为PHP_IN_ALL

PHP版本必须小于5.4.0

 

allow_url_include(是否允许包含远程文件)

当存在include($var)且var可控的情况下,可直接控制$var执行php代码

在PHP5.2.0后默认设置为off,配置范围为PHP_IN_ALL

与之类似的配置有allow_url_fopen,配置是否允许打开远程文件。

 

magic_quotes_gpc(魔术引号自动过滤)

当该选项为on时,会自动在get,post,cookie变量中的单引号,双引号,反斜杠以及空字符前面加上反斜杠,

但在php5中magic_quotes_gpc并不会过滤$_SERVER变量,PHP5.4被取消

php小于4.2.3,配置范围是PHP_IN_ALL,之后是PHP_IN_PERDIR

 

magic_quotes_runtime(魔术引号自动过滤)

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( )。

 

magic_quotes_sybase(魔术引号自动过滤)

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 中移除了该选项。

 

safe_mode(安全模式)

当 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 之
后被取消。

下面是启用 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( )。

open_basedir PHP 可访问目录

open_basedir 指令用来限制 PHP 只能访问哪些目录,通常我们只需要设置 Web
件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到 open_basedir
指令中,多个目录以分号 ( ;) 分割。使用 open_basedir 需要注意的一点是,指定的限
制实际上是前缀,而不是目录名。例如,如果配置 open_ b asedir =/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。

 

disable_functions 禁用函数

当你想用本指令禁止一些危险函数时,切记要把 dl()
函数也加到禁止列表,因为攻击者可以利用 dl() 函数来加载自定义的 PHP 扩展以突破
disable_functions 指令的限制。本 指 令 配 置 范 围 为 php.ini only。

 

display_errors 和 error_reporting 错误显示

 

代码审计读书笔记一