专栏首页黑白天文件包含漏洞原理利用方式及修复

文件包含漏洞原理利用方式及修复

web安全

更新于 2月25日 约 8 分钟

注:本文仅供学习参考

文件包含定义: 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。造成方便的同时,也留下了隐患。

文件包含常用函数:

require()#函数出现错误的时候,会直接报错并退出程序的执行
require_once()#只包含一次
include()#在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
include_once()#只包含一次

原理: 在进行文件包含的时候,没有对参数进行严格的过滤

<?php 
  $filename = $_GET['filename'];
  include($filename);
?>
如上述例子 在引用filename函数时,没有过滤,直接引用了这个函数

文件包含分类: 本地包含:可以进行一些本地的文件读取 远程包含:可以对外网上的文件进行读取

实战: 留意url,这里我想包含当前目录的1.txt(内容为phpinfo()),发现成功执行php语句

同理读取其他文件可使用../../返回上级目录,就比如我相关读取D盘下的2.txt

思路

有时候当我们发现了一个本地的文件包含漏洞,但我们也仅仅只能去读取一些本地的文件,没有办法去进行更深层次的利用,然后又在这个网站上发现了一个文件上传漏洞,同时这个文件上传漏洞如果单个来看是比较鸡肋的,比如它做了限制,只能发送图片,而这个图片却没有做严格的限制,我们可以通过一些图片木马来绕过上传,而这两个漏洞结合一下的话,就能达到很大效果了 比如我们上传了一个图片木马,没法单独去使用,但我们可以使用文件包含漏洞,去对这个文件进行包含,也就是说两个文件互相结合进行利用

这里提供一个思路getshell:就比如想getshell但又没有上传点,怎么办呢,我们可以把一句话包含进apache日志里(日志位置可以猜测一下),进行getshell。下面来看看实战。

日志位置于../../../../apache/logs/access.log 直接写一句话(注意浏览器会编码,通过burp请求)

这时打开菜刀尝试连接 成功getshell

ps:%00截断 条件:magic_quotes_gpc = Off php版本<5.3.4 比如这种

<?php 
  $filename = $_GET['filename'];
  include($filename . ".html");
?>

远程文件包含: PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

条件

allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)

了解php伪协议: php伪协议本来是方便使用的,但如果存在包含漏洞,攻击者可以充分利用读取或写入一些文件 这里介绍几个常用的

php://filter(本地磁盘文件进行读取)
php://input
file://伪协议 (读取文件内容)

php://filter用法 ?php://filter/convert.base64-encode/resource=xxx.php 通过Base64解密后

成功读取

file://伪协议 (读取文件内容) 通过file协议可以访问本地文件系统,读取到文件的内容 这里读取我D盘下的2.txt 2.txt的内容为phpinfo();

php://input 可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data” 的时候 php://input 是无效的。 用法:?file=php://input 数据利用POST传过去。

php://input(写入木马) 条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),(不开启会报错)就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。 如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。

php://input(读取post数据) 碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项

php://input(命令执行) 条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行

修复方式

过滤../ ./
配置php.ini文件
都关闭allow_url_fopen 和 allow_url_include
设置白名单

还有很多协议如data phar zip等等等等 有兴趣的伙伴可以去研究一下

本文分享自微信公众号 - 黑白天(li0981jing),作者:wulaoban

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux常用shell种类

    cn0sec
  • url跳转漏洞原理及绕过方式

    0x01 url跳转原理及利用 0x02 url跳转bypass 0x03 url跳转修复

    cn0sec
  • Swaks伪造邮件发件人绕过SPF

    设置正确的 SPF 记录可以提高邮件系统发送外域邮件的成功率,也可以一定程度上防止别人假冒你的域名发邮件。

    cn0sec
  • 文件包含漏洞与文件包含Bypass漏洞基础

    服务器通过PHP的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到攻击的目的。

    天钧
  • 迁移TFS,批量将文档导入SharePoint 2013 文档库

    一、需求分析 公司需要将存在于旧系统(TFS)所有的文档迁移至新系统(SharePoint 2013)。现已经将50G以上的文档拷贝到SharePoint ...

    用户1161731
  • python之抓取微信公众号文章系列3

    发现了一个非常有用的库 wechatsogou,听个名字你就大概能猜出是什么来的了,基于搜狗微信搜索的微信公众号爬虫接口,有了这个就可以玩起来了。

    周小董
  • Android开发笔记(一百五十三)OpenGL绘制三维图形的流程

    从这篇文章开始,接下来会连载一系列的OpenGL相关博文,好好探讨如何在Android中进行OpenGL开发。 OpenG...

    用户4464237
  • 物联网芯片正在积极开发 明年将得到爆发

    随着物联网边缘智能需求的不断增长,芯片制造商们开始积极开发低功耗、低成本的物联网芯片,帮助物联网企业实现最优的无线连接解决方案。2018年微型控制器MCU市场将...

    企鹅号小编
  • Gartner丨 边缘计算成熟度曲线 2019

    全球著名信息技术研究和顾问公司Gartner于2019年下半年发布“边缘计算成熟度曲线”,边缘计算社区经过授权,编译发布“边缘计算成熟度曲线 2019 ”中文版...

    SDNLAB
  • Python自动抢红包,从此再也不会错过微信红包了!

    作者 | 上海小胖 来源 | Python专栏(ID:xpchuiit) 目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 ...

    数据森麟

扫码关注云+社区

领取腾讯云代金券