作者名:Demo不是emo
主页面链接:主页传送门
创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构每日emo:可后来,除了梦以外的地方,我再也没有见过你
目录
一:初识文件包含漏洞
1.简析文件包含
2.文件包含漏洞
二:常见的文件包含函数
三:文件包含漏洞分类
1、本地文件包含
2、远程文件包含漏洞
四:通过php伪协议进行包含
1、通过file://包含
[1]、条件:
2、通过php://包含
[1]、条件:
[2]、作用:
3.通过Zip:// & zlib:// 协议包含
[1]、条件:
[2]、作用:
4.data://协议包含
[1]、条件:
[2]、作用:
[3]、用法:
5.phar://协议包含:
[1]、条件:
在程序员开发过程中,通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需在此编写,这种调用文件的过程一般被称为文件包含。
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。
1、include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。
2、include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次
3、require()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
4、require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
5、highlight_file()、show_source()
函数对文件进行语法高亮显示,通常能看到源代码
6、readfile()、file_get_contents()、
函数读取一个文件,并写入到输出缓冲
7、fopen()
打开一个文件或者url
几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在PHP中居多,而在JSP\ASP\ASP.NET程序中非常少,甚至没有文件包含漏洞的存在。
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
本地文件包含和远程文件包含造成漏洞的原因是一样的,
当php.ini 中的配 置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以 是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
所以远程文件包含条件: 需要满足两个条件在php.ini中。当php.ini 中的配置选项
allow_url_fopen:on
allow_url_include:on
PHP伪协议事实上就是PHP支持的协议与封装协议
1、File:// -- 访问本地文件系统
2、http:// --访问http(s)网址
3、Phar:// --PHP归档
4、Php:// --访问各个输入/输出流
5、Zlib:// --压缩流
6、Data:// --数据
7、Glob:// --查找匹配的文件路径模式
8、ftp:// --访问ftp(s)URLs
9、ssh2:// --Secure Shell 2
10、rar:// --RAR
11、ogg:// --音频流
12、expect:// --处理交互式的流
(1) allow_url_fopen:off/on 都可以
(2) allow_url_include:off/on都可以 [2]、作用: 用于访问本地文件系统,通常用于读取本地文件而且不会收到allow_url_fopen和allow_url_include的影响。 在include()/require()/include_once()/require_once()参数可控的情况下,如果导入非.php的文件,则仍按照php语法进行解析,因为这个是include()函数决定的。
(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参数详解:
该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:
resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。
read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符隔开
write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符隔开
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况 应用于读或写链
转换过滤器:(非常重要)
convert.base64-encode
//等同于base64_encode(),base64编码
convert.base64-decode
//等同于base64_decode(),base64解码
还有很多的过滤器,这里就不多讲了,后期会出一期博客专门来介绍
例子:使用php://filter配合转换器读取flag.php文件
php://filter/convert.base64-encode/resource=flag.php
利用php://input :
此协议需要allow_url_include为on,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
php://input 是个可以访问请求的原始数据的只读流。 所以enctype="multipart/form-data" 的时候 php://input 是无效的。
allow_url_fopen:off/on都可以的
allow_url_include :off/on都可以的
zip:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。
allow_url_fopen:on
allow_url_include :on
自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
Data://text/plain
Data://text/plain;base64,
phar://协议与zip://类似,同样可以访问zip格式压缩包内容。
allow_url_fopen:off/on都可以的
allow_url_include :off/on都可以的