一. 简单理解
文件包含就是一个文件里面包含另外一个文件。一开始接触的时候是因为php里面,但是查找了一些资料这个存在在很多语言里面。
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,
而在JSP、ASP、程序中却非常少,甚至没有,这是有些语言设计的弊端。
在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。
二.产生的原因
通过引入文件时,用户可控,没有严格的检验,或是被绕过,操作一些敏感文件,导致文件泄露和恶意代码注入
当包含文件在服务器本地上,就形成本地文件包含,当包含的文件在第三方服务器是,就形成可远程文件包含。
包含文件的函数
1.include()
2.include_once()
3.require()
4.require_once()
代码审计的时候,是否是变量,不过滤,过滤不严格,函数include/require
远程文件包含和本地文件包含的配置区别
- 本地文件包含php.ini配置文件中开启allow_url_include
- 远程文件包含与本地文件包含的区别(开启allow_url_include和allow_url—ftp on)
-
远程文件(包括本地文件包含)包含比本地文件包含的危害大
本地文件包含利用
- 上传图片GETshell
- 读取文件,读取php文件
- 包含日志文件获取webshell
- 包含/proc/self/environ 文件webshell
- phpinfo.php 可以包含临时文件(显示临时文件路径)写工具发包上传文件。查看返回信息路径。在使用include包含文件(速度要求快)
-
包含data//或是php://input协议(伪协议,需要allow_url_include=On) 作者:青山i 链接:https://www.jianshu.com/p/110278faeddb
使用PHP封装协议读取文件和写入PHP文件
1.读取文件
先看看读取文件,如输入page参数值为:php://filter/read=convert.base64-encode/resource=../../../../../var/www/dvwa/hackable/uploads/1.txt
格式为上
2.写入文件
前提条件是allow_url_include为on,则构造如下URL:192.168.220.128/dvwa/vulnerabilities/fi/?page=php://input
然后再POST需要输入的内容即可,这里通过Firefox的HackBar来POST数据