作者;小仙人
介绍;安全武器库运营团队成员
作者:小仙人
介绍:安全武器库运营团队核心成员,享受星球原创文章待遇
0x01 什么是文件包含漏洞
服务器通过PHP的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到攻击的目的。
0x02 漏洞产生的根本原因
在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件(即恶意文件) 。
0x03 是不是只有PHP才有文件包含漏洞
很显然不是,只是文件包含漏洞比较常出现在PHP当中,而且文件包含漏洞在PHP Web Application中居多。几乎所有脚本语言都会提供文件包含的功能,只是在JSP、ASP、ASP.NET程序中却非常少见,甚至没有,这就是语言设计中的弊端。
0x04 文件包含漏洞的类型
本地文件包含漏洞(LFI)
网站服务器本身存在恶意文件,然后利用本地文件包含使用。
利用条件:
(1)allow_url_fopen=On
(2)用户可以动态控制变量
远程文件包含漏洞(RFI)
调用其他网站的恶意文件进行打开。
利用条件:
(1)allow_url_include=On&&allow_url_fopen=On(两个选项同时开启)
(2)用户可以动态控制变量
注1:通常我们在Web中是无法知道allow_url_fopen、allow_url_include的,除非有phpinfo。通常本地包含都是开着的,因为它是默认开启的,而且很少人会改它。通常远程包含会被关掉,但是这说不准。
注2:从PHP 5.2开始allow_url_include就默认为Off的,而allow_url_fopen一直默认都是On的。通常开发人员没特殊情况也不会打开,所以说远程包含漏洞出现的概率很低,但是不代表没有。
0x05 常见的文件包含函数(白盒测试的时候需要用到)
PHP:Include()、Require()、Include_once()、Require_once()
ASP:include file()、include virtual()
JSP/Servlet:ava.io.file()、java.io.filereader()
注1:当白盒测试的时候,就可以对代码进行全局搜索,看是否用以上函数,若存在以上函数,那么判定可能存在文件包含漏洞,接着进一步测试。
注2:通常开发人员会比较少用带once的那两个函数,因为它会消耗更多的资源去做检测的工作。
注3:我特意问了一下PHP开发的同事,询问他们以上函数哪些函数用得最多,最后得到统一回复:没有所谓的用得最多,只有根据项目情景使用。
0x06 如何挖掘文件包含漏洞
从URL上观察关键词page、filename、file、path、dir等等,与文件相关的字眼/关键词,都可能存在文件包含漏洞。当然看过我目录遍历漏洞总结的文章也知道,这里的关键字眼可能会非常类似,甚至可以说一样。所以在挖掘方法上,手法类同。
0x07 如何利用文件包含漏洞
(1) PHP伪协议
• php://input(接收POST过来的值)
利用条件:
A. allow_url_include=On
B. allow_url_fopen=On
C. PHP版本小于5.3.0
利用姿势:
• php://filter
利用条件:
allow_url_fopen=On、allow_url_include不做要求
利用姿势:
index.php?file=php://filter/read=convert.base64-encode/resource=index.php
通过指定末尾的文件,可以读取经base64加密后的文件源码。届时在base64解码即可读取敏感文件。(不能直接获取shell,危害性一般,但是能读取敏感文件,从某个角度上说,危害还是挺大的。)
• phar://
利用条件:
PHP版本大于等于5.3.0
利用姿势:
将内容为一句话木马的1.txt压缩成1.zip,然后指定绝对路径,如下:
index.php?file=phar://D:phpstudyPHPTutorialWWW.zip.txt //绝对路径
index.php?file=phar://1.zip/1.txt //这里1.zip就和index.php同目录下
• zip://
利用条件:PHP版本大于等于5.3.0
利用姿势:
index.php?file=zip://D:phpstudyPHPTutorialWWW.zip%231.txt
注:使用zip伪协议的方法与phar大致相同,但是zip伪协议不能使用相对路径,否则会包含失败。而且这里要将#编码为%23。
• data:URL schema
利用条件:
A. PHP版本大于等于5.2
B. allow_url_fopen=On
C. allow_url_include=On
利用姿势:
index.php?file=data:text/plain,<?php phpinfo();?>
index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b注:加号+的URL编码为%2b,这里利用base64解码,常用于绕过。原本这一点我这里不太想写的,因为利用条件严苛,能满足这个条件那还不如直接利用远程文件包含漏洞。但是,这个有利于绕WAF,所以还是拿出来描述。
(2) 包含上传文件
利用条件:
上传文件的绝对路径以及文件名称
注:利用姿势这里没法提,要提的话,又能出一文章了。有时候文件上传遇到白名单检测,那么我们上次的图片马又无法配合解析漏洞,恰好这时候又有文件包含漏洞的话,那么就能利用组合拳getshell了。
注:以上列出的两大点是文件包含常用姿势,其它很少用的我就不一一列出,因为本文也是自己的学习总结,我觉得像包含session、包含日志、包含environ等等这些姿势很少用到,所以这里不描述,但是我是有印象的,当我以后用到的时候,再回头仔细研究,否则现在学了一遍,很久没用过也是会忘记。
如果想全面了解,这里推荐看前辈总结的几篇文章
https://chybeta.github.io/2017/10/08/php%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E/
https://www.freebuf.com/articles/web/182280.html
0x08 漏洞造成的危害
1. 严重的能写入恶意文件从而Getshell
2. 任意读取文件导致的敏感信息泄露
注:该漏洞本身的危害程度有限,但是如果配合起文件上传,其危害程度巨大。
0x09 如何防范此漏洞
1. 对文件进行严格的权限管理;
2. 过滤危险字符,如../、~/等;
3. 通过白名单策略,只允许包含运行指定的文件。(本人觉得此方式最妥当)如下:
phar://和zip://的区别:
phar://
可以查找指定压缩包内的文件,可传绝对路径,也可传相对路径。
zip://
用法与phar类似,不过有两点要注意,只能传入绝对路径,要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23。
PS:以上是我在学习和实践后的总结,纯属个人看法,若有不足之处,欢迎各位在评论区中指出。
有限制的本地文件包含绕过
(指定了后缀)
前提条件:
PHP < 5.3.4、magic_quotes_gpc=Off
前提条件:PHP<5.2.8
前提条件:
PHP<5.2.8,只适用于Windows操作系统
有限制的远程文件包含绕过
(指定了后缀)
前提条件:
未知,PHP>5.3的都可以尝试。
前提条件:
未知,PHP>5.3的都可以尝试。
?File=http://localhost/phpinfo.txt#
前提条件:
未知,PHP>5.3的都可以尝试。
前提条件:无
绕WAF的奇淫技巧
0x01 ../和..绕过
0x02 贪婪包含
0x03 通配符绕过
0x04 Base64编码绕过
0x05 使用data伪协议读取文件
知识总结
全世界只有不到3 % 的人关注了渗透云笔记
你真是个特别的人
「安全武器库」 知识星球 是一个网络安全各类安全脚本工具整合的星球!主要分享、整理、原创编辑等网络安全相关工具以及脚本。知识星球原定价:50元/年(服务时间为一年,自加入日期顺延一年)。
目前仅需:30元/年(服务时间为一年,自加入日期顺延一年)。
如何加入:扫描下方二维码,扫码付费即可加入
本文始发于微信公众号(渗透云笔记):文件包含漏洞与文件包含Bypass漏洞基础
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论