【攻防世界】网络安全学习180天之 fileclude NO.GFSJ1010

fileclude

    • 一. 题目界面
    • 二. 本人思路
    • 三. 总结

作者:冰耿
作者其他详细专栏
CTF系统学习专栏https://blog.csdn.net/bing_geng/category_12496105.html
Python爬虫学习专栏https://blog.csdn.net/bing_geng/category_12494819.html

*前言: 如果有疑问或者错误欢迎在评论区或私信交流!!

难度:1
方向:Web
题目描述:好多file呀!

一. 题目界面

在这里插入图片描述

二. 本人思路

  1. 首先看到的是一串php代码,查看源代码发现也没什么线索。
    直接访问 flag.php 的话是提示wrong way的,所以肯定是配合include(&file)包含用php://filter编码读取flag.php的数据了,我们先看看我的思路如下。
    在这里插入图片描述
  2. 第二步,逐句解释首页显示的php代码含义
<?php
// 包含 flag.php 文件
include("flag.php");

// 显示当前脚本的源代码
highlight_file(__FILE__);

// 处理文件包含逻辑
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
    $file1 = $_GET["file1"];
    $file2 = $_GET["file2"];

    // 检查 file1 和 file2 是否非空
    if(!empty($file1) && !empty($file2))
    {
        // 检查 file2 文件的内容是否为 "hello ctf"
        if(file_get_contents($file2) === "hello ctf")
        {
            // 如果条件满足,则包含 file1 文件
            include($file1);
        }
    }
    else
        die("NONONO");
}
?>

详细的解释就是:include(“flag.php”);: 包含名为 flag.php 的文件,显示了一个名为 flag 的变量或常量,可能包含着敏感信息。

highlight_file(FILE);: 显示当前脚本的源代码,这在代码审计中可能有一些信息泄露的风险。

处理文件包含逻辑:

if(isset(KaTeX parse error: Expected 'EOF', got '&' at position 16: _GET["file1"]) &̲& isset(_GET[“file2”])): 检查是否存在 GET 请求参数 file1 和 file2。
$file1 = $_GET[“file1”]; $file2 = G E T [ " f i l e 2 " ] ; : 获 取 f i l e 1 和 f i l e 2 的 值 。 i f ( ! e m p t y ( _GET["file2"];: 获取 file1 和 file2 的值。 if(!empty( GET["file2"];:file1file2if(!empty(file1) && !empty($file2)): 检查 file1 和 file2 是否非空。

if(file_get_contents($file2) === “hello ctf”): 检查 file2 的内容是否为 “hello ctf”

include($file1);: 如果以上条件都满足,就包含 file1 文件,存在文件包含漏洞。

else die(“NONONO”);: 如果条件不满足,输出 “NONONO” 并终止脚本。

  1. 根据php代码描述的,尝试把file1设置为flag,把file2设置为hello ctf,则显示如下界面,提示没有这个文件路径,文件流打不开,因为确实没有hello ctf 这个文件,所以我们首先要自己创造一个!!
    在这里插入图片描述
  2. 在代码里面看到了 file_get_contents 这个函数,file_get_contents 是一个用于读取整个文件内容的函数
file_get_contents(string $filename, bool $use_include_path = false, resource $context = null, int $offset = 0, int $length = 0): string|false

所以直接file2=hello%20ctf不行的,因为服务器就没有这个文件,所以这里就需要用到 data:// 协议构造数据流,使它当作php文件。下面简单讲讲 怎么传递参数才可以构造内容,这里file2传递的参数是
?file2=data://text,plain,hello ctf

在给定的URL中,file2=data://text/plain,hello%20ctf 部分使用了 data 协议。data 协议允许直接在 URL 中包含数据,而不是引用外部资源。

具体解释:

data://: 表示使用 data 协议。
text/plain: 表示数据的 MIME 类型,这里是纯文本。
hello%20ctf: 是经过 URL 编码的文本,解码后为 "hello ctf"

简单来说这样子构造后,file2=data://text/plain,hello%20ctf 的意思是将 “hello ctf” 这个字符串作为纯文本数据传递给 file2 参数,file2就会包含这个数据。

  1. 那是不是file2设置好后,就可以 file1=flag.php 直接获取到flag值了呢?结果如下:
    在这里插入图片描述
    提示wrong way,读取的方法还是不对。

  2. 这里就要用到了 php://filter
    php://filter 是 PHP 中的一种流过滤器,它允许在文件读取时对数据进行一些处理
    我们令file1的参数设置为
    file1=php://filter/read=convert.base64-encode/resource=flag.php

convert.base64-encode 过滤器将 flag.php 的内容转换为 Base64 编码的形式。这个 URL 的设计是为了尝试读取 flag.php 文件的内容,并以 Base64 编码的形式传递给 file1 参数。

  1. 所以当参数为**?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain,hello%20ctf**,时,即可读出flag值的base64编码值。
    在这里插入图片描述
    在这里插入图片描述

三. 总结

  1. 首先考察了php://filter,其次考察了data://
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值