文件包含漏洞
在php开发中程序员一般为了方便直接调用一些文件的代码会使用文件包含,如果这个时候把要被包含的文件使用一个变量名控制不做任何过滤就会造成文件包含漏洞
include(filename)这个函数只有到要执行的时候才会包含如果文件不存在,则会发出警告继续执行
require()只要程序一运行就包含,如果文件名不存在直接报错不在执行
include_once()和require_once();若文件代码已被包含则不再包含
代码分析
<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "fi_local.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','',
'active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR . 'header.php';
$html='';
if(isset($_GET['submit']) && $_GET['filename']!=null){
$filename=$_GET['filename'];
include "include/$filename";//变量传进来直接包含,没做任何的安全限制
// //安全的写法,使用白名单,严格指定包含的文件名
// if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){
// include "include/$filename";
// }
}
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="fileinclude.php">file include</a>
</li>
<li class="active">本地文件包含</li>
</ul><!-- /.breadcrumb -->
<a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
data-content="先了解一下include()函数的用法吧">
点一下提示~
</a>
</div>
<div class="page-content">
<div id=fi_main>
<p class="fi_title">which NBA player do you like?</p>
<form method="get">
<select name="filename">
<option value="">--------------</option>
<option value="file1.php">Kobe bryant</option>
<option value="file2.php">Allen Iverson</option>
<option value="file3.php">Kevin Durant</option>
<option value="file4.php">Tracy McGrady</option>
<option value="file5.php">Ray Allen</option>
</select>
<input class="sub" type="submit" name="submit" />
</form>
<?php echo $html;?>
</div>
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>
可以看到直接将filename用include进行包含没做任何过滤
测试漏洞是否存在,由于这里是ubantu系统我们可以包含/etc/passwd文件,由于这个文件没有php代码会直接将信息显示出来的
http://192.168.159.128/06/vul/fileinclude/fi_local.php?filename=…/…/…/…/…/…/…/etc/passwd&submit=%E6%8F%90%E4%BA%A4
这里的…/是翻阅到上一级目录由于我们现在的目录是/var/www/html/06/vul/fileinclude,需要先跳到/目录下
利用文件包含getshell
我们可以写入一句话的恶意代码到图片里面在包含这张图片就可以执行里面的代码
可以用nopd++来打开文件把代码复制进去
成功包含图片