##解题思路
场景首页没有什么提示,只有个flag在flag.php中,而且需要更改language,还有个index.php的路径,先记住它
习惯性查看源代码,得到了题目真正的内容,关键在于lan变量读取我们传入的Cookie值中的language变量内容,然后进行包含,我们只需要让lan的值为flag即可
<?php
// 如果 PHP 配置中未启用错误显示,则启用它
if (!ini_get('display_errors')) {ini_set('display_errors', 'On'); // 设置 display_errors 为 On,显示错误信息
}
// 设置错误报告级别为 E_ALL,显示所有类型的错误
error_reporting(E_ALL);
// 获取用户 Cookie 中的 "language" 值
$lan = $_COOKIE['language'];
// 检查是否存在 "language" Cookie
if (!$lan) {// 如果没有设置 "language" Cookie,则设置默认语言为 "english"@setcookie("language", "english"); // 使用 setcookie() 设置 Cookie,@用于抑制可能的警告@include("english.php"); // 包含并执行 english.php 文件,@用于抑制可能的警告
} else {// 如果存在 "language" Cookie,则根据其值动态包含对应的文件@include($lan . ".php"); // 动态包含 $lan 对应的语言文件,例如 "french.php" 或 "spanish.php"
}
// 读取当前文件(index.php)的内容
$x = file_get_contents('index.php');
// 输出当前文件的内容
echo $x;
?>
根据文件包含和php伪代码的知识,我们可以很轻易编写一段payload
PHP: php:// - Manual
language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
最终得到一串base64加密过后的源代码
得到flag