buuctf warmup

news2025/1/17 2:55:30

1.代码审计:
 

<?php
    highlight_file(__FILE__);
    class emmm                          //定义了一个类
    {
        public static function checkFile(&$page)          类里面又申明创建了一个函数
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //创建了一个白名单字典,在php当中字典就是一种具有映射关系的数组。
            if (! isset($page) || !is_string($page)) {    //如果没有设置page的值或者说page不是字符串,那么就return 为假
			
                echo "you can't see it";                    
                return false;
            }

            if (in_array($page, $whitelist)) {   //使用in_array函数,判断某个元素是否在数组当中,这里是字典的话,就是判断某个值是否在数组当中存在,注意,字典只会判断某个值
												//是否在字典当中存在,也就是说查找的是值,而不是键				
                return true;                     //返回真
            }

            $_page = mb_substr(              //mb_substr和substr的功能大致都是一致的,用来截取子串,但是mb有个特点就是,它可以指定字符编码,在处理非英文字符时会比较好
			                                 //substr(主串,start,length) ,start为开始下标,从0开始
                $page,
                0,
                mb_strpos($page . '?', '?')       //strpos用来查找指定字符在主串当中第一次出现的下标位置,strpos(主串,要查找的字符,可选参数,起始下标)
            );
            if (in_array($_page, $whitelist)) {
                return true;                     //返回真
            }

            $_page = urldecode($page);          //url解码之后的参数赋值给一个新的变量
            $_page = mb_substr(
                $_page,                       
                0,
                mb_strpos($_page . '?', '?')        // 先把原有的参数和?进行拼接,再查找?的序号
            );
            if (in_array($_page, $whitelist)) {       判断page的值是否在whilelist这个字典的值当中存在,注意是只查找值不是键
                return true;                       // return 真
            }
            echo "you can't see it";
            return false;                        //否则返回假
        }
    }

    if (! empty($_REQUEST['file'])                  //主题部分,通过file传递参数非空并且file的值为字符串并且对file调用上面类中的方法返回值为真
	                                               //这三个条件同时满足,才会进入到下一步
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];            //把传入的字符串进行文件包含,include函数会把一个文件包含进来并且执行就是说我们要传递的file是一个文件名或者说是服务器当中的一个文件路径更加准确,然后这里会把它
		//就是说我们要传递的file是一个文件名或者说是服务器当中的一个文件路径更加准确,然后这里会把它
         exit;								//进行包含进来。本题的关键就是在这里,就是通过传递文件名,进行文件包含,包含存在flag的文件,那么我们就可以得到flag了
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>   

2.逻辑分析

我们通过在get请求当中构造file参数,参数得是字符串,还要满足check函数,才会执行下面的内容,把文件给包含执行进来
根据提示 找到flag信息  但是直接访问不行 因为进入到check函数会执行到最后返回flase


所以说给的flag信息路径应该不是直接访问的,应该存在着某种相对路径

但是我们构造的路径当中还要包含白名单当中的内容才可以返回true
check函数有很多种可能会返回真值,所以要进行构造
但是直接拼接../../../不行 不满足true
所以在前面加上source试试还是不行,考虑他这里check函数会在尾部拼接问号,但是直接在尾部拼接问号在结合strpos和substr得到的还是原来的字符串
每一个if都会判断是不是在白名单当中,必须要在白名单当中才会返回true ,又因为他有strpos函数去定位?的位置再去截取之后再判断
所以我们可以构造一个? 使得它在被截取之后是白名单的内容
所以 尝试自己构造问号  source.php?../../ffffllllaaaagggg

这样的话再执行check函数的时候
这里可以返回true

3.总结分析

涉及到的代码审计,而且比较考验思维,还有就是要熟悉php的常见函数

4.分析记录

 <?php
    highlight_file(__FILE__);
    class emmm                          //定义了一个类
    {
        public static function checkFile(&$page)          类里面又申明创建了一个函数
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //创建了一个白名单字典,在php当中字典就是一种具有映射关系的数组。
            if (! isset($page) || !is_string($page)) {    //如果没有设置page的值或者说page不是字符串,那么就return 为假
            
                echo "you can't see it";                    
                return false;
            }

            if (in_array($page, $whitelist)) {   //使用in_array函数,判断某个元素是否在数组当中,这里是字典的话,就是判断某个值是否在数组当中存在,注意,字典只会判断某个值
                                                //是否在字典当中存在,也就是说查找的是值,而不是键                
                return true;                     //返回真
            }

            $_page = mb_substr(              //mb_substr和substr的功能大致都是一致的,用来截取子串,但是mb有个特点就是,它可以指定字符编码,在处理非英文字符时会比较好
                                             //substr(主串,start,length) ,start为开始下标,从0开始
                $page,
                0,
                mb_strpos($page . '?', '?')       //strpos用来查找指定字符在主串当中第一次出现的下标位置,strpos(主串,要查找的字符,可选参数,起始下标)
            );
            if (in_array($_page, $whitelist)) {
                return true;                     //返回真
            }

            $_page = urldecode($page);          //url解码之后的参数赋值给一个新的变量
            $_page = mb_substr(
                $_page,                       
                0,
                mb_strpos($_page . '?', '?')        // 先把原有的参数和?进行拼接,再查找?的序号
            );
            if (in_array($_page, $whitelist)) {       判断page的值是否在whilelist这个字典的值当中存在,注意是只查找值不是键
                return true;                       // return 真
            }
            echo "you can't see it";
            return false;                        //否则返回假
        }
    }

    if (! empty($_REQUEST['file'])                  //主题部分,通过file传递参数非空并且file的值为字符串并且对file调用上面类中的方法返回值为真
                                                   //这三个条件同时满足,才会进入到下一步
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];            //把传入的字符串进行文件包含,include函数会把一个文件包含进来并且执行就是说我们要传递的file是一个文件名或者说是服务器当中的一个文件路径更加准确,然后这里会把它
        //就是说我们要传递的file是一个文件名或者说是服务器当中的一个文件路径更加准确,然后这里会把它
         exit;                                //进行包含进来。本题的关键就是在这里,就是通过传递文件名,进行文件包含,包含存在flag的文件,那么我们就可以得到flag了
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装汇春MDTIDE以及HI-TECH PICCv9.83(PICC语言编译器)

最近了解了汇春一款8位通用型MCU----MDT10F684&#xff0c;所以这里安装一下IDE以及配置一下环境。 1.安装汇春MDTIDE 去到官网下载对应的开发包&#xff0c;我不知道里面内容是否一致。 Flash/MTP MCU (yspringtech.com) 不要点说明书下载&#xff0c;点了没反应&#xff0…

借助ChatGPT提高编程效率指南

PS: ChatGPT无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 一、借助ChatGPT提高编程效率指南 随着计算机技术的飞速发展&#xff0c;编程已经成为了现代社会中一个非常重要的技能。对于许多人来说&#xff0c;编程不仅是一项工作技能&#xff0c;而且是…

docker之自己制作jdk镜像

一&#xff0c;下载想要制作的镜像的对应jdk&#xff08;自行下载&#xff09;&#xff0c;本文使用jdk17&#xff08;因为自己的springboot项目时在jdk17下开发的&#xff0c;悲&#xff01;&#xff01;&#xff01;&#xff0c;再加上没有在官网上找到对应镜像&#xff0c;只…

ubuntu22.04 在wifi网络正常使用的情况下创建热点连接

ubuntu22.04 在wifi网络正常使用的情况下创建热点连接 在ubuntu22.04版本中正常通过设置打开wifi热点会取消正常的wifi网络连接 接下来让我们一起尝试在wifi网络正常的情况下创建热点连接 查看硬件是否支持 iw list | grep AP #查看是否支持AP模式 Device supports AP-side…

小米官网登录注册的滑动效果

小米官网登录注册的滑动效果 登录组成页面 <div class"client"><div class"userbox"><div class"title"><a href"javascript:;" class"active" id"DL">登录</a><a href&quo…

250+可用的 AI 资源网站

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 这里是关于AI网站的一份资源列表。欢迎访问该链…

message: apoc.meta.data is unavailable

报错内容 Traceback (most recent call last):File "/langchain-master/templates/neo4j-semantic-ollama/ingest.py", line 9, in <module>graph Neo4jGraph()File "/root/anaconda3/envs/sakura/lib/python3.9/site-packages/langchain_community/gra…

智慧农业新篇章:DSSAT模型、APSIM模型、WOFOST与PCSE模型综合应用,引领作物生长模拟与产量预测新潮流

目录 ★WOFOST模型与PCSE模型应用 ★基于R语言APSIM模型进阶应用与参数优化、批量模拟 ★最新DSSAT作物模型建模方法及应用 ★基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用 ★R语言与作物模型&#xff08;以DSSAT模型为例&#xff09;融合应用 ★遥感数据与…

酷开科技以消费者需求为导向冲刺OTT行业的星辰大海

通过大屏营销、互动营销等方式&#xff0c;提升品牌认知度和市场竞争力。酷开科技始终坚持以消费者的需求为导向&#xff0c;致力于为品牌方和消费者搭建高效、准确的沟通桥梁&#xff0c;开创OTT大屏营销新纪元。 伴随技术发展&#xff0c;智能电视已经从“尝鲜”变成了主流产…

C# Web自动化--Selenium入门

安装依赖库 需要引用的核心库是Selenium.RC&#xff0c;Selenium.Support&#xff0c;Selenium.WebDriver 然后再需要引用 浏览器驱动库&#xff0c;这里我以IE浏览器为例&#xff0c;Chrome使用方式跟IE是一样的&#xff0c;程序包名称为Selenium.WebDriver.ChromeDriver。 …

静电ESD整改:原因、影响与解决方案详解?|深圳比创达电子

静电&#xff08;ESD&#xff09;是在日常生活和工作中常见的现象&#xff0c;但它可能对电子设备和器件造成严重的损坏。本文将介绍静电ESD的定义、原因、影响以及解决方案&#xff0c;帮助大家更好地了解ESD问题&#xff0c;并采取相应的整改措施。 一、静电ESD的定义 静电…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Linux操作系统】:Linux进程概念(2)

一、Z(zombie)-僵尸进程 1.僵尸进程概念 故事 张三每天都有跑步的习惯&#xff0c;这一天他和往常一样跑步&#xff0c;跑了两三圈&#xff0c;突然跑在它前面的一个人倒在地上不动了&#xff0c;作为热心市民张三赶紧报警并且拨打120。很快120就来了&#xff0c;但是没过几分…

Docker单机下的容器网络管理

Docker容器网络管理 容器网络类型 Docker安装以后&#xff0c;会在我们的主机上创建三个网络 docker network ls可以看到有bridge、host和none三种网络类型 我们先把ubuntu的网络环境配置一下 docker run -it ubuntu apt update apt install net-tools iputils-ping curl这…

移速u盘怎么恢复彻底删除的文件,移速u盘彻底删除的文件如何恢复

移速u盘怎么恢复彻底删除的文件&#xff1f;在日常使用中&#xff0c;我们经常会遇到需要删除U盘中的文件的情况。然而&#xff0c;有时候我们可能会不小心将重要的文件彻底删除&#xff0c;导致数据的丢失。对于移速U盘用户来说&#xff0c;如何恢复彻底删除的文件成为了一个备…

江科大stm32学习笔记——【6-1】TIM定时中断

一.定时器 1.类型 STM32F103C8T6定时器资源&#xff1a;TIM1,TIM2,TIM3,TIM4 我们这次用通用定时器 2.基本定时器 预分频器对来自RCC_TIMxCLK的72MHz进行预分频&#xff0c;比如写0就是不分频或1分频&#xff0c;输出频率输入频率72MHz。写1就是2分频&#xff0c;输出频率输…

Java复习01 集合概念

Java复习01 集合 在Java中&#xff0c;集合&#xff08;Collections&#xff09;是一种用来存储一组对象的结构。想象一下有一个装东西的箱子&#xff0c;这个箱子可以装很多不同类型的东西&#xff0c;例如书、DVD或者玩具。Java的集合也是这样&#xff0c;但是它专门用来装载…

如何利用工业以太网关实现上位机无线远程控制多台plc通讯?

组态软件与西门子S7系列PLC及三菱PLC间的无线通信测试需要用到以下设备&#xff1a; l 西门子PLC型号&#xff1a;S7-200Smart 2台 l 三菱PLC型号&#xff1a;FX5U 2台 l 上位机&#xff1a;力控V7.1 1台 l 无线通讯终端&#xff08;网口版&#xff09;——DTD418MB 3块…

群控软件代理,群控服务器配置要求

目录 前言 硬件要求 操作系统要求 代理软件要求 网络要求 1. 在群控服务器上安装Shadowsocks软件 2. 配置本地代理软件 3. 配置浏览器代理 前言 群控软件代理是指在进行群控活动时&#xff0c;利用代理服务器来隐藏真实的IP地址&#xff0c;以保护个人隐私或绕过一些网…

概率与常见的概率分布

概率是数据分析、机器学习中最基础的知识。也是在生活中最实用的一门学科&#xff0c;学了很多大道理不一定能过好一生&#xff0c;学好概率则有一定概率会变得更好。为大概率坚持&#xff0c;为小概率备份。 概率与分布 要想了解概率&#xff0c;首先得搞清楚概率和概率分布的…