[TOC] ### 什么是文件包含 ------------ >文件包含这个漏洞，简单来说既是程序猿在开发中为了方便，会将在多个页面重复使用的代码单独写到一个文件中，在需要用到的地方直接包含进来，包含后的文件既相当于将被包含的整个文件内容复制到了包含处。因为在开发中是经常用到的，因此成为了攻击者的目标，便衍生了多种文件包含的攻击。 ### 本地文件包含 ------------ 先来感受一下，当包含值可被直接控制的情况下是怎么样的如以下代码： ```php ``` 而是远程服务器执行完这段代码的源代码，如下图： ![12.png](http://www.bugsafe.cn/usr/uploads/2018/01/3891035635.png) 所以说远程文件包含只有符合了以上两点才能正常包含。 先来修改下： 1. 修改配置 ![13.png](http://www.bugsafe.cn/usr/uploads/2018/01/3765667797.png) 2. 修改文件后缀 ![14.png](http://www.bugsafe.cn/usr/uploads/2018/01/2234506515.png) 再来包含一下。 ![15.png](http://www.bugsafe.cn/usr/uploads/2018/01/1549644820.png) 可以看到这次包含后返回的信息就是我们目标机的信息。 接下来继续尝试拿shell ![16.png](http://www.bugsafe.cn/usr/uploads/2018/01/58443275.png) ![17.png](http://www.bugsafe.cn/usr/uploads/2018/01/3886119717.png) 远程文件包含的利用前提其实就是符合本地文件包含的前提并且符合远程文件包含本身的前提即可利用。 ### 文件包含之伪协议 ------------ 伪协议在文件包含的利用，本文演示以下伪协议： `data:text/plain` 或 `data:text/plain;base64` `php://input` `php://filter` `file://` `zip://` 其它协议可阅读官方文档：[直通车](http://php.net/manual/zh/wrappers.php.php "直通车") data:text/plain 直接在对应URL参数内输出：data:text/plain,需要执行的php代码 如下图： ![18.png](http://www.bugsafe.cn/usr/uploads/2018/01/3116914365.png) 这个伪协议还有另一种使用方法，那么就是将需要执行的php代码使用base64编码：data:text/plain;base64,需要执行的base64php代码 如下图： ![19.png](http://www.bugsafe.cn/usr/uploads/2018/01/4064850690.png) ------------ php://input `php://input` 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。 ![21.png](http://www.bugsafe.cn/usr/uploads/2018/01/1475499797.png) 可以看到程序内是固定死后缀的，那么在包含 `php://input` 的时候就会自动拼接上 `.php` 所以肯定是不能正常使用 `php://input`的。所以我们也是可以使用 `%00` 截断的 ![20.png](http://www.bugsafe.cn/usr/uploads/2018/01/655724549.png) ![22.png](http://www.bugsafe.cn/usr/uploads/2018/01/1209641233.png) 可以看到终止符是非常强大的。 ------------ php://filter `php://filter` 该伪协议可以读取php文件代码以base64编码输出，比如说我们想读取一个php文件但是不想让它正常php执行代码后的结果，我们想要这个php文件的代码的时候就可以使用这个伪协议。 使用方法：php://filter/read=convert.base64-encode/resource=需要读取的文件代码内容 ![23.png](http://www.bugsafe.cn/usr/uploads/2018/01/22423135.png) 解码后可得到内容 ![24.png](http://www.bugsafe.cn/usr/uploads/2018/01/1600112980.png) ------------ file:// `file://` 用于访问本地文件系统，且不受`allow_url_fopen`与`allow_url_include`的影响。 使用方法：file://文件绝对路径 ![25.png](http://www.bugsafe.cn/usr/uploads/2018/01/1283401618.png) ------------ zip:// `zip://`可以访问压缩文件中的文件。但是需要绝对路径。 使用方法：zip://[压缩包绝对路径]#[压缩文件内的文件名] 在本地创建一个文件，并且压缩成zip压缩包。 ![26.png](http://www.bugsafe.cn/usr/uploads/2018/01/1079623094.png) 可以看到我已经填写了绝对路径以及文件名称，但是为什么不能成功包含呢，可以看到它的报错 `Warning: include(zip://C:/phpStudy/WWW/include/phpinfo.zip.php) ` 我们并不是包含这个文件，我们是要包含这个zip里面的文件，为什么`#`后面的值没了呢，是因为#会忽略后边的参数，所以我们需要使用编码`%23`的形式，还有一点就是程序里固定死了 php后缀，因为我们压缩的文件是为php后缀的。所以我们就不用带后缀了，如下图： ![27.png](http://www.bugsafe.cn/usr/uploads/2018/01/2347902263.png) ------------ ### 相关资料 ------------ [代码审计]EMLOG v5.3.1 超鸡肋SQL注入+本地文件包含 ：[http://www.bugsafe.cn/archives/130.html](http://www.bugsafe.cn/archives/130.html "http://www.bugsafe.cn/archives/130.html")