文件包含漏洞——原理及漏洞防御

1、文件包含漏洞原理。

  • 原理:
  • 在通过PHP的相应函数(比如include())引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入
  • 文件包含漏洞的形成,需要满足两个条件:
  •  1、 include()等函数通过动态变量的方式引入需要包含的文件。
  •  2、用户能够控制这个动态变量。
  • 将一个文件加载当前文件中进行执行:
  • 例:
  •       Include
  •       Require
  •       Include_once
  •       Require_once

2、文件包含漏洞两种方式。

  • 本地文件包含(LFI):
  • 能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。
  • 远程文件包含:
  • 1、如果php.ini的配置选项allow_url_include为ON的话,文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行任意命令。
  • 2、如果PHP的配置选项中,allow_url_include为ON的话,include和require这样的文件包含函数是可以加载远程文件的。远程文件漏洞,可以直接用来执行任意命令。

3、文件包含漏洞危害。

  • 1、敏感信息泄露
  • 2、获取Webshell
  • 3、任意命令执行

4、文件包含漏洞进阶-PHP协议。

  • PHP带有很多内置URL风格的封装协议,可用于类似fopen()、copy()、file_exists()和filesize()的文件系统函数。
  • File协议:
  • file:///c:\\windows\\system32\\drivers\\etc\\hosts
  • http://192.168.0.102\\1.txt

5、远程文件包含   包含的是txt文件。

  • 文件包含的时候,无视文件格式,只要文件中有php代码,就会被执行。
  • 浏览器 请求  192.168.0.102/phpinfo.php   得到的是php代码解析后的结果  是从远端的服务器进行解析的。

6、文件包含漏洞,包含的是一张图片。

  • 只要图片中包含php代码就可以解析成功(图片马   ---- 文件上传漏洞中上传的图片马)

7、文件包含漏洞防御。

  • 设置白名单
  • 代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
  • 过滤危险字符
  • 由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。
  • 设置文件目录
  • PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
  • 关闭危险配置
  • PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。

注意:任意文件包含漏洞的主要出现在能够解析处理脚本文件的函数上,没有对输入的变量进行过滤,导致任意文件包含,进而导致恶意代码执行。在开发处理这类功能函数上,一定要遵循编程规范;在代码核心处,对变量进行过滤限制,设置文件路径或者白名单,避免执行任意文件包含。

发布了40 篇原创文章 · 获赞 130 · 访问量 3121

猜你喜欢

转载自blog.csdn.net/cldimd/article/details/104994497
今日推荐