Bootstrap

5.攻防世界 fileinclude

进入题目页面如下

提示flag在flag.php

ctrl+u,查看源码

给出了一段PHP代码,进行代码审计

<?php
// 检查是否开启了错误显示功能
if( !ini_get('display_errors') ) {
    // 如果没有开启,则将错误显示功能设置为开启状态
    ini_set('display_errors', 'On');
}

// 设置错误报告级别为显示所有类型的错误
error_reporting(E_ALL);

// 从客户端的 Cookie 中获取名为 'language' 的值,并赋值给变量 $lan
$lan = $_COOKIE['language'];

// 检查 $lan 是否为空
if(!$lan) {
    // 如果为空,设置一个名为 'language' 的 Cookie,值为 'english'
    @setcookie("language","english");
    // 包含名为 'english.php' 的文件
    @include("english.php");
} else {
    // 如果不为空,将 $lan 的值加上 '.php' 后缀后,包含对应的文件
    @include($lan.".php");
}

// 读取当前文件 'index.php' 的内容,并将其赋值给变量 $x
$x = file_get_contents('index.php');

// 输出变量 $x 的内容,即显示当前文件的源代码
echo $x;
文件包含漏洞

代码中使用 include 函数包含文件,而 $lan 变量的值直接取自用户的 Cookie。可以通过修改 Cookie 中的 language 值,来包含任意文件,从而导致文件包含漏洞。

代码没有对 $lan 变量的值进行任何验证和过滤,可以构造特殊的文件名来绕过正常的文件包含逻辑,执行恶意代码或获取敏感信息。

 构造恶意 Cookie

修改 Cookie 中的 language 值为 flag。当请求该页面时,服务器会尝试包含 flag.php 文件,从而将 flag 的内容输出到页面上

Cookie: language=php://filter/read=convert.base64-encode/resource=flag

 利用 PHP 伪协议来绕过常规的文件包含限制并获取敏感文件

 使用 php://filter 伪协议对文件内容进行 Base64 编码后输出,避免因文件内容格式问题(如二进制文件)导致显示异常,同时绕过部分简单的过滤机制。

read=convert.base64-encode

是 php://filter 伪协议的一个过滤器,指定了读取文件内容时要进行的操作。convert.base64-encode 表示将文件内容进行 Base64 编码,文件内容就会以 Base64 字符串的形式输出,方便在网页上显示和后续解码。

resource 是 php://filter 伪协议中用于指定要操作的文件资源的参数

用burp suite抓包,修改cookie

得到base64编码的flag可以利用下面这个在线工具解码

Base64解码 Base64编码 UTF8 GB2312 UTF16 GBK 二进制 十六进制 解密 - The X 在线工具

最终得到flag

cyberpeace{94027b50fe68bcb6ff13855e5cb60024}

;