基础知识
1、文件包含简述
文件包含,就是为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
为什么文件包含会形成漏洞呢?是因为在包含文件时候,为了灵活使用包含文件的功能,程序员会将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值可控而服务器端未对变量值进行合理地校验或者校验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
以下是几个关于PHP文件包含的函数:
include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
进来,发生错误时之给出一个警告,继续向下执行。
include_once( )
功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require( )
require()与 include()的区别在于 require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。
require_once( )
功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。
2、PhpStorm文件夹
phpstorm新建项目会生成.idea文件夹,打开里面有workspace.xml,这个.idea文件夹类似于这个项目的根目录文件,里面包含了一些xml文件(配置)。这个是可以删掉,但是会自动重新生成。
解题思路
1、题目分析
题目只给了一个图片,先查看源代码,会发现一些端倪,然后发现是文件包含,进去把index.php读出来, 根据 Created by PhpStorm
这个提示,我们查看workspace.xml,发现fl3g_ichunqiu.php,根据代码,用config代替“_”,然后又得到一串代码,这时候就需要认真读代码,爆破key,再爆破flag。
2、求解
根据题目给出的图片,先查看一下源代码,?jpg=hei.jpg
的内容:
猜测是文件包含,那么我们看看能否将传入的jpg=flag.php爆破出flag:
发现不行,源代码和传入的hei.jpg是一样的,那么我们试试传入index.php:
发现成功了,传入index.php会出现base64编码的内容,解码出来看看:
<?php
/**
* Created by PhpStorm.
* Date: 2015/11/16
* Time: 1:31
*/
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64,".$txt."'></img>";
/*
* Can you find the flag file?
*
*/
?>
发现是一个php的代码,然后我们到网上查到资料,Created by PhpStorm这句代码是重点之一:phpstorm新建项目会生成.idea文件夹,打开里面有workspace.xml,访问一下 url/.idea/workspace.xml
:
发现里面有一个fl3g_ichunqiu.php,很像答案的flag,这次我们传入这个看看:
发现绕过了,再重新回去看php那段代码发现:$file = str_replace("config","_", $file);
Config会被’_’取代,那么重新构造payload index.php?jpg=fl3gconfigichuqiu.php
发现页面源代码: