最近在学PHP代码审计,那就将学习的笔记都整理一遍吧~
前期准备:
当然,最基本的前提是至少大致学过PHP的语法。
1、安装相关软件,如Sublime text、 Notepad++、editplus、 Seay源代码审计系统等
2、获得源码,可以到网上下载各种网站源码
3、安装网站
审计方法:
通读全文法:麻烦但全面
敏感函数参数回溯法:高效常用,Seay源代码审计系统
定向功能分析法:主要根据程序的业务逻辑来审计,首先是用浏览器逐个访问,看看程序有哪些功能,根据相关功能推测可能存在的漏洞
审计的基本流程:
1、整体了解
2、根据定向功能法针对每一项功能进行审计
3、敏感函数参数回溯法
整体了解:
1、网站结构:
浏览源码文件夹,了解程序的大致目录。
admin:后台管理目录
install:网站的安装目录,其中的install.sql为数据库的结构信息
sys:这个目录里面一般存放着配置信息文件和公共函数库,分别为config.php和lib.php
user:这里面记录着用户的一些操作,如用户注册等
index.php:一般为网页的首页文件,也是审计的突破口
2、入口文件:
index.php、admin.php文件一般都是整个程序的入口,通过index文件可以知道程序的架构、运行流程、包含哪些配置文件、哪些过滤文件以及安全过滤文件,了解程序的业务逻辑。
3、配置文件:
一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。先看看数据库编码,若是gbk则可能存在宽字节注入;若变量的值用双引号,则可能存在双引号解析代码执行的问题。
4、过滤功能:
通过公共函数文件、安全过滤文件可看出用户输入的数据哪些被过滤和哪些无过滤,在哪、如何过滤,能否绕过过滤的数据,过滤的方式是替换还是正则,有无GPC和使用addslasher()处理等。
常见的功能漏洞:
程序初始安装漏洞
站点信息泄露
文件上传管理
登录认证、权限管理漏洞
数据库备份漏洞
验证码漏洞等
漏洞形成的条件:
1、可控的变量(一切输入都是有害的)
2、变量到达有利用价值的函数(危险的函数)
代码审计的本质:找漏洞其实相当于找对应变量和函数。
变量跟踪的过程:
正向跟踪——通过变量找函数
逆向跟踪——通过函数找变量
常见的INI配置:
1、php INI文件:
PHP 的配置文件一般是 php.ini 文件
php.ini 文件必须命名为'php.ini'并放置在httpd.conf中的PHPIniDir指令指定的目录中,使用phpinfo()函数可以查看。
一般情况下需要对其进行配置,使环境更加安全
2、配置文件:
php.ini:在启动PHP时被读取。对于服务器模块版本的PHP,仅在Web服务器启动时读取一次;对于CGI和CLI版本,每次调用都会读取。在php.ini中可以使用环境变量。Apache Web服务器在启动时,会把目录转到根目录,这将导致PHP尝试在根目录下读取php.ini,若存在的话。还可以在httpd.conf中覆盖php.ini的值以进行更灵活的配置:php_value name value。PHP常量仅能在php.ini中使用,在httpd.conf中必须使用相应的掩码值。
.user.ini文件:自PHP5.3.0起,PHP支持基于每个目录的.htaccess风格的INI文件,此类文件仅被CGI/FastCGI SAPI处理;此功能使得PECL的htscanner扩展作废;若使用Apache,则用.htaccess文件有同样的效果。在.user.ini风格的INI文件中只有具有PHP_INI_PERDIR和PHP_INI_USER模式的INI设置可被识别。当使用PHP作为Apache模块时,也可以用Apache的配置文件和.htaccess文件中的指令来修改PHP的配置设定;需要有“AllowOverride Options”或“AllowOverride All”权限。
语法:设置指令的格式:directive = value 大小写敏感
Value可以使:用引号界定的字符串("foo”)、数组、PHP常量(E_ALL、M_PI)、INI常量(On、Off、none)、表达式
INI文件中表达式仅使用:!、()、|位或、&位与、~位非、
一个空字符串可以用在等号后不写任何东西表示,或者用 none 关键字:
foo = ; 将foo设为空字符串
foo = none ; 将foo设为空字符串
foo = "none" ; 将foo设为字符串''none''
启用全局变量:register_globals=off
作用是关闭自动注册的全局变量。
设置为On,php会将$_POST,$_GET,$_COOKIE,$_ENV,$_SESSION数组中的$key=>$value直接注册为变量,但有三个问题:不知道变量来源;变量之间相互覆盖;安全问题。因而要设置为Off。
短