文件包含漏洞详解

什么是文件包含?

在程序员开发过程中,通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需在此编写,这种调用文件的过程一般被称为文件包含。

文件包含漏洞产生原因?

随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。

文件包含漏洞分类

1、本地文件包含:

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

2、远程文件包含漏洞:

本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞。

3, 文件包含漏洞特点

1.无视文件扩展名读取文件。包含文件时,PHP会读取文件源码,包括图片文件。尝试包含图片,连接为:http://192.168.1.16/fileInclude/fileinclude.php?path=aa.jpg,打开图片,发现不是图像,而是图片源码。
2.无条件解析PHP代码。文件包含在读取文件源码的同时,如果遇到符合PHP语法规范的代码,就会无条件执行,例如将info.php的后缀名改为info.rar,依旧能够显示phpinfo()信息,也为图片马提供了另外一种方式。

常见文件包含漏洞函数

1、include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。
2、include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
3、require()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
4、require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

文件包含示例

漏洞的环境代码:

	<?php
		$flie=$_GET[“file”];
		Include($flie);
	?>

本地文件包含示例

创建两个文件来演示 当我们访问aa.php时 后面cc这个参数可以有我们控制
在这里插入图片描述访问http://127.0.0.1/incloud/aa.php?cc=cc.php
在这里插入图片描述

远程文件包含示例

需要满足两个条件在php.ini中。当php.ini 中的配置选项 allow_url_fopen:on
allow_url_include:on

在我们另一台服务器上面创建一个phpinfo的文件
在这里插入图片描述使用http://访问服务器上的文件 我们发现这个phpinfo是kali的不是我们需要的
在这里插入图片描述这时需要修改phpinfo.php后缀为其他格式在访问就是我们需要知道的服务器的了
在这里插入图片描述

php伪协议包含

这里简单介绍以下几种伪协议
1、File:// – 访问本地文件系统
2、http:// --访问http(s)网址
3、Phar:// --PHP归档
4、Php:// --访问各个输入/输出流
5、Zlib:// --压缩流
6、Data:// --数据

1.通过file://包含

条件:
(1) allow_url_fopen:off/on 都可以
(2) allow_url_include:off/on都可以
只能使用绝对路径
http://127.0.0.1/incloud/aa.php?cc=file://C:/phpStudy/PHPTutorial/WWW/incloud/111.txt
在这里插入图片描述

2.通过php://包含

1、条件:
(1)allow_url_fopen:off/on都可以
(2)allow_url_include: 仅php://input 、php://stdin php://memory、 php://temp 需要on
php://协议这里介绍 php://filter 读取源码 ,php://input 执行php代码

php://filter

Php://filter参数详解:
该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。

read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(*
write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况 应用于读或写链

转换过滤器:
convert.base64-encode & convert.base64-decode
等同于base64_encode()和base64_decode(),base64编码解码

convert.quoted-printable-encode & convert.quoted-printable-decode
quoted-printable 字符串与 8-bit 字符串编码解码
示例:

下面是一个写入文件代码 将phpinfo写入到shell.php

<?php

fputs(fopen('shell.php','w'),'<?php phpinfo?>');

?>

当我们远程访问这个文件时就会写入shell.php这个文件
在这里插入图片描述

php://filter/read读文件

http://127.0.0.1/incloud/aa.php?cc=php://filter/read=convert.base64-encode/resource=shell.php

在这里插入图片描述可以看到当我们使用php://filter/read读文件可以读取到内容 是经过base64编码的 只需要解码就能得到
在这里插入图片描述

php:input

此协议需要allow_url_include为on,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。

在这里插入图片描述也可以用上面的写入文件代码写入文件

<?php fputs(fopen('shell.php','w'),'<?php phpinfo?>');?>

在这里插入图片描述

data://协议包含:

1、条件:
allow_url_fopen:on
allow_url_include :on
2、作用:
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
3、用法:
data://text/plain
data://text/plain;base64,
示例:

http://127.0.0.1/incloud/aa.php?cc=data://text/plain;base64,<?php phpinfo();

后面修改base64编码执行

http://127.0.0.1/incloud/aa.php?cc=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==

在这里插入图片描述

日志文件包含

利用日志文件来包含,日志文件是可读的
首先需要知道日志存在的位置
C:\phpStudy\PHPTutorial\Apache\logs
linux中可以使用 find / -name access.log来查找
在这里插入图片描述使用php代码跟在路径后面访问让他报错
在这里插入图片描述然后这时候代码已经被记录到报错日志中
http://127.0.0.1/incloud/aa.php?cc=…/…/apache/logs/error.log
访问报错日记文件
在这里插入图片描述发现是经过编码的这时候需要用到burp抓包来修改
在这里插入图片描述然后再访问报错日志路径就可以成功得到shell
在这里插入图片描述

修复

1.建议白名单
2.指定访问一定的路径,再将参数拼接到路径当中
3.PHP 中使用 open_basedir 配置限制访问在指定的区域
4.过滤.(点)/(反斜杠)\(反斜杠)等特殊字符
5.尽量关闭 allow_url_include 配置

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

制冷少年的成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值