文章目录
一、实验目的:
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_fopen
和allow_url_include
设置为ON
,include/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.txt
为php脚本
文件:
2.2 #号绕过:
注:这里需要对#
进行url编码
,#的url编码
为%23
2.3 %00截断
绕过:
2.4 其他绕过方式:
一些常见的特殊字符URL编码:
使用burpsuit对一些特殊字符跑一遍,看哪些字符可以: