代码审计学习(一)
PHP核心配置
首先需了解 PHP_INI_* 常量的定义
常量 | 含义 |
---|---|
PHP_INI_USER | 可在用户的php脚本或者windows注册表中设置 |
PHP_INI_PERDIR | 可在php.ini .htaccess或http.conf中设置 |
PHP_INI_SYSTEM | 可在php.ini 或 http.conf中配置 |
PHP_INI_ALL | 可在任何地方配置 |
PHP.ini only | 可仅在php.ini中配置 |
- 常见影响安全的配置
1. register_globals(全局注册变量):
若为on,会直接把用户通过GET、POST传进来的参数注册为全局变量并初始化参数对应的值
仅在php版本低于5.4.0时可用
2. allow_url_include(是否运行包含远程文件):
若为on,可以直接包含远程文件。当变量可控时,可用来构造php代码。
allow_url_include在 PHP 5.2.0后默认为off,配置范围是PHP_INI_ALL
3. magic_quotes_gpc(魔术引号自动过滤):
若为on,会自动在GET、POST、COOKIE到的变量中的单引号(’)、双引号(“)、反斜杠(\)及空白字符(NULL)前加上反斜杠(\)。但是在PHP5中的magic_quotes_gpc并不会过滤$_SERVER变量,导致很多漏洞
在PHP5.4之前可用。小于4.2.3时配置范围是PHP_INI_ALL;大于时是PHP_INI_PERDIR
4. magic_quotes_runtime(魔术引号自动过滤):
与magic_quotes_gpc概念差不多,但处理对象不同。只处理从数据库或者文件中获取的数据。
只有部分函数受影响,大多为读取数据库或文件的函数
5. magic_quotes_sybase(魔术引号自动过滤):
用于自动过滤字符。当为on,会覆盖掉magic_quotes_gpc=on的配置。处理对象与gpc一致,但处理方式仅仅为转义空字符与把 ‘ 变成 “
PHP 5.4.0前可用,配置范围为PHP_INI_ALL
6. safe_mode(安全模式):
PHP内嵌的安全机制。当为on时,可用的指令为 safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allow_env_vars、safe_mode_protected_env_vars
safe_mode指令的配置范围为PHP_INI_SYSTEM PHP5.4之后被取消
所有文件操作函数会受限制(file()、include()..)
通过函数popen()、system()、exec()执行命令或程序会报错
7. open_basedir:
open_basedir指令用来限制PHP只能访问哪些目录
指定的限制是前缀不是文件名
小于 PHP5.2.3时是PHP_INI_SYSTEM,大于时是PHP_INI_ALL
8. disable_functions(禁用函数):
禁止敏感函数的使用
记得把dl()禁掉 否则可利用dl()绕过
配置范围为php.ini only
工具
- 编辑器:sublime text、UltraEdit
- 审计工具:Seay源码审计系统、RIPS
- 漏洞验证工具:burp、Firebug、
- 辅助工具:编码转换工具、正则调试工具等
代码审计思路
1. 根据敏感关键字回溯参数传递过程
2. 查看可控变量,正向追踪变量传递过程
3. 寻找敏感功能点,通读功能点代码
4. 直接通读全文代码