PHP代码审计基础概念


PHP代码审计

工具

代码编辑器

  • Notepad++
  • Visual Studio Code

代码审计工具

  • Seay源代码审计系统
  • Firtufy SCA
  • RIPS

漏洞验证辅助

  • BurpSuite Community
  • 浏览器扩展
  • 编码转换、加密解密工具
  • 正则调试工具
  • SQL执行监控工具

思路

  1. 检查铭感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤(逆向追踪)
  2. 找出哪些文件在接收外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数中,或者传递的过程中是否有代码逻辑漏洞(正向追踪)
  3. 直接挖掘功能点漏洞,根据自身的禁言判断该类应用通常在哪些功能中会出现漏洞,直接全篇阅读该功能代码
  • 学好代码审计需要掌握一下几点
    • PHP编程语言的特性和基础
    • Web前端编程基础
    • 漏洞形成原理
    • 代码审计思路
    • 不同系统、中间件之间的特性差异

PHP核心配置

常见PHP_INI_*常量的定义

常量 含义
PHP_INI_USER 该配置选项可在用户的PHP脚本或Windows注册表中设置
PHP_INI_PERDIR 该配置选项可在php.ini.htaccesshttpd.conf中设置
PHP_INI_SYSTEM 该配置选项可在php.inihttpd.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代码

image-20201217095516607

image-20201217100014708

magic_quotes_gpc(魔术引号自动过滤)

版本:< PHP 5.4PHP 5.3之后不推荐使用该函数

置返回: < PHP 4.2.3配置范围为PHP_INI_ALL;> PHP 4.2.3配置范围为PHP_INI_PERDIR

当选项为On时,在不存在编码或者其他绕过绕过的情况下,可以使得很多漏洞无法利用,他会自动在GET、POST、COOKIE变量中的单引号''、双引号""、反斜杠\以及空字符NULL的前面加上反斜杠

PHP5magic_quotes_gpc不会过滤$_SERVER变量,导致很多client-ip、referer一类的漏洞能够利用。

image-20201217102901642

image-20201217103333525

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,这个选项用来配置错误显示的级别,可使用数字也可使用内置常量配置。

数字格式与变量格式的详细信息

image-20201217152415931

常用指令及说明

image-20201217154018469


文章作者: Sheng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sheng !
  目录