文件包含知识点

参考自https://blog.csdn.net/qq_42181428/article/details/87090539

文件包含漏洞

文件包含

为了更好的使用代码的重用性,即提高代码的重复利用效率,引入了文件包含函数。JAVA的包,python的模块都有文件包含的含义。

1.什么是文件包含漏洞

通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。

形成原因

有时候,并不能确定要包含什么文件
比如下面这个文件代码

if(@$_GET[page]){  
@include $_GET[page];  
}else{  
include"home.php"  
}  

注意:只要是符合PHP语法的文件,无论是什么扩展名,他都会被当做PHP文件来执行

2.常见文件包含函数

php中常见的文件包含函数有以下四种:
include()
如果包含的文件或漏洞有问题,PHP代码继续向下执行,只生成警告,不会影响整个程序的运行,执行有返回值,后续同名文件会继续被包含
require()
如果包含的路径或语法等出了问题会生成致命错误(E_COMPILE_ERROR)并停止脚本,若成功会返回成功的标记不会返回值,后续同名文件会继续被包含
include_once()与require once()
如果文件已包含,后续同名文件不会被包含,只包含一次,以避免函数重新定义等问题其他特性如上

3.文件包含漏洞的分类

本地文件包含:
可以包含本地文件,在条件允许时甚至能执行代码
上传图片木马,然后包含
读敏感文件,读PHP文件
包含日志文件GetShell
包含/proc/self/envion文件GetShell
包含data:或php://input等伪协议
若有phpinfo则可以包含临时文件

远程文件包含:
可以直接执行任意代码
要保证php.ini中allow_url_fopen和allow_url_include要为On

php.ini
是用来控制php的某些功能
某些功能比如:错误提示,短标签,上传文件最大值,扩展等等可以通过php.ini文件设置
根据个人的要求让它们进行打开或者关闭

4.文件包含漏洞利用方式

(1)利用伪协议

PHP伪协议
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

PHP支持的伪协议如下:  
file:// — 访问本地文件系统  
http:// — 访问 HTTP(s) 网址  
ftp:// — 访问 FTP(s) URLs  
php:// — 访问各个输入/输出流(I/O streams)  
zlib:// — 压缩流  
data:// — 数据(RFC 2397)  
glob:// — 查找匹配的文件路径模式  
phar:// — PHP 归档  
ssh2:// — Secure Shell 2  
rar:// — RAR  
ogg:// — 音频流  
expect:// — 处理交互式的流    

1.php://filter

经常使用的伪协议,一般用于读取php源代码,有时也可以用于getshell.在双OFF的情况下也可以使用.
php://filter是一种元封装器,用于数据流打开时筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用。类似readfile()、file()、file_get_contents(),在数据流读取之前没有机会使用其他过滤器。
当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。

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

用法:?file=php://fitle/read=convert.base64-encode/resource=./index.php
这是使用的过滤器是convert.base64-encode.它的作用就是读取index.php的内容进行base64编码后输出。可以用于读取程序源代码经过base64编码后的数据。

2.php://input

可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
需要开启allow_url_include

3.zip://

zip:// 可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行。

  • zip://中只能传入绝对路径。
  • 要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23
  • 只需要是zip的压缩包即可,后缀名可以任意更改。
  • 相同的类型的还有zlib://和bzip2://

使用方法:

zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

4.data://

同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行。
allow_url_fopen参数与allow_url_include都需开启

5.phar:

phar://协议与zip://类似,同样可以访问zip格式压缩包内容,同样可以导致任意代码执行
示例:
http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt


(2)包含日志文件

WEB服务器一般会将用户的访问记录保存在访问日志中。那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。


(3)文件包含漏洞的其他利用方式(绕过)

00截断
长度截断
包含session

你可能感兴趣的:(自学)