文件包含漏洞详解(超级详细)

目录

什么是文件包含?

文件包含漏洞产生的原因

文件包含函数

include()

include_once()     

require()

require_once()     

本地文件包含

日志文件包含

什么是日志文件

如果没有access.log文件

日志文件包含实验

远程文件包含漏洞

PHP伪协议

php://filter伪协议包含文件漏洞复现

php://input伪协议文件包含漏洞复现

data伪协议文件包含漏洞复现

文件包含漏洞的防御


什么是文件包含?

        程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。

        服务器执行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");,不要把被包含的写成变量。

  • 78
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值