PHP编程语言中为我们提供了四个常见文件包含函数,分别是include() 、require() 、include_once() 、require_once() 。这四个函数都可以进行文件包含,但功能却不一样,
区别如下:
·include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
·require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
·include_once()和require_once():若文件中代码已被包含则不会再次包含
漏洞利用的条件:
·程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件
·用户能够控制该动态变量
·要保证php.ini中allow_url_fopen和allow_url_include要为On
注:PHP中只要文件内容符合PHP语法规范,包含时不管扩展名是什么都会被PHP解析,
若文件内容不符合PHP语法规范则会暴漏其源码。
php.ini配置文件:allow_url_fopen=off 时不可以包含远程文件,只有开启了才可以包含。Php4存在远程&本地,php5仅存在本地包含。
漏洞分类
本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码
读敏感文件,读PHP文件
包含日志文件GetShell
上传图片马,然后包含从而GetShell
包含/proc/self/envion文件GetShell
包含data:或php://input等伪协议
若有phpinfo则可以包含临时文件
远程文件包含:可以直接执行任意代码
php协议类型:
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
想要开启文件包含的功能,首先要修改PHP的配置文件(PHP.ini)把文件里的功能选项开启。
在Linux中PHP.ini配置文件一般默认安装在 /etc目录下。
下面是两个功能选项:
allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等
网友评论