前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件包含漏洞原理利用方式及修复

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

作者头像
黑白天安全
发布2020-03-10 18:59:27
4.2K0
发布2020-03-10 18:59:27
举报
文章被收录于专栏:黑白天安全团队

web安全

更新于 2月25日 约 8 分钟

注:本文仅供学习参考

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

文件包含常用函数:

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

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

代码语言:javascript
复制
<?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 比如这种

代码语言:javascript
复制
<?php 
  $filename = $_GET['filename'];
  include($filename . ".html");
?>

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

条件

代码语言:javascript
复制
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)

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

代码语言:javascript
复制
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代码,即可执行

修复方式

代码语言:javascript
复制
过滤../ ./
配置php.ini文件
都关闭allow_url_fopen 和 allow_url_include
设置白名单

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑白天实验室 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注:本文仅供学习参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档