1、文件包含漏洞
代码注入的典型代表,主要由4个函数完成:
include()
require()
include_once()
require_once()
当使用这4个函数包含一个新文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含的文件是什么类型。想要利用文件包含漏洞,需要:
1)include()等函数通过动态变量的方式引入需要包含的文件;
2)用户能够控制该动态变量
本地文件包含 Local File Inclusion 简称LFI
open_basedir参数能限制PHP只能打开特定目录下的文件,可以很好的保护服务器;
要解决文件包含漏洞,应尽量避免包含动态的变量,尤其是用户可以控制的变量。
远程文件包含
allow_url_include为ON,则可以加载远程文件,Remote File Inclusion 简称RFI
2、变量覆盖漏洞
全局变量覆盖:变量如果未被初始化,且能被用户所控制,则很可能导致安全问题,PHP的register_globals为ON时,尤其严重。PHP4.2.0之后register_globals默认OFF
extract()变量覆盖
遍历初始化变量
import_request_variables变量覆盖
parse_str()变量覆盖
应对变量覆盖的安全建议:
1)确保register_globals=ON,若不能自定义php.ini,则应该在代码中控制;
2)熟悉可能造成变量覆盖的函数和方法,检查用户是否能控制变量的来源;
3)初始化变量
3、代码执行漏洞
危险函数执行代码
1)phpMyAdmin3.4.3.1远程代码执行漏洞
2)MyBB1.4远程代码执行漏洞
文件写入执行代码
其他执行代码方式
1)直接执行代码的函数
2)文件包含
3)本地文件写入
4)preg_replace代码执行
5)动态函数执行
6)curly syntax
7)回调函数执行代码
8)unserialize代码执行
4、定制安全的PHP环境
register_globals=OFF
open_basedir=/xxxx/xx/
allow_url_include、allow_url_fopen、allow_url_include=off
display_errors=off 关闭错误回显
log_errors=ON
magic_quotes_gpc=OFF
cgi.gix_pathinfo=0 若PHP以CGI方式安装,则关闭此项,避免出现文件解析问题;
session.cookie_httponly=1 避免跨站脚本攻击
session.cookie_secure=1 若全站HTTPS,则开启
safe_mode 争议较大,酌情取舍
disable_functions 可禁用危险函数,但同时给开发带来不便