FileInclude

Posted by SGQ on March 15, 2020

简介:

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件, 而无需再次编写,这中文件调用的过程一般被称为文件包含。

程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用, 但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

题目:

<body> 

    <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">
          <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </a>
          <a class="brand" href="http://blue-whale.me/">blue-whale.me</a>
          <div class="nav-collapse collapse">
            <ul class="nav">
              <li class="active"><a href="./?page=home">Home</a></li>
              <li class="active"><a href="./?page=flag">Flag</a></li>
            </ul>
          </div><!--/.nav-collapse -->
        </div>
      </div>
    </div>

    <div class="container">



ha ha? you want flag? flag is here, but don't let you see!

      <footer>
        <p>&copy; Blue-Whale 2017</p>
      </footer>

    </div> <!-- /container -->


  </body>

考察点:

1.文件包含的基本原理

2.文件包含如何构造payload

知识点:

1.原理:

PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。最常见的就属于本地文件包含(Local File Inclusion)漏洞了。

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。

2.文件包含漏洞分为:

(1).本地文件包含漏洞

顾名思义,就是在网站服务器本身存在恶意文件,然后利用本地文件包含使用

(2).远程文件包含漏洞

远程文件包含就是调用其他网站的恶意文件进行打开

3.php常见的几个文件包含函数: include(), include_once(), fopen(), require(), require_once()

4.php伪协议的分类

php://input

php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。

使用条件:include( )include_once( )file_get_contents( )

比较特殊的一点,enctype=”multipart/form-data”的时候 php://input 是无效的。

php://output

php://output 是一个只写的数据流,允许你以print和echo一样的方式写入到输出缓冲区。

php://filter

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用,也就是作为一种过滤器,可以使用在数据流产生的地方。

类似的过滤器还有string.rot13string.strip_tagszlib.deflatezlib.inflate等等,目前只要知道convert.base64-encode就可以。

5.URL 中包含点的常见形式:

?file = xxx 或者 ?file = xxx.php

解题过程:

1. 首先分析页面代码,发现 <li class="active"><a href="./?page=home">Home</a></li>, <li class="active"><a href="./?page=flag">Flag</a></li> ,可能出现文件包含漏洞.

2. 然后开始构造payload,分析页面发现,http://vps1.blue-whale.me:23338/?page=flag ,这里是靠page参数进行跳转页面, 于是构造payload : ?page=php://filter/read/resource=./flag ,此段代码的含义可理解为筛选page=flag的页面并读取。但是页面并没有反应,于是我猜想可能是因为过滤了read这个关键词(一般会对一些伪协议的关键词进行过滤,如readresource等等)。

3. 试一下将read这个关键词进行BASE64加密,新的payload:

?page=php://filter/read=convert.base64-encode/resource=./flag

4. 得到一组BASE64加密的字符串

aGEgaGE/IHlvdSB3YW50IGZsYWc/IGZsYWcgaXMg...

5. 进行解密,得到flag!

ha ha? you want flag? flag is here
<?php
// try to read this source code
//$flag = 'flag{xxxxxxx}';
?>
, but don't let you see!   

参考链接(一)–文件包含原理

参考链接(二)–文件包含的技巧

谢谢您的查阅,欢迎来访!