我是靠谱客的博主 高兴红牛,最近开发中收集的这篇文章主要介绍文件包含漏洞,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、任意文件读取/删除

1、漏洞描述
很多网站由于业务需求,往往需要提供文件下载、读取、删除等功能块,但是如果对下载的文件没有做限制,直接通过绝对路径、相对路径对其文件进行读取,那么,用户就可以利用这种方式读取服务器的敏感文件、获取网站源代码、进行SSRF漏洞攻击。

2、产生原因

  • 存读取文件的函数
  • 读取文件的路径用户可控,且未校验或校验不严
  • 输出了文件内容

3、文件读取函数

  • show_source() 高亮显示文件内容
  • highlight_file() 高亮显示文件内容(别名)
  • readfile() 读取文件内容并输出
  • file_get_contents() 将文件读取为字符串
  • file() 将文件安行读取为数组

4、利用方式

  • 读取web源码
  • 读取数据库文件
  • 读取服务器配置文件
  • 读取日志文件
  • 读取proc文件系统

二、文件包含

1、漏洞描述
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的内容,将之当成PHP脚本来执行。而由于包含的文件名没有经过合理的校验,从而包含了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入,主要包括本地文件包含远程文件包含两种形式。

2、产生原因
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。

3、文件包含函数

  • require() 、require_once()、 include() 、include_once()
  • include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
  • include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

PHP中文件包含函数特点:文件包含不需要考虑文件名是否为PHP

三、文件包含利用

1. 本地文件包含LFI
指能打开并包含文件的漏洞,大部分情况下遇到的文件包含漏洞都是LFI。

2. 本地文件包含利用
1、包含本地文件,读取敏感文件
2、将shell写入日志,包含日志文件getshell
3、将shell写入session文件,包含session文件getshell
4、结合文件上传getshell
5、结合php伪协议getshell
6、远程文件包含getshell

四、PHP伪协议

PHP 带有很多内置 URL 风格的封装协议,可用于类似 file() 、show_source() 、 fopen()、 copy()、 file_exists() filesize() 等等的文件系统函数,以及文件包含函数。在PHP的官方手册中,共有12种伪协议。

PHP默认配置:
allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据
allow_url_include=Off(php5.2之后默认为Off) 规定是否允许include/require远程文件

五、文件包含防御

1. 配置文件

  • 在配置文件中限制访问的文件目录,比如PHP中php.ini配置open_basedir
  • 尽量关闭allow_url_include配置

2. 特殊字符过滤

  • 检查用户输入,过滤或转义含有“…/”、“…”、“http”、“%00”,“…”,“.”,“#”等跳转目录或字符终止符、截断字符、url的输入

3. 合法性判断

  • 严格过滤用户输入字符的合法性,比如文件类型、文件地址、文件内容等

4. 白名单
白名单限定访问文件的路径、名称及后缀名

最后

以上就是高兴红牛为你收集整理的文件包含漏洞的全部内容,希望文章能够帮你解决文件包含漏洞所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部