【文件包含漏洞】——文件包含漏洞进阶_文件包含漏洞绕过

一、实验目的:

1、通过本次学习掌握文件包含漏洞的绕过原理。
2、通过搭建漏洞环境,学习绕过技巧。

二、工具:

火狐/谷歌浏览器
burpsuite

三、实验环境:

靶   机: windows10虚拟机:192.168.100.150
        phpstudy2018_Apache集成环境

远端服务器: windows10虚拟机:192.168.100.151(相当于攻击者的公网服务器)

攻 击 机: windows10物理机

四、环境准备:

1. 营造环境:

1、在靶机主目录下创建一个test_include目录


2、在靶机 test_include目录下创建一个index.php的文件:
代码内容:

<?php 
if(isset($_GET['page'])){
  include$_GET['page'].".php";
}else{
include'home.php'; 
}
?>

3、在test_include目录下创建一个home.php
代码内容:

<?php phpinfo();?>

4、在test_include目录下创建一个test.php:
代码内容:

<?php
echo "hello world";
?>

5、测试代码执行:
直接访问目录,可以看出它是包含了home.php文件的:

传输一个test,可以看到它已经包含了test.php
注:当我们使用GET方式传递一个文件名时,它会把后缀.php拼接上,如果存在这个文件,就成功包含,这样就显示文件内容了。


通过上面测试,说明代码可以正常执行,环境营造完成。

2. 设置phpstudy环境:

切换php版本

关闭magic_quotes_gpc函数,并重启phpstudy

五、实验过程:

1. 本地文件包含:

常见的敏感信息路径:
Windows系统:

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 配置文件
1.1 %00截断绕过:
1.1.1 原理:

验证源码:

<?php 
if(isset($_GET['page'])){       //判断通过GET方式有没有获取到这个文件;
  include$_GET['page'].".php";  //通过page传递这个文件的名字,不包括文件后缀名;如果传递一个test,代码拼接.php,如果当前目录下存在test.php,就包含test.php;
}else{
include'home.php';              //否则就包含home.php
}
?>

校验过程:判断是否获取到这个文件-->通过GET方式传递一个文件名,并在文件名后面拼接.php后缀-->如果当前目录下有这个文件,就包含这个文件-->否则就包含home.php
注:
  在低版本php读取文件名时认为%00终止符,对于%00后面的内容就会失效。
  通过上面源码我们知道,通过GET方式传递的这个文件名是我们可以进行控制的,在这里我们可以通过%00截断后面拼接的内容,让后面拼接的内容失效。

1.1.2 实验步骤:

1、制作一个图片马放到test_include目录下,这里的内容不是一句话木马,是phpinfo();代码:
内容:

<?php phpinfo();?>


2、对1.png进行包含,报错没有这个文件:


3、包含1.png,使用burpsuite对这个文件进行抓包:


4、在1.png后面加上%00,进行00截断,可以看出,成功解析图片马:

1.2 路径长度截断:
1.2.1 原理:

Windows目录最大长度256字节,超出的部分会被丢弃;
Linux目录最大长度4096字节,超出的部分会被丢弃。

1.2.2 实验步骤:

利用方法:

http://192.168.100.150/test_include/index.php?page=1.png/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

1、包含1.png,使用burpsuite对这个文件进行抓包:


2、使用长路进行截断,使后面拼接的内容失效,可以看出,成功解析图片马:

1.3 点号截断:
1.3.1 原理:

windows系统 点号 长于 256,超出的部分会被丢弃;
linux系统 点号 长于 4096,超出的部分会被丢弃;;

1.3.2 实验步骤:

利用方法:

http://192.168.100.150/test_include/index.php?page=1.png.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

1、包含1.png,使用burpsuite对这个文件进行抓包:

2、由于当前是windows环境,使用长于256个点号进行截断,使后面拼接的内容失效,可以看出,成功解析图片马:

1.4 双写绕过:

  如果在文件包含是,服务器对我们传入的参数是通过函数把关键字符替换为空的情况下,我们可以通过对关键字符进行双写进行绕过。
请参考文章

1.5 大小写混合绕过:

如果在文件包含是,服务器对我们传入的参数没有进行严格过滤,比如没没有对大小写进行过滤,我们可以使用大小写混合进行绕过。
请参考文章

1.6 伪协议绕过:

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
伪协议绕过详情点我!

2. 远程文件包含:

  PHP的配置文件allow_url_fopenallow_url_include设置为ONinclude/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。

allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)

2.1 问号绕过:

1、在我们远端服务器网站主目录创建一个1.txt文件:
内容:

<?php phpinfo();?>

2、远程包含我们远端服务器的1.txt文件,可以看出,靶机把1.txt后面拼接了.php后缀:

3、远程包含远端服务器的1.txt,在1.txt后面添加一个,可以看出靶机成功解析远端服务器的1.txtphp脚本文件:

2.2 #号绕过:

注:这里需要对#进行url编码,#的url编码%23

2.3 %00截断绕过:

2.4 其他绕过方式:

一些常见的特殊字符URL编码:

使用burpsuit对一些特殊字符跑一遍,看哪些字符可以:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值