[GXYCTF2019]禁止套娃1

buu打开题目进去看到,只有一行字

只有一行字的话,那么没有可用的信息,那么可以去查看一下源码或者是看一下network里是不是有一些提示,发现都没有,那就利用dirsearch去扫描一下目录

python dirsearch.py -u http://f8716353-f295-45aa-8f8a-d45e2e09ec3c.node5.buuoj.cn:81/

 当我们利用dirsearch去扫描目录时,我们发现是存在git信息泄露的,那么接着利用GitHack工具去得到泄露的文件

python GitHack.py http://f8716353-f295-45aa-8f8a-d45e2e09ec3c.node5.buuoj.cn:81/.git

得到的index.php文件代码如下:

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

根据index.php可以看到有三层过滤,第一层if就是简单正则匹配,也就是GET传入的exp中不能存在data:   filter:   php:   phar:  也就是说利用php伪协议这条路应该是不通了。

再来看第二层if,先来解释一下preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])

这部分代码的作用是对传入的exp参数进行正则匹配和替换操作,以确保该参数只包含函数调用,并且这些函数调用的结果最终等于一个分号(;)。具体来说,它使用正则表达式来检测并替换所有符合特定格式的函数调用,然后检查剩余的字符串是否等于分号。

正则表达式解释

preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])

/[a-z,_]+\((?R)?\)/:
[a-z,_]+:匹配一个或多个小写字母、下划线或逗号。
\(:匹配一个左括号(。
(?R)?:递归匹配自身。这里是一个复杂的正则表达式,用于匹配嵌套的括号。(?R)表示递归调用正则表达式本身,用于匹配嵌套的函数调用。
\):匹配一个右括号)。
正则表达式的作用是匹配像func1(func2())这样的嵌套函数调用。

preg_replace解释

preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])

preg_replace函数用来将匹配到的部分替换为NULL,即删除匹配到的部分。它会删除所有符合正则表达式的函数调用。

判断是否仅剩分号

if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))

这行代码的逻辑如下:

使用正则表达式/[a-z,_]+\((?R)?\)/匹配并删除$_GET['exp']中的所有函数调用。
检查删除后的结果是否等于一个分号';'。

示例
让我们看一些示例来更好地理解这个逻辑:

输入

$_GET['exp'] = 'foo();'

正则表达式匹配并删除foo();,剩下的字符串是';'。
检查';' === ';',条件为真。
输入

$_GET['exp'] = 'foo(bar());'

正则表达式匹配并删除foo(bar());,剩下的字符串是';'。
检查';' === ';',条件为真。
输入

$_GET['exp'] = 'foo();bar();'

正则表达式匹配并删除foo();,剩下的字符串是'bar();'。
正则表达式再次匹配并删除bar();,剩下的字符串是''。
检查'' === ';',条件为假。

需要注意的是preg_replace函数只是用于检查条件,并不改变实际传入的参数$_GET['exp'],所以下面的@eval($_GET['exp']);还是可以去执行传入的参数的

我们可以去借助php内置的一些函数来实现读取flag.php,下面是payload需要用到的php函数:

localeconv():

这个函数返回一个数组,包含当前区域设置中与数字格式化相关的信息。例如,千位分隔符,小数点符号等。
current():

这个函数返回数组中的当前元素。默认情况下,如果没有先前调用过next()、prev()、reset()等函数,current()返回数组的第一个元素。
在这里,它会返回localeconv()返回的数组的第一个元素。
scandir():

这个函数列出指定目录中的文件和目录。
如果传递的参数是一个有效目录路径,它将返回该目录下的文件和目录列表。

next():

将数组的内部指针向前移动一位,并返回移动后的当前元素。

print_r():

这个函数输出信息,以便于阅读。它可以打印数组和对象的详细结构。

highlight_file():

输出指定文件的内容,并且语法高亮显示。(这里用来显示flag.php的内容)

当我们的payload是/index.php?exp=print_r(scandir(current(localeconv())));

可以看到数组的第二个是flag.php,payload加上next()也就是/index.php?exp=print_r(next(scandir(current(localeconv()))));试一下看看能到哪个文件的位置

可以看到已经指向了flag.php文件这里,只需要将print_r函数换成 highlight_file函数来读取flag.php的内容即可。于是paylaod就是/index.php?exp=highlight_file(next(scandir(current(localeconv()))));

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为海思CPU解读

安全可靠CPU测评结果&#xff08;华为海思篇&#xff09; 中国信息安全测评中心于2024年5月20日发布安全可靠测评结果公告&#xff08;2024年第1号&#xff09;&#xff0c;公布依据《安全可靠测评工作指南&#xff08;试行&#xff09;》的测评结果&#xff0c;自发布起有效期…

昇思25天学习打卡营第4天 | 数据变换

内容介绍&#xff1a;通常情况下&#xff0c;直接加载的原始数据并不能直接送入神经网络进行训练&#xff0c;此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换&#xff08;Transforms&#xff09;&#xff0c;配合数据处理Pipeline来实现数据预处理。所有的T…

免杀笔记 ---> C语言

这次的更新可能有点慢&#xff0c;因为这段时间也比较忙&#xff0c;加上C语言还得和汇编结合&#xff0c;导致小编一个知识点总是得反复揣摩&#xff08;太菜了&#xff09;&#xff0c;所以免杀的更新篇幅长度可能会达到两个月和三个月&#xff0c;但是小编能保证&#xff0c…

RabbitMQ高频面试题整理

文章目录 1、RabbitMQ如何保证消息不丢失1&#xff09;confirm 消息确认机制 (生产者)2&#xff09;消息持久化机制 (RabbitMQ 服务)3&#xff09;ACK 事务机制(消费者) 2、RabbitMQ 中有哪几种交换机类型?1&#xff09; Direct Exchange2&#xff09;Fanout Exchange3&#x…

Netty 入门实例

文章目录 1. 概述2. 代码实例2.1 服务端2.2 客户端2.3 运行截图 3. 整体结构4. 重要组件4.1 EventLoopGroup、EventLoop4.2 Handler & Pipeline4.3 ByteBuf 参考文献 1. 概述 Netty 是一款用于高效开发网络应用的 NIO 网络框架&#xff0c;它大大简化了网络应用的开发过程…

【物联网】室内定位技术及定位方式简介

目录 一、概述 二、常用的室内定位技术 2.1 WIFI技术 2.2 UWB超宽带 2.3 蓝牙BLE 2.4 ZigBee技术 2.5 RFID技术 三、常用的室内定位方式 3.1 信号到达时间 3.2 信号到达时间差 3.3 信号到达角 3.4 接收信号强度 一、概述 GPS是目前应用最广泛的定位技术&#xff0…

流行的app抓包工具详解和案例--开发人员首选

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

游戏大厂“脱钩”安卓商店: 独立渠道TapTap们能否渔利

一纸公告将游戏厂商与渠道的博弈再度摆上了台面。 近日&#xff0c;腾讯控股旗下手游《地下城与勇士&#xff1a;起源》&#xff08;下称“DNF手游”&#xff09;运营团队发布公告称&#xff0c;自6月20日起&#xff0c;DNF手游将不再上架部分安卓平台的头部应用商店。 下架的…

Unity踩坑记录

1. 如果同时在父物体和子物体上挂载BoxCollider&#xff0c;那么当使用&#xff1a; private void OnTriggerEnter2D(Collider2D collision){if (collision.CompareTag("CardGroup")){_intersectCardGroups.Add(collision.GetComponent<CardGroup>());}} 来判…

WebStorm 环境配置带@符号的相对路径穿透

在使用WebStorm 环境开发web页面项目时有时想快速查看页面的引用代码&#xff0c;只能手工找到引入文件路径&#xff0c;这很不方便&#xff0c;只需通过配置webStorm单击打开。 1 使用符号相对路径&#xff0c;在默认情况下没有配置环境是无法打开&#xff0c;如下图&#xf…

docker内apt-get update Waiting for headers 0%

问题描述 docker运行debian等容器时&#xff0c;执行apt update或者apt-get update&#xff0c;可能会出现以下错误&#xff1a;root754a91d3630a:/# apt-get update 0% [Waiting for headers] [Waiting for headers] [Connected to developer.download.nvidia.com (152.199.3…

yolov8环境搭建+训练自己数据集

一、yolov8环境搭建 1. 安装miniconda环境 地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 选择Python3.8版本 最好安装在C盘 勾选自动添加环境变量 ***以下操作安装过程中关闭代理软件 *** 2. 创建虚拟环境 conda create -n yolov8 python3…

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…

代理的匿名级别有哪些?为什么匿名性很重要?

在互联网时代&#xff0c;代理服务器在许多领域都扮演着重要的角色。无论是个人用户还是企业&#xff0c;都可能需要使用代理来保护自己的隐私和数据安全。在选择代理服务时&#xff0c;匿名级别是一个重要的考虑因素。本文将介绍代理的匿名级别&#xff0c;并解释为什么匿名性…

PDF转成清晰长图

打开一个宝藏网址在线PDF转换器/处理工具 - 在线工具系列 点击图下所示位置 按照图下所示先上传文件&#xff0c;设置转换参数后点击转换&#xff0c;等待 等待转换完成后&#xff0c;可以在转换结果处选择下载地址&#xff0c;点击即可进行下载使用了。对比了其他几个网站的转…

K8S -理解StatefulSet - 部署有状态应用

什么是 有状态服务和 无状态服务 有状态服务&#xff08;Stateful Service&#xff09;&#xff1a; 有状态服务是指在处理请求期间维护和跟踪用户状态或会话信息的服务。这意味着服务在多个请求之间保持状态&#xff0c;并且需要在请求之间共享和使用这些状态信息。通常&…

网络安全-如何设计一个安全的API(安全角度)

目录 API安全概述设计一个安全的API一个基本的API主要代码调用API的一些问题 BasicAuth认证流程主要代码问题 API Key流程主要代码问题 Bearer auth/Token auth流程 Digest Auth流程主要代码问题 JWT Token流程代码问题 Hmac流程主要代码问题 OAuth比较自定义请求签名身份认证&…

Spring Boot集成Minio插件快速入门

1 Minio介绍 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

Vue38 安装脚手架 vue-cli ,并使用脚手架创建项目

安装脚手架 vue-cli &#xff0c;并使用脚手架创建项目 第一步 安装脚手架 npm config set registry https:\\[registry.npmmirror.com // 切换淘宝镜像 npm install -g vue/cli第二步 切换到创建项目的目录&#xff0c;创建项目 cd XXX vue create XXX第三步 启动项目 npm…

FreeCAD中智能指针分析

实现原理 FreeCAD中有两套智能指针&#xff0c;一个是OCC的智能指针handle&#xff0c;另一个是自己定义的智能指针Reference&#xff0c;两种智能指针都是通过引用计数方式管理指针。 1.1 OCC智能指针handle OCC在基础类包中定义了一个模板类handle&#xff0c;该类包含一个私…