文件包含漏洞

懵懂的女人 提交于 2019-12-06 03:20:56

一、简介

在执行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

(7)https://www.k0rz3n.com/2018/11/20/一篇文章带你理解漏洞之PHP文件包含漏洞/

(8)https://www.freebuf.com/column/148886.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!