PHP代码审计
工具
代码编辑器
- Notepad++
- Visual Studio Code
代码审计工具
- Seay源代码审计系统
- Firtufy SCA
- RIPS
漏洞验证辅助
- BurpSuite Community
- 浏览器扩展
- 编码转换、加密解密工具
- 正则调试工具
- SQL执行监控工具
思路
- 检查铭感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤(逆向追踪)
- 找出哪些文件在接收外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数中,或者传递的过程中是否有代码逻辑漏洞(正向追踪)
- 直接挖掘功能点漏洞,根据自身的禁言判断该类应用通常在哪些功能中会出现漏洞,直接全篇阅读该功能代码
- 学好代码审计需要掌握一下几点
- PHP编程语言的特性和基础
- Web前端编程基础
- 漏洞形成原理
- 代码审计思路
- 不同系统、中间件之间的特性差异
PHP核心配置
常见PHP_INI_*
常量的定义
常量 | 含义 |
---|---|
PHP_INI_USER | 该配置选项可在用户的PHP脚本或Windows注册表中设置 |
PHP_INI_PERDIR | 该配置选项可在php.ini 、.htaccess 或httpd.conf 中设置 |
PHP_INI_SYSTEM | 该配置选项可在php.ini 或httpd.conf 中配置 |
PHP_INI_ALL | 该配置选项可在任何地方设置 |
php.ini.only | 该配置选项可仅可在php.ini中配置 |
常见核心配置
register_globals(全局变量注册开关)
版本:<=
PHP 5.3.0
在选项设置为on的情况下,会直接吧用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交的参数可以直接在脚本中使用
allow_url_include(是否允许包含远程文件)
版本:
PHP all
PHP 5.2.0之后默认为Off类似函数:
allow_url_fopen(是否打开远程文件)
在该配置为on的情况下,它可以直接远程包含文件,当存在include($var)
并且$var
可控的情况下,可以直接控制其来执行PHP代码
magic_quotes_gpc(魔术引号自动过滤)
版本:
< PHP 5.4
;PHP 5.3
之后不推荐使用该函数置返回:
< PHP 4.2.3
配置范围为PHP_INI_ALL;> PHP 4.2.3
配置范围为PHP_INI_PERDIR
当选项为On时,在不存在编码或者其他绕过绕过的情况下,可以使得很多漏洞无法利用,他会自动在GET、POST、COOKIE变量中的单引号''
、双引号""
、反斜杠\
以及空字符NULL
的前面加上反斜杠
在PHP5
中magic_quotes_gpc
不会过滤$_SERVER
变量,导致很多client-ip、referer一类的漏洞能够利用。
open_basedir(PHP可访问目录)
版本:PHP ALL
范围:
< PHP 5.2.3
配置范围为PHP_INI_SYSTEM;> PHP 5.2.3
配置范围PHP_INI_ALL
open_basedir
指令用来限制PHP只能访问哪些目录,通常只需要设置Web文件目录即可,如果需要加载其他外部脚本,也需要吧脚本所在的目录路径加入到open_basedir
指令中,多个目录用分号(;
)分隔
# `open_basedir`指定的实际上时前缀,而不是目录名
open_basedir=/www/a
# 设定可访问的目录为/www下以a开头的文件,也就是说/www/a和/www/ab都可以被访问
open_basedir=/www/a/
# 设置只能访问/www/a文件
当open_basedir
配置目录后,执行脚本访问其他函数都需要验证文件是否符合配置要求,因此会影响效率
disable_functions(禁用函数)
版本:PHP ALL
范围:该指令的配置范围为
php.ini only
在正式生产环境中,为了更安全地允许PHP,也可以使用disable_functions
指令来禁止一些敏感函数的使用。当你使用该指令禁用危险函数时,切记将dl()
函数加到禁止列表中,因为攻击者可以利用dl()
函数来加载自定义的PHP扩展以突破disable_functions
的限定
# 多个函数之间用逗号(,)分隔
disable_functions=phpinfo,eval,passthru,exec,system,dl
disable_errors和error_reporting(错误显示)
版本:PHP ALL
配置范围:PHP_INI_ALL
disable_errors
表明是否显示PHP脚本内部的错误,在调试时通常将PHP错误显示打开,但是在生产环境中,建议关闭PHP错误回显。
为了避免一些安全隐患,在设置disable_errors=On
时,还可以配置error_reporting
,这个选项用来配置错误显示的级别,可使用数字也可使用内置常量配置。
数字格式与变量格式的详细信息
常用指令及说明