PHP代码审计学习_day1
0x00 工具的下载和安装
RIP、seay、phpstrom等等,自行百度安装。
0x01 MVC架构
MVC是一种使用MVC设计创建Web应用程序的模式。MVC模式同时提供了对HTML、CSS和JavaScript的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。表示应用程序核心(比如数据库记录列表),通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。显示数据(数据库记录),通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。处理输入(写入数据库记录),通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
0x02 常见的PHP框架
ThinkPHP:全中文,易上手,对环境配置没有什么要求。
Yaf:据说是世界上最快的PHP框架,用C写的扩展,安装的时候需要编译。
Laravel、Kohana、Codeigniter、Yii
Smyfony:这个框架据说很强。
doitphp:国内PHP框架的后起之秀。
注:以上顺序没有排名之分。
0x03 功能点定向审计
程序安装、文件上传、文件管理、登录验证、备份恢复、找回密码。
0x04 PHP核心配置php.ini
(1)基本配置-语法
大小写敏感
directive = value(指令 = 值)
foo = bar ≠ FOO = bar
运算符
|、&、~、!
空值的表达方式
foo = ;
foo = none;
foo = "none";
(2)基本配置-安全模式
安全模式
safe_mode = off
安全模式,用来限制文档的存取、限制环境变量的存取、控制外部程序的执行。
注:本特性已在PHP5.4.0被移除
这里举一个例子,创建一个test.php文件,内容为
<?php
$cmd = $_GET['id'];
system($cmd);
?>
访问127.0.0.1/test.php?id=ipconfig,就可以看到ipconfig回显的内容。
然后去开启safe_mode = on,再次访问,就没有任何的回显了。
限制环境变量存取
safe_mode_allowed_env_vars = string
指定PHP程序可以改变的环境变量的前缀,当这个选项的值为空时,那么php可以改变任何环境变量,如safe_mode_allowed_env_vars = PHP_,当这个选项的值为空时,那么php可以改变任何环境变量。
外部程序执行目录
safe_mode_exec_dir = "E:\Local Test\WWW"(指定一个网站的主目录就可以了,其他的看情况而定)
禁用函数
disable_functions = 你想禁用的函数名
为了更安全的运行PHP,可以用此指令来禁止一些敏感函数的使用,当你想用该指令禁止一些危险函数时,切记把dl()函数也加到禁止列表,攻击者可以利用dl()函数加载自定义的php扩展来突破disable_function。配置禁用函数时可以使用逗号分隔函数名。
com组件
com.allow_dcom = false
PHP设置在安全模式下(safe_mode),仍旧允许攻击者使用COM()函数来创建系统组件来执行任意命令,可以关闭这个函数来防止出现漏洞。
使用COM()函数需要在PHP.ini中配置extension=php_com_dotnet.dll,如果PHP版本小于5.4.5,则不需要。
(3)基本配置-控制变量
全局变量注册开关
register_globals = off
默认值为off,在4.2版本之前是默认开启的。当为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,这是对服务器来讲时非常不安全的,所以不能让他注册为全局变量。
为off时,服务器端通过$_GET['name']来获取数据。
为on时,服务器端对POST或GET提交的变量,都会自动使用全局变量来接受值。
魔术引号自动过滤
magic_quotes_gpc = on
注:该特性在PHP5.4.0中被移除
在php.ini中默认关闭。为on时,会自动将所有的单引号、双引号、反斜杠和空字符都加上反斜杠来进行转义,开启会提高网站的安全性,但也会影响HTTP请求的数据。也可以使用addslashes来转义提交的HTTP请求数据,或是用stripslashes来删除转义。
(4)基本配置-远程文件
是否允许包含远程文件
allow_url_include = off
为on时,可以直接包含远程文件,若包含的变量为可控的,则可以直接控制变量来执行PHP代码。
是否允许打开远程文件
allow_url_open = on
允许本地PHP文件通过调用URL重写来打开和关闭写权限,默认的封装协议提供的ftp和http协议来访问文件。
(5)基本配置-目录权限
HTTP头部版本信息
expose_php = off
防止了通过http头部泄露的php版本信息
文件上传临时目录
upload_tmp_dir =
上传文件临时保存的目录,如果不设置的话,则采用系统的临时目录
用户可访问目录
open_basedir = 自己指定目录
能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。
(6)基本配置-错误信息
内部错误选项
display_errors = on
显示PHP脚本的内部错误,网站发布后建议关闭PHP的错误回显,在调试的时候通常把PHP错误显示打开
错误报告级别
error_reporting = E_ALL & ~E_NOTICE
这个设置的作用是将错误级别调到最高,显示所有问题,方便排错。
注:以上的php.ini中的配置,在php.ini中都会有注释来进行说明,不明白或是不清楚的都可以查看注释