首页 > 其他分享 >Web_XCTF/BUUCTF_WriteUp | warmup

Web_XCTF/BUUCTF_WriteUp | warmup

时间:2023-12-07 11:23:29浏览次数:32  
标签:Web BUUCTF page include PHP file 字符串 php XCTF

题目

分析

F12 查看源码,发现注释 <!--source.php-->,作为参数接入 url 提交,得到 php 代码:

稍做分析:

 <?php
    highlight_file(__FILE__);    // 对当前文件进行 PHP 语法高亮显示
    class emmm                   // 构造类emmm
    {
        public static function checkFile(&$page)  // 建立公有静态函数checkFile,参数引用变量page
        {
            // whitelist数组source的元素赋为字符串source.php,hint的元素赋为字符串hint.php
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];

            // 如果page变量未设置或page变量不是字符串
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";  // 输出you can't see it
                return false;             // 返回false
            }

            // 如果page变量的值在数组whitelist中
            if (in_array($page, $whitelist)) {
                return true;              // 返回true
            }

            // 将page字符串中第一个“?”前的子串赋给_page
            $_page = mb_substr(                                        
                $page,                       // 原字符串
                0,                           // 开始位置下标
                mb_strpos($page . '?', '?')  // 在page变量字符串后连接“?”,返回“?”在字符串page中第一次出现的位置,作为mb_substr函数的提取长度
            );

            // 如果_page变量的值在数组whitelist中
            if (in_array($_page, $whitelist)) {                        
                return true;               // 返回true
            }

            $_page = urldecode($page);     // 对page变量的值进行url解码赋给_page变量

            // 将_page字符串中第一个“?”前的子串赋给_page
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );

            // 如果_page变量的值在数组whitelist中
            if (in_array($_page, $whitelist)) {
                return true;               // 返回true
            }
            echo "you can't see it";  // 输出you can't see it
            return false;             // 返回false
        }
    }

    if (! empty($_REQUEST['file'])             // 如果以get或post请求得到file值
        && is_string($_REQUEST['file'])        // 且以get或post请求得到的file值是字符串
        && emmm::checkFile($_REQUEST['file'])  // 且向emmm类中的checkFile函数传递由get或post表单得到的file参数并返回true
    ) {
        include $_REQUEST['file'];  // 包含file的值
        exit;                       // 退出脚本
    } else {                                   // 否则
        // 输出滑稽图片
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>


看到 include 函数,猜测是文件包含漏洞。包含条件是 file 值存在且为字符串,同时 file 值限定为以下四种可能:

  1. source.php
  2. xxx?source.php(xxx为任意长度不带 “?” 符号的字符串)
  3. hint.php
  4. xxx?hint.php(xxx为任意长度不带 “?” 符号的字符串)

这种情况或许可以通过对 “?” 符号后的字符串进行一些操作。


先看看 hint.php 文件:

ffffllllaaaagggg 可能是 flag 的文件名。


PHP 文档对 include 函数的文件查找路线解释为:“被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条 E_WARNING”


根据 file 的要求和 flag 文件名构造 url,在第五级父目录找到 flag:

payload:?file=source.php?../../../../../ffffllllaaaagggg,其中 source.php 仅用于通过函数 checkFile 的过滤,更换为 hint.php 同样可通过。

Flag

XCTF:flag{25e7bce6005c4e0c983fb97297ac6e5a}
BUUCTF:flag{427773f9-b1a6-49b1-8402-97ad11968d2d}

参考

PHP 代码审计-CTF Wiki
PHP 教程-菜鸟教程
php class类的用法详细总结-左正-博客园
PHP之static静态变量详解-心雨星空-博客园
PHP中private、public、protected的区别详解-周伯通之草堂-博客园
php中引用符号(&)的使用详细介绍-梦入烟城-CSDN
mb_strpos (Encoding)-PHP 中文开发手册-开发者手册-腾讯云开发者社区
php 中 \$_GET、\$_POST 和 $_REQUEST 的区别?
PHP 类与对象 —— 范围解析操作符(::)-终毅衝-CSDN
PHP_ include-Manual
Linux基础命令之cd返回上级目录/返回根目录/进目录/返回上一次目录/返回指定目录-Soinice-CSDN

标签:Web,BUUCTF,page,include,PHP,file,字符串,php,XCTF
From: https://www.cnblogs.com/Guanz/p/17880385.html

相关文章

  • 渐进式web全栈:blazor web app
    前言本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.jsnuxt.js;blazor还有很多其它内容,本文近关注渐进式开发模式。是的,前后端是主流,不过以下情况也许前后端分离并不是最好的选择:小公司,人员不多,利润不高,创业阶段能省则省个人开发者,接接私活,要么一......
  • Amazon WorkSpaces 推出 Amazon WorkSpaces Web
    今天,我们宣布全面推出AmazonWorkSpacesWeb。WorkSpacesWeb是我们的最终用户计算套件中的一项新功能,它是一项低成本的完全托管式WorkSpace,专用于辅助基于Web的安全工作负载。WorkSpacesWeb使得客户能够轻松、安全地为其员工提供对内部网站和软件即服务Web应用程序的访......
  • Amazon WorkSpaces 现在提供使用 WorkSpaces 流协议(WSP)的 Web Access
    企业一直需要找到相应的方案,以快速让用户从任何地点和任何计算机进行工作,同时保证安全性和生产力。为了使用WorkSpaces流协议(WSP)简化AmazonWorkSpaces的部署,同时无需安装原生的客户端应用程序,用户现在可以在Windows、macOS或Linux计算机上通过受支持的Web浏览器访问A......
  • SharePoint 的 Web Parts 是什么
    WebParts可以说是微软SharePoint的基础组件。根据微软自己的描述,WebParts是SharePoint对内容进行构建的基础,可以想想成一块一块的砖块。我们需要使用这些砖块来完成一个页面的构建。我们可以利用WebParts在SharePoint中添加文本,图片,文件,视频,甚至是动态内容。添加Web......
  • 如何在Web应用中添加一个JavaScript Excel查看器
    前言在现代的Web应用开发中,Excel文件的处理和展示是一项常见的需求。为了提供更好的用户体验和功能,经常需要在Web应用中添加一个JavaScriptExcel查看器,小编今天将为大家展示如何借助葡萄城公司的纯前端表格控件——SpreadJS来创建一个Excel查看器。项目结构本项目将由三个文件......
  • ctfshow-web入门-信息收集
    Web1:​ Ctrl+U或者F12查看页面源代码.Web2:​ JS禁用F12,Ctrl+U查看源代码Web3:​ 前端未泄露,抓包查看返回包发现FlagWeb4:​ robots.txt文件泄露Web5:​ phps源码泄露,phps存放着php源码,可通过尝试访问/index.phps读取,或者尝试扫描工具扫描读取phps即为PHPSource。......
  • 【SpringBootWeb入门-6】请求响应-请求参数-数组集合参数&Json参数&路径参数
    这篇我们接着上一篇的请求参数来讲解另外几个常见参数的接收以及封装:数组集合参数、Json参数、路径参数。数组集合参数1、数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数在Postman接口测试新建测试,获取请求数组参数type。然后新建参数处......
  • 如何从Webpack迁移到Vite
    本文将介绍如何将前端web应用程序从Webpack升级到Vite。Vite是最新的前端开发工具,其受欢迎程度和采用率都在大幅增长。可以查看下图中来自npmtrends的下载。推动这一趋势的是Vite核心的一个关键概念:开发人员体验。与Webpack相比,Vite在开发过程中能显著缩短构建时......
  • buuctf 加固题 babypython WriteUp
    原题wp参考链接:https://www.cnblogs.com/karsa/p/13529769.html这是CISCN2021总决赛的题,解题思路是软链接zip读取文件,然后伪造admin的session读取flag回到buuctf的这个题:ssh连上去,查看文件/app/y0u_found_it/y0u_found_it_main.py关键代码:random.seed(uuid.getnode())a......
  • Web开发学习HTTP协议、通过浏览器控制台学习HTTP协议。
    @目录HTTP协议1.HTTP协议是什么?2.HTTP协议的特点3.什么是URL?4.通过浏览器控制台学习HTTP协议RequestHeaders请求数据格式说明ResponseHeaders请求数据格式说明5.HTTP工作原理HTTP协议1.HTTP协议是什么?HTTP协议是一种超文本传输协议,规定了浏览器和服务器之间的数据传输的规则......