PHP安全
文件包含
4个主要函数
- include()
- require()
- include_once()
- require_once()
当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,PHP内核并不会在意该包含的文件时什么类型。
要想成功利用文件包含漏洞,需要满足两个条件:
- include等函数通过动态变量的方式引入需要包含的文件。如果时静态包含是没有办法的。
- 用户能够控制该动态变量。
本地文件包含
- %00截断
- 目录最大长度限制
- 编码达到目录遍历
本地文件包含利用技巧
- 包含用户上传的文件
- 包含data://或php://inputd等伪协议
- 包含session文件
- 包含日志文件
- 包含/proc/self/environ文件
- 包含上传的临时文件
- 包含其他应用创建的文件
远程文件包含
实现远程文件包含需要设置allow_url_include=ON,则文件包含的函数将支持加载远程文件。
远程文件包含可以读取攻击者的服务器从而实现命令执行。
变量覆盖漏洞
-
全局变量覆盖
register_gobal = ON,现在默认变为OFF -
extract()变量覆盖
-
遍历初始化变量
-
import_request_variables变量覆盖
-
parse_str()变量覆盖
安全建议:
- register_globals = OFF
- 熟悉可能造成变量覆盖的函数和方法,检查用户是否能控制变量的来源
- 养成初始化变量的好习惯
代码执行漏洞
-
危险函数
popen()、system()、paththru()、exec()等都可以直接执行系统命令。 -
phpmyadmin远程代码执行漏洞
-
MyBB1.4 远程代码执行漏洞
挖掘漏洞的过程。通常需要先找到危险函数,然后回溯函数的调用过程,最终看在整个调用的过程中用户是否有可能控制输入。
- 文件写入执行代码
其他代码执行方式
-
直接执行代码的函数
eval()
assert()
system()
exec()
shell_exec()
passthru()
escapeshellcmd()
pcntl_exec()
等函数,一般来说,最好在PHP中禁用这些函数,在进行代码审计时则可以检查代码中是否存在这些函数。 -
文件包含
相关函数上述内容有介绍 -
本地文件写入
能够往本地文件里写入内容的函数都需要重点关注,比如:
file_put_contents()
fwrite()
fputs() -
preg_replace()代码执行
-
动态函数执行
用户自定义的动态函数可以导致代码执行,需要注意这种情况 -
Curly Syntax
PHP的Curly Syntax也能导致代码执行,它将执行花括号间的代码,并将结果替换回去。
-
回调函数执行代码
-
unserialize()导致代码执行
- 一是unserialize()函数的参数用户可控
- 二是存在__destruct()函数或者__wakeup()函数
定制安全的PHP环境
根据以上所述,应该配置好php.ini来加固PHP 的运行环境
配置参数
register-globals = OFF----避免变量覆盖漏洞
open_basedir----该指令可以建一个基目录,对抗文件包含、目录遍历
allow_url_include----避免远程文件包含,同时推荐关闭的还有allow_url_fopen
display_errors----防止信息泄露,错误回显可能会使攻击者分析出应用程序逻辑进而扩大攻击范围
log_errors = On----把错误消息记录在日志里
magic_quotes_gpc----推荐关闭,增加转义字符可以被攻击者绕过,还有可能衍生出新的一系列问题
cgi.fix_pathinfo----PHP分为模块安装和CGI安装,如果使后者,则要关闭此选项,避免文件上传问题
session.cookie_httponly----开启,防止XSS
session.cookie_secure----若是全站HTTPS请开启此项
safe_mode----需要仔细斟酌
disable_functions----能够在PHP中禁用函数,视情况而定。disable_classes
max_execution_time = 30(默认值)----防止用户脚本占用过多CPU。
user_dir=string----该指令指定用户主目录的一个目录名,PHP脚本必须放在这里才能执行。
隐藏配置细节
-
隐藏apache
ServerSignature指令设置为Off.
ServerTokens指令在确定开启上个指令时,以何种程度显示服务器细节,从full———Prod共有六个选项 -
隐藏PHP
expose_php = 0----设置为1时将细节追加服务器签名后面
phpinfo()----应删除phpinfo()调用的所有实例 -
修改文件扩展名
php\php3\phtml
隐藏敏感数据
-
隐藏文档根目录
在apache的配置文件中即httpd.conf会发现有一个配置指令DocumentRoot.它被设置为服务器所认为的公共HTML目录的路径。 -
拒绝访问某些文件扩展名
<Files * .inc>
Oeder allow,deny
Deny from all
</ Files>
数据加密
- PHP加密函数
md5()
MCrypt包----数据加密包
简单的概括,没有太细节,还有一些涉及到有关php的安全可以参考一下我做的漏洞复现,参考了白帽子讲安全以及php编程。