**摘要:**本篇主要带你实战了解PHP文件包含漏洞
文件包含漏洞(LFI/RFI)
当代码里出现
include($_GET['file'])、require()等,且参数可控时,就可以包含任意文件。如果包含的是 PHP 文件,默认会当作 PHP 代码执行,而不是显示源码。
目录
一、题目详情
题目来源:CTF²中的ACTF2020 新生赛Include

靶场环境:启动靶机,进入:http://ea133ffe4fdd6ee5d0a178a8.http-ctf2.dasctf.com:80

二、解题思路及原理
1、有一个tips,好像可以点击,那我们点击看看情况。

发现我们的url变了,后面变成了执行了一个flag.php源码!
这就是文件包含漏洞: 包含的是 PHP 文件,默认会当作 PHP 代码执行,而不是显示源码。
所以下面我们的解题思路,就是如何把和这个源码提取到,因为这个文件(php)本身就是flag,所以看到了这个文件(php)里面的内容(源码)也就能看到flag了!
2、提取源码
php://filter 伪协议:用于PHP 源码读取
PHP 内置的流包装器,用于对文件流做过滤/转换。
语法:
php://filter/读或写=过滤器/resource=目标文件
常用过滤器:
convert.base64-encode:把内容做 Base64 编码
convert.base64-decode:解码
string.rot13:ROT13 变换(ROT13是一种编码方式)
zlib.deflate/zlib.inflate:压缩/解压
这里我们采用Base64编码去提取PHP源码
直接包含
flag.php会执行 PHP 代码,页面只显示执行结果,看不到源码。用
convert.base64-encode后,PHP 引擎读到的是 Base64 字符串,不会被当作 PHP 代码执行,于是源码被原样输出。你拿到 Base64 字符串后,解码就能看到
flag.php的源代码,里面往往就有 flag。
我们构造如下url参数,然后去拼接到url后面。
?file=php://filter/read=convert.base64-encode/resource=flag.php
结果如下:

页面上这串字符就是这个文件源码,但是被我们的进行了Base64编码了,所以下面对这串字符进行Base64解码就行。
3、Base64解码
这里采用在线的Base64解码器:Base64 在线编码解码 | Base64 加密解密 - Base64.us
结果如下:

好了,这里看到了Flag!
**PS:**其实这个还算是一个比较简单的PHP文件包含,这里没有涉及到过滤。如果过滤了相应的东西,需要采用相应的方式绕过。如:可以尝试大小写、双写、URL 编码等绕过方式!