赛博保安日志 - 漏洞
type: channel
link: https://blog.anheng.tech/index.php/tag/%E6%BC%8F%E6%B4%9E/
items: 文件包含漏洞

文件包含漏洞
type: item
date: 2023-01-24T13:20:00+08:00
description: 一、漏洞描述程序在引用文件的时候，引用的文件名，用户可控的情况，传入的文件名没有经过合理的校验或者校验不严，从而操作了预想之外的文件，就有可能导致文件泄露和恶意的代码注入。程序开发人员一般会把重复使用的函数写到单个文件中，需要使用某个函数时直接调用此文件，而无需再次编写，这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活，所以将被包含的文件设置为变量，用来进行动态调用，但正是由于这种灵活性，从而导致客户端可以调用一个恶意文件，造成文件包含漏洞。几乎所有脚本语言都会提供文件包含的功能，但文件包含漏洞PHP Web Application中居多，而在JSP、ASP、ASP.NET程序中却非常少，甚至没有，这是有些语言设计的弊端。二、常见文件包含函数三、漏洞危害1、敏感信息泄露2、拒绝服务攻击3、执行恶意代码4、配合文件上传，扩大危害一般来说，远程文件包含漏洞危害更大。四、利用前提1、web应采用include()等文件包含函数通过动态变量的方式引入需要包含的文件2、用户能够控制该动态变量五、两个关键选项Allow_url_fopen = on是否允许将URL（HTTP,HTTPS等）作为文件打开处理，默认开启Allow_url_include= on是否允许include（）和require（）函数包含URL（HTTP,HTTPS）作为文件处理，默认关闭，远程文件包含必须为开启。六、挖掘抓包观察有无明显的参数用于打开或使用文件，在漏洞挖掘过程中，注意下即可，如果遇到疑似文件包含，可以使用以下的测试方法。a.php是fileinclude.php的同⼀⽬录的⽂件 http://www.aaa.com/fileinclude.php?file=file://a.php 打开⽬标⽹站，⼀般不会被过滤掉 http://www.aaa.com/fileinclude.php？file=http://www.aaa.com因为不知道对参数的过滤方式，因此该方法不一定成功。七、本地文件包含（LFI）能够读取或执行包含本地文件的漏洞，称为本地文件包含漏洞。重要特点：把任何包含进来的文件都当作PHP文件来执行。下面是pikachu靶场的源码$_GET['filename'] 接收客户端传的参数，其中没有任何过滤带⼊到 include 函数中， include 包含这个⽂件，引⼊到当前⽂件中，因此会造成⽂件包含漏洞； ⽐如：http://pikachu.com/vul/fileinclude/fi_local.php?filename=123.jpg 1.jpg是图⽚，但是当有⽂件包含漏洞时，这个图⽚会被当做 php ⽂件处理，当然前提是它 ⾥⾯有 php 的代码，这样我们就可以先写⼀个 php 代码的⽊⻢，然后伪装成图⽚上传，从⽽ 达到控制对⽅的⽬的。八、php伪协议1、简介PHP带有很多内置URL风格的封装协议，可用于类似fopen（）、copy（）、file_exists()和filesize（）的文件系统函数，除了这些封装协议，还能通过stream_wrapper_register()来注册自定义的封装协议。可以在phpinfo中的Registered PHP Streams中找到可使用的协议。2、测试环境测试代码php.ini配置各协议的利用条件和方法1、PHP：//filterphp：//filter是一种元封装器，设计用于数据流打开时的筛选过滤应用。参数过滤器列表字符串过滤器String.strip_tags转换过滤器压缩过滤器加密过滤器可⽤过滤器列表：https://www.php.net/manual/zh/filters.php利用姿势1：？file=php：filter/read=convert.base64-encode/resource=index.php通过指定末尾的文件，可以读取经base64加密后的文件源码，之后再base64解码一下就行，虽然不能直接获取到shell等，但能读取敏感文件危害也是挺大的，同时也能够对网站源码进行审计。利用姿势2：？file=php://filter/convert.base64-encode/resource=index.php效果跟前面一样，只是少了个read关键字，在绕过一些waf时也许有用。file://专门用于访问本地文件系统和php://filter类似都可以对本地文件进行读取。2、PHP：//inputPHP://input是个可以访问请求的原始数据的只读流，将post请求中的数据作为php代码执行。利用条件：Allow_url_fopen =onAllow_url_include=on注意：当entype=“multipart/form-data"，php…