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

Hello,各位小伙伴周五好~

这里是你们的劳模小编~

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

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


一、什么是文件包含漏洞?

1、文件包含概述

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

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

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

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

include(),require(),include_once(),require_once()

区别如下:

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

2、漏洞成因分析

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

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

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


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


修改为jpg格式,也可以解析:

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

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

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

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

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

二、本地文件包含漏洞

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

测试网页包含如下代码:

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

利用该代码,我们可以读取一些系统本地的敏感信息。

例如C:\Windows\system.ini文件。

(1)使用绝对路径

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

(2)使用相对路径进行读取:

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

…/…/windows/system.ini

成功读取到文件信息:

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

(3)一些常见的敏感信息路径:

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

三、LFI漏洞利用技巧

1、字符串截断

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

我们去读取根目录下的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功能。

2、配合文件上传使用

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

以DVWA平台为例,编辑一个图片马,内容如下:

找到上传点进行上传:

文件保存的完整路径为:

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

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

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

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

构造URL如下,页面无报错:

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

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

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

3、包含Apache日志文件

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

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

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

如果我们访问一个不存在的资源,也一样会进行记录,例如访问

127.0.0.1/<?php phpinfo();?>

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

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


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

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

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

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

四、远程文件包含

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

首先我们来看一段代码:

访问本地phpinfo.php文件:

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

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

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

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

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

五、PHP伪协议

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

1、php://filter

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

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

输入:php://filter/convert.base64-encode/resource=文件路径

得到config.php加密后的源码:

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

2、data://

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


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

3、zip:// 执行压缩文件

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

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

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

4、php://input

利用该方法,我们可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码:

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

5、伪协议利用条件

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

伪协议的用法小结:

六、文件包含漏洞防护

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

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

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

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

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

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


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


最后,欢迎关注我的个人微信公众号。

Peace !

【文件包含】文件包含漏洞知识总结相关推荐

  1. fopen打开ftp文件_PHP文件包含漏洞利用思路与Bypass总结手册(一)

    作者:Qftm 合天智汇 前言 这个手册主要是记录针对PHP文件包含漏洞的利用思路与Bypass手法的总结. 相关函数 四个函数 php中引发文件包含漏洞的通常主要是以下四个函数: 1.include ...

  2. 渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞

    漏洞数据库:https://www.exploit-db.com/google-hacking-database 1.渗透测试 实用 浏览器插件 chrome.edge 插件:搜索 cookie,安装 ...

  3. web漏洞(CSRF-SSRF-文件包含-文件解释-文件下载-目录遍历-sql注入-文件上传-反序列化-XSS-XXE-RCE-逻辑越权)

    1.CSRF(跨站请求伪造)(需要对方是在登录的情况下)--主要用于骗转账等等 原理:A在已经登录了银行的网站,并且此时去访问了B所构造的网页添加了特殊代码,A点击了B,由于A已经登录了,就造成了A直 ...

  4. 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)

    一.文件包含漏洞概述 1.定义:文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序.当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行 ...

  5. php post 漏洞_文件包含上传漏洞目录遍历命令执行漏洞

    制丨阿星 来源丨freebuff 作者丨Deutsh 文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create ...

  6. 浅谈文件包含之包含pearcmd.php漏洞

    文件包含之包含pearcmd.php漏洞 1.概念 pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库.在7.3及以前,pecl/pear是默认安装的: 在7.4及以后, ...

  7. php无法连接远程服务器,php-无法在远程服务器上包含文件

    我的问题是我无法在远程服务器上包含文件. echo "Including\n"; require_once("http://xx.xxx.xxx.xx:8080/path ...

  8. php入门-文件操作(文件包含、文件上传、文件管理)

    0x00 起源 从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,需要有简单的html基础和php基础,跟随流沙前辈视频学习记录. 国庆放假摆烂 ...

  9. 引入flag.php文件,php文件自包含的奇淫技巧

    原标题:php文件自包含的奇淫技巧 前言 刷题的时候刚好看到一个比较厉害的phpinfo的利用姿势,原理不是很懂,题目来自百度杯12月第四场Blog进阶版 以下是writeup 解题过程 注册以后 发 ...

最新文章

  1. mysql的字符集设置为什么_为什么Mysql默认的字符集都是latin1
  2. .NET 通用权限设计
  3. 利用Linux命令行进行文本按行去重并按重复次数排序yes
  4. 身份证过期了银行卡还能用吗?
  5. GStreamer1.0中no element “ffmpegcolorspace”报错解决(八)
  6. Python 内置函数介绍
  7. 依赖注入框架 ----Dagger2 使用详解及源码分析
  8. 德鲁克对管理学的贡献
  9. 智能编程计算机表演赛,中国儿童青少年计算机表演赛在京闭幕
  10. Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework...
  11. Halcon入门(1)——选取ROI区域
  12. 微信小程序兼容手机底部横条适配
  13. 一个简易版的spice VDI 云桌面 客户端 系统
  14. 大学文科生vs大学理科生
  15. 咪咕盒子MG100,电视机顶盒禁用软件安装软件
  16. Node 之父:Node 失误太多无力回天,Deno 前景明朗
  17. 持续集成(三)- hudson插件入门
  18. Java基础编程题(02)求100-200之间的素数
  19. hdu 1276 士兵队列训练问题
  20. 【转载】阿秀的求职笔记:基础语法篇

热门文章

  1. 【编译原理】写出下列文法对应定义的是什么语言?
  2. DM8数据库的DBLINK功能(OCI方式及ODBC方式)
  3. 用C语言实现状态机设计模式
  4. corrosion 靶机(ffuf模糊测试,命令执行)
  5. 【python数据处理基础】--数据读取、清洗数据
  6. 【ros2订阅报错】 ros2 forming pointer to reference type ‘const std::shared_ptr<const sensor_msgs::msg::Las
  7. asp.net199企业人力资源管理系统
  8. 数学基础(五)最优化理论(最优化,无约束,有约束,拉格朗日乘子的意义,KKT条件)
  9. 【Spring】Spring Framework Reference Documentation中文版18
  10. 4.intermediate-specialAttr