本题是一个文件包含漏洞的题。
进入网站可以看到下面有它的源码,下面来分析一下
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On'); // 设置错误信息显示
}
error_reporting(E_ALL);
$lan = $_COOKIE['language']; // 获取报文的cookie值,cookie叫做language,并把值赋给lan
if(!$lan)// 如果lan不为0就执行下面的代码
{
@setcookie("language","english");// 发送键值对为language=english的cookie
@include("english.php");//包含文件english.php
}
else//反之,包含$lan.php的文件
{
@include($lan.".php");
}
$x=file_get_contents('index.php');//获取index.php的内容,并赋值给x
echo $x;//输出index.php的内容
?>
所以,要想得到flag就需要找到flag.php文件,也就是满足第二个判定条件,而这里存在文件包含漏洞。
下面需要使用brupsuite进行抓包,看看包里是否含有cookie。
可以看到包中不含有cookie,这就需要我们自己设置cookie值。将包转发到repeater中,设置一个cookie。
cookie的名字为language
值为php://filter/read=convert.base64-encode/resource=/var/www/html/flag
php://是PHP伪协议用于访问输入/输出流
php://filter用于读取源码,其有四个参数
参数 | 描述 |
resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 |
read=<读链的过滤器> | 该参数可选。可以设定一个或多个过滤器名称,以 管道符(|)分隔。 |
write=<写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以 管道符(|)分隔。 |
<;两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 |
convert.base64-encode/convert.base64-decode是转换过滤器属于read的参数,相当于base64_encode()和 base64_decode(),作用是base64 编码解码。
参考官方文件:PHP: php:// - Manual
添加好cookie就可以发送了
这一串就是经过base64编码过的flag,复制下来到decoder模块进行解密就能得到flag了