文件包含漏洞上-知识点篇

文件包含漏洞上-知识点篇

二月 20, 2021

简介

形成

​ 程序员写程序的时候,不喜欢干同样的事情,也不喜欢把同样的代码(比如一些公用的函数)写几次,于是就把需要公用的代码写在一个单独的文件里面,比如 share.php,而后在其它文件进行包含调用。在php里,我们就是使用上面列举的那几个函数来达到这个目的的,它的工作流程:如果你想在 main.php里包含share.php,我将这样写include(“share.php”)就达到目的,然后就可以使用share.php中的函数了。当应用程序使用攻击者控制的变量(share.php)构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行时执行的文件。

相关函数

  1. PHP对于包含文件所提供的功能太强大,太灵活,所以经常出现在PHP语言中,而在asp、asp.net和jsp中非常少。

  2. php中的四个包含文件函数include(),include_once(),require()和require_once()。

  • include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。

  • include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。

  • require():require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到该函数时才调用。

  • require_once():它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

执行

文件包含时,不管包含的文件是什么类型,都会优先尝试当作php文件执行,如果文件内容有php代码,则会执行php代码并返回代码执行的结果,如果文件内容没有php代码,则把文件内容打印出来。

分类

  1. 本地包含LIF:

仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

  1. 远程包含RLF需要allow_url_include=on(配置文件为on状态),就是可以包含其他主机上的文件,并当成php代码执行。

注意:如果是包含远程服务器上的PHP文件,那么得到的是被远程服务器解析过的PHP,所以在写一句话木马的时候就不要做成.php的文件,一般包含.txt的文件。

  • allow_url_fopen:为on时,能读取远程文件,例如:file_get_contants()就能读取远程文件;

  • allow_url_include:为on时,就可使用include和require等方式包含远程文件。

文件包含漏洞的利用方式

伪协议

【file://协议】

  • file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响,通过file协议可以访问本地文件系统,读取到文件的内容。

  • 使用方法:

1
file:// [文件的绝对路径和文件名]
  • 例子:

http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D:\phpstudy_pro\WWW\DVWA\phpinfo.php

1

【php://协议】

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

php://filter(本地磁盘文件进行读取)

  • 元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。

  • 条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

  • 用法:

    1
    ?filename=php://filter/convert.base64-encode/resource=xxx.php 

?filename=php://filter/read=convert.base64-encode/resource=xxx.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

如果想要读取运行php文件的源码,可以先base64编码,再传入include函数,这样就不会被认为是php文件,不会执行,会输出文件的base64编码,再解码即可。

(2.txt文件的内容被进行了base64的编码)

![2](2.png)

![3](3.png)

- 若采用rot13编码,对php文件中的<?是无效的,仍会被认为是php文件去执行,但其中的内容是乱码的,是没有输出效果的。

#### **php://input**

- **php://input** 是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据, 将post请求中的数据作为PHP代码执行。

这个协议的利用方法是 将要执行的语法php代码写在post中提交,不用键与值的形式,只写代码即可。

![4](4.png)

![5](5.png)

#### **phar://协议**

- phar:// 可以查找指定压缩包内的文件

![6](6.png)

![7](7.png)

#### **zip://协议**

- 注意:只能传入绝对路径;要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23。
- 使用方法

```.pngjava
zip://archive.zip#dir/file.txt
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

8

bzip2://协议

  • 使用方法
1
compress.bzip2://file.bz2
  • 例子

http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

9

zlib://协议

  • 使用方法
1
compress.zlib://file.gz
  • 例子

http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

10

data://协议

  • 直接写入代码

    1
    data: text/plain,<?php 执行内容 ?>

11

  • 使用base64编码

    1
    data:text/plain;(注意是分号不是逗号,与前面不同)base64,编码后的php代码

12

有一点要注意的问题,base64编码后的加号和等号要手动的url编码,否则无法识别。

13

14

php伪协议总结小表格:

15

参考文章:

https://blog.csdn.net/zpy1998zpy/article/details/80598768

其他

00截断、长度截断(windows:256,linux:4096)、包含日志文件、包含session

文件包含漏洞的防御

1.PHP中使用open_basedir配置限制访问在指定的区域;

2.过滤点、斜杠、反斜杠

3.禁止服务器远程文件包含

4.尽量不要使用动态包含,可以在需要包含的页面固定写好。


DVWA靶场

解压后进入DVWA下的config文件打开config.inc.php.dist文件,将其改为php文件。将p@ssw0rd 修改为 root,用户名:admin 默认密码:password 成功登录。

DVWA–【file inclusion】

在本系列中采用的1.php和1.txt代码都是:

1
<?php phpinfo(); ?>

将DVWA的级别设置为low

  1. 首先先到DVWA security处选择security level,先选择low进行提交,再回到对应模块,分析源码,可以看到没有对page参数做任何过滤。

16

  1. 尝试进行文件包含:
  • 本地文件包含

采用绝对路径:

17

相对路径:

“./”:代表目前所在的目录。

“../”:代表上一层目录。

18

  • 远程文件包含

通过http协议包含本地服务器上的文件

19

通过http协议包含远程服务器上的文件

20

将DVWA的级别设置为medium

  1. 分析源码,可以看到使用str_replace函数对http://、https://、../ 、..\进行了过滤,但可以通过双写来绕过,或者使用绝对路径来绕过。

21

  1. 进行绕过

22

  • 绝对路径绕过

23

将DVWA的级别设置为High

  • 分析源码可以看到,如果$file变量中不含有file并且$file不等于include.php,此时服务器才不会去包含文件,两个条件只要不满足其中任意一个,就能达到文件包含的目的,可以用file协议来绕过。

24

将DVWA的级别设置为Impossible

  • 分析源码可以看到,使用白名单,page只能为include.php”、“file1.php”、“file2.php”、“file3.php”之一,只允许包含include.php、file1.php、file2.php、file3.php,不能包含别的文件,彻底杜绝文件包含漏洞

25

DVWA-文件包含漏洞笔记参考原文

https://www.cnblogs.com/yuzly/p/10799486.html

pikachu靶场

pikachu–file inclusion

  1. 本地文件包含:

在此处只能使用相对路径而不能使用绝对路径进行包含。

26

  1. 远程文件包含:

输入每个球员的名字之后也可以看到URL处filename参数的变化:

27

进行远程文件包含:

28

也可以使用file协议以及data协议进行绕过。