PHP文件包含漏洞

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 对象文件等

你可能感兴趣的:(PHP文件包含漏洞)