1 概述
文件包含(Local File Include)是php脚本的一大特色,程序员们为了开发的方便,常常会用到包含。比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include fuction.php?>就可以调用内部定义的函数。
本地包含漏洞是PHP中一种典型的高危漏洞。由于程序员未对用户可控的变量进行输入检查,导致用户可以控制被包含的文件,成功利用时可以使web server会将特定文件当成php执行,从而导致用户可获取一定的服务器权限。
2 利用LFI执行PHP代码
2.1本地包含漏洞实例展示:
演示脚本文件test.php代码如下:
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
$f = $_GET["file"];
if ($f){
require "".$f.".php";
}else{
print("No File Included");
}
?>
在正常使用过程中,可能是这样子:http://www.xxx.com/test.php?f=fuction,这样子 就包含了function这个文件,但是由于file参数没有过滤,我们可以自己提交参数内容,这个时候就导致了包含漏洞的出现。比如提交 :
http://www.xxx.com/index.php?f=shell.txt%00,shell.txt的内容为我们的webshell,由于前面的是 index.php,所以会把shell.txt当成是木马执行。
在虚拟机搭建实例环境,
直接访问,不赋值file参数:
图1.不提交任何参数时的test.php
赋值file参数为/etc/passwd
图2.包含/etc/passwd文件
成功包含。
2.2自己上传文件并实现包含
这里主要是结合服务器一些文件上传点,比如头像上传、相册照片上传等,而后结合php的%00截断特性成功利用包含漏洞(php5.4之后已修复截断特性,本例中不再结合%00,其他请自己测试)。
假设我们可以自定义上传头像,头像文件在网站根目录的photo下,具体目录可以传上去之后查看图片Url信息。
首先,我们只做包含恶意代码的图片文件:
在windows下利用copy命令,shell.php为一句话木马(这里为了方便演示,我们用phpinfo