网络安全——文件包含漏洞
Posted 小常吃不下了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络安全——文件包含漏洞相关的知识,希望对你有一定的参考价值。
基础知识
由于开发人员编写源码,将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执行。
由于并没有针对代码中存在文件包含的函数入口做过滤,
导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。
文件包含攻击中WEB服务器源码里可能存在inlcude()此类文件包含操作函数,
通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。
如果攻击者为动态包含指令指定一个有效文件,那么该文件的内容会被传递给 php 解析器,可直接在远程服务器上执行任意PHP文件。
如果攻击者能够指定一条路径来指向被自己控制的远程站点,那么动态 include 指令就会执行由攻击者提供的任意恶意代码,也就是所谓的“远程文件包含”。
原理及危害
文件包含漏洞:
即【File Inclusion】,意思是文件包含(漏洞)是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())
利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
1.文件包含(Fi1e Inclusion)即程序通过[包含函数]调用本地或远程文件,以此来实现拓展功能
2.被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞
3.文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等包含函数
文件包含分为两类:
【本地文件包含】LFI(Local File Inclusion)当被包含的文件在服务器本地时,就形成本地文件包含
本地文件包含顾名思义,就是在网站服务器的本地存在恶意文件,然后本地包含使用
【远程文件包含】RFI(Remote File Inclusion)当被包含的文件在第三方服务器时,叫做远程文件包含
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,
服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行
函数解析
在PHP中,包含文件有4个函数,
分别是:include() ,include_once() ,require(), require_once()
其中include和include_once的功能类似,但是include_once就像函数名中的 once 一样,只会包含该文件一次,如果需要包含的文件已经被包含过了
再次调用include_once包含该文件时则不会再次包含该文件,该函数可以用来防止文件被重复包含或者变量被覆盖。
**include():**
执行到Include时才包含文件,找不到被包含文件时只会产生致命警告,脚本将继续执行
**require():**
只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
**include_once()和require_once ():**
若文件中代码已经被包含则不会再次包含
防御加固
1.严格判断包含的参数是否外部可控,
因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
2.路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“../”;
3.包含文件验证:验证被包含的文件是否是白名单中的一员;
4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include("head.php");
以上是关于网络安全——文件包含漏洞的主要内容,如果未能解决你的问题,请参考以下文章
安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段