目录
什么是文件包含?
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
服务器执行PHP文件时,可以通过包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件。
文件包含漏洞产生的原因
为了代码更灵活,通常会把被包含的文件设置为变量 ,进行动态调用 ,从而导致客户端可以调用任意文件 ,造成文件包含漏洞。动态包含的文件路径参数,客户端可控 。web应用对用户的输入没有进行过滤或者严格过滤就带入文件包含函数中执行
文件包含函数
include()
找不到被包含的文件时只产生警告 ,脚本将继续执行
include_once()
此语句和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含
require()
找不到被包含的文件时会产生致命错误,并停止脚本
require_once()
此语句和 require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含
文件包含的文件都会被解析为php
本地文件包含
日志文件包含
什么是日志文件
当我们安装Apache后,Apache会自动给生成两个日志文件,这两个日志文件分别是访问日志access_log和错误日志error_log(在windows上是access.log和error.log)Access.log为访问日志,记录所有对apache服务器进行请求的访问。
如果没有access.log文件
日志文件包含实验
第一步:打开DVWA靶场文件包含模块
第二步:尝试通过DVWA靶场包含日志文件
第三步:向日志文件中写入“phpinfo”
第四步:打开access.log日志文件发现phpinfo被写入日志文件中
第五步:再次包含日志文件,phpinfo被解析
远程文件包含漏洞
如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含(RFI)
尝试包含http://baidu.com/robots.txt
PHP伪协议
php://filter伪协议包含文件漏洞复现
第一步:访问文件包含靶场file1.php文件
第二步:使用php://filter/read=convert.base64-encode/resourec=file1.php读取file1.php源码
第三步:将读取到的源码使用火狐插件进行base64解码得到file1.php文件源码
第四步:解码后的file1.php的源码
php://input伪协议文件包含漏洞复现
第一步:使用burp suite软件抓包使用php://input伪协议将一句话木马写入
第二步:将数据包发送后,观察到一句话木马被包含
data伪协议文件包含漏洞复现
第一步:使用data://text/plain,<?php phpinf();?>直接执行
第二步:使用data://text/plain,<?php system(dir);?>执行系统命令
第三步:使用data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==进行base64加密执行
文件包含漏洞的防御
PHP:配置php.ini关闭远程文件包含功能(allow_url_include = Off)
严格检查变量是否已经初始化。
建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
严格检查include类的文件包含函数中的参数是否外界可控。
不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
在发布应用程序之前测试所有已知的威胁。
路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“../”;
包含文件验证:验证被包含的文件是否是白名单中的一员;
尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("head.php");,不要把被包含的写成变量。
标签:文件,include,包含,超级,漏洞,详解,日志,php From: https://blog.csdn.net/weixin_58849785/article/details/137630067