-

[TOC]

文件包含基础:

什么是文件包含?

image-20210719175451008

文件包含是为了代码复用。

PHP文件包含函数:

image-20210719175806092

什么是文件包含漏洞?

开发者为了代码灵活性将被包含的文件设置为变量,进行动态调用,但灵活性导致了客户端可以调用一个恶意文件,造成文件包含漏洞。

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

文件包含分类:

image-20210719180405813

大部分都是本地文件包含。

文件包含环境说明:

image-20210719180522175

本地文件包含利用方法

任意文件读取: 图马

在包含PHP代码时,代码得到执行;若不是则以字符串方式直接显示。

file://与直接包含

image-20210719181020421

file=/etc/passwd file=file:///etc/passwd(file协议)

包含上传文件:

将想要执行的代码文件放在被包含文件中,进而得到执行。

image-20210719181521704

包含日志文件:

image-20210719181837917

apache日志文件默认存放位置:/var/log/apache2

网站运行使用www的用户服务,没有权限去读取日志文件,一般日志文件网站是无法包含的,若有则必定是它。

PHP伪协议

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

?file=php://input

image-20210722194441432

?file=php://filter 对于flag.php这个文件本来是无法获取其具体内容的,读取时会直接读取“flag.php”这句代码,但是通过过滤器可以规定其编码格式,读取文件内的具体代码。

image-20210722194546683

zip:// 可以用来绕过检测。

image-20210722195120345

phar:// 类似zip://

​ linux中可以将一个目录打包成一个文件,可以通过phar://这一伪协议不解压直接访问,比如访问jpg文件中的一个文本txt文件。

​ 在反序列化中有更大的利用。

image-20210722195341388

data:// 类似php://input 要求比较严格

​ ?file=data://text:/plain,<?php phpinfo(); <?php phpinfo()为要包含的内容。

image-20210722195911332

常见限制绕过方法:

前缀绕过

目录遍历:

当在包含文件时有限制,只能访问特定目录下的文件,伪协议是不能用的,因为伪协议规定从开头就出现,而要访问特定目录路径下的文件就不可用了。

使用../../来返回上一级目录, 目录穿越 ../代表父级目录

如:?file=../../phpinfo/phpinfo.php

后缀绕过

利用协议:

前面部分得到解放就可以使用伪协议的部分,利用zip://和phar://

若只能包含一个php文件,但服务器上无法使用php木马,只能上传一个jpg文件,对于zip文件修改后缀为zip.jpg上传上去再用zip这样一个协议包含jpg文件下面一个php文件。

image-20210722201832929