前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【文件包含】文件包含漏洞知识总结v1.0

【文件包含】文件包含漏洞知识总结v1.0

作者头像
一名白帽的成长史
发布2019-10-08 15:36:33
1.9K0
发布2019-10-08 15:36:33
举报

Hello,各位小伙伴晚上好~

之前一期,我们已经一起总结了文件上传和文件解析漏洞。

【文件上传与解析】文件上传与解析漏洞总结v1.0

今天我们就一起再来看看文件包含漏洞吧~

Part.1

什么是文件包含漏洞?

文件包含概述

和SQL注入等攻击方式一样,文件包含漏洞也是一种“注入型漏洞”,其本质就是输入一段用户能够控制的脚本或者代码,并让服务器端执行。

什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

以PHP为例,常用的文件包含函数有以下四种:

include(),require(),includeonce(),requireonce(),它们的区别如下:

  • require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
  • include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
  • include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
  • require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

漏洞代码分析

我们先直接来看一个例子,网页代码如下:

再创建一个phpinfo.php页面,代码如下:

利用文件包含,我们可以通过include函数来执行phpinfo.php页面,成功解析:

将phpinfo.php文件后缀改为txt后进行访问,依然可以解析:

将文件后缀修改为jpg格式,也可以解析:

可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

在上一期文件上传漏洞的总结中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析,现在知道是为什么了吧~

我们将phpinfo.jpg的内容改成一段文字:

再次进行访问,可以读出文本内容:

利用这个特性,我们可以读取一些包含敏感信息的文件。

Part.2

本地文件包含

本地文件包含漏洞

能够打开并包含本地文件的漏洞,我们称为本地文件包含漏洞(LFI)。

测试网页包含如下代码:

网站利用文件包含功能读取一些php文件,例如前面的phpinfo.php文件:

利用该代码,我们可以读取一些系统本地的敏感信息。例如C:\Windows\system.ini文件。

(1)使用绝对路径

使用绝对路径直接进行读取:

(2)使用相对路径

当前页面所在路径为C:\Apache24\htdocs\,我们需要使用../退到C盘再进行访问,构造路径如下:../../windows/system.ini

成功读取到文件信息:

./表示当前位置路径,../表示上一级路径位置,在linux中同样适用。

一些常见的敏感文件路径总结。

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 配置信息

Linux/Unix系统:

  • /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 配置文件

Part.3

漏洞利用技巧

字符串截断

首先我们来看一段改进后的代码:

我们去读取网站根目录下的site目录中的phpinfo.php文件:

如果我们想通过文件包含漏洞读取本地敏感信息,就会遇到一些问题。因为服务器会给路径加上./site/路径,以及.php后缀。

此时我们可以使用%00截断:%00为结束符,在filename后带上%00,就可以截断末尾的.php。

此外,当前路径为./site/,如果要读取system.ini,则需要输入:../../../windows/system.ini%00,成功读取如下:

需要注意的是,%00截断需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。

配合文件上传使用

有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。

以DVWA平台为例,编辑一个php文件,如下:

找到上传点进行上传:

文件保存的完整路径为:

C:\phpStudy\WWW\hackable\uploads\webshell.jpg

DVWA平台low等级文件包含漏洞页面如下:

该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下:

现在我们利用该页面去执行我们上传的图片中的php代码,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 到C:\phpStudy\WWW\hackable\uploads\webshell.jpg

构造URL如下,页面无报错说明访问成功:

可以看到fi文件夹中生成了一个webshell文件:

使用webshell管理工具连接即可。

注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。

包含Apache日志文件

有时候网站存在文件包含漏洞,但却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。

在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log,日志文件位置如下:

当我们正常访问一个网页时,如http://127.0.0.1/login.php,access日志会进行记录,如下图所示:

如果我们访问一个不存在的资源,也一样会进行记录,例如访问127.0.0.1/<?php phpinfo();?>

但查看日志会发现被编码了,如下:

再次进行访问,并使用burp抓包,发现被编码:

我们将报文修改回去,再进行发送即可:

此时再查看access日志,正确写入php代码:

再通过本地文件包含漏洞访问,即可执行:

如果在此处写入一句话木马,就可以使用Webshell管理工具进行连接了。

Part.4

远程文件包含

远程文件包含

如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(RFI)。

先我们来看一段代码:

访问本地phpinfo.php文件:

该页面并没有对$path做任何过滤,因此存在文件包含漏洞。

我们在远端Web服务器/site/目录下创建一个test.php文件,内容为<?php phpinfo();?>,利用漏洞去读取这个文件。

但是代码会给我们输入的路径后面加上'/phpinfo.php'后缀,如果php版本小于5.3.4,我们可以尝试使用%00截断,这里php版本为7.2.7,不适用。

还有一种截断方法就是?号截断,在路径后面输入?号,服务器会认为?号后面的内容为GET方法传递的参数,成功读取test.php如下:

如果test.php是恶意webshell文件,那么利用该漏洞就可以获取到服务器权限。

Part.5

PHP伪协议

PHP伪协议

PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:

php://filter

有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php,什么都不显示:

这时候我们可以以base64编码的方式读取指定php文件的源码。

输入:

php://filter/convert.base64-encode/resource=路径,得到config.php编码后的源码:

再进行base64解码,获取到数据库敏感信息:

data://

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:

zip://

如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。

以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:

通过zip://协议执行压缩包中的phpinfo.php文件:

php://input

利用php://input,可以直接执行php代码。输入file=php://input,然后使用burp抓包,写入想要执行的php代码:

发送报文,可以看到生成了一句话木马文件:

伪协议利用条件

伪协议的利用方法还有很多,这里就不一一举例了。伪协议的用法小结:

Part.6

文件包含漏洞防护

漏洞防护

1、使用str_replace等方法过滤掉危险字符

2、配置open_basedir,防止目录遍历

3、php版本升级,防止%00截断

4、对上传的文件进行重命名,防止被包含

5、对于需要动态包含的文件可以设置一个白名单,不读取非白名单的文件

6、做好管理员权限划分,做好文件的权限管理

......

Part.7

结语

以上就是今天的全部内容了,大家都明白了吗?

Peace !

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一名白帽的成长史 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档