简介
文件包含是php这种web开发语言的经典历史遗留漏洞,简而言之这种漏洞实质上是一种“代码注入“的攻击漏洞,原理在于注入一段用户能控制的脚本或者代码并让系统执行。
主函数有(这篇主要是关于php文件包含的):
include()
require()
include_once()
require_once()
当我们使用以上四个函数包含一个文件时,此文件将会被作为php代码执行,且php系统不会刻意过滤这个文件,由这个特性我们可以尝试向其中注入含有小马的图片(类似于文件上传),txt文档等。
类型
主要包含两大类即:本地文件包含,远程文件包含。
1、本地文件包含
定义:能够打开并包含本地文件的漏洞称为本地文件包含漏洞,简称LFI(Local File Inclusion)
用户一般是能够控制参数file,然后对源码进行解析得到pyload的关键字进行漏洞攻克。
详情参考:本地文件包含漏洞详解_文件报告漏洞_aFa攻防实验室的博客-CSDN博客
2、远程文件包含
定义:当PHP中的配置选项allow_url_include为ON(即在某关键变量前未设置障碍)时,include/require函数是可以加载远程文件的,此漏洞即被称为远程包含漏洞,简称RFI(Remote File Inclusion)
详情参考:7-2远程文件包含漏洞案例讲解和演示_山兔1的博客-CSDN博客
例题
1、bugku 文件包含 1
打开发现有一个click me的链接
点进去发现回显一个index.php并且在URL栏目上出现了/index.php?file=show.php
这里打开源码发现什么都没有,由题目提示我们知道是文件包含题目,这里由回显的代码猜测出是php伪协议(参考:PHP伪协议详解_Snakin_ya的博客-CSDN博客)
用到的是伪协议中的file协议,这里需要用到php://filter语句。
当php://filter语句与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取,从而达到想要文件包含的效果
即构造如下pyload:
?file=php://filter/resource=xxx.php
但当实操时会发现直接读取xxx.php文件时,很多信息是无法直接显示在浏览器页面上,所以我们对运用base64对文件内容进行一个小编码(由base64不可识别进行直接在浏览器页面上显示回显)
即pyload:
?file=php://filter/read=convert.base64-encode/resource=index.php
输入网址栏即可直接得到经过加密的网页php源码
经过base64解密即得到源码发现flag就在其中