web:[GXYCTF2019]禁止套娃

news2024/11/14 11:07:05

题目

打开页面显示为

没有其他信息,查看源代码也是空的

用dirsearch扫一下

可能是git源码泄露,可以用githack获取源码

python Githack.py http://5063c85b-a33d-4b6f-ae67-262231a4582e.node4.buuoj.cn:81/.git/

去工具所在的目录找到index.php文件

打开文件显示如下,需要代码审计

代码为简单的php脚本,接受名为‘exp’的get参数。

  1. data://协议用于访问数据(如base64编码的数据)。
  2. filter://协议用于过滤数据。
  3. php://协议用于访问各种内置的PHP流(如输入、输出、文件等)。
  4. phar://协议用于访问PHAR(PHP归档文件)。
  5. /i标志表示不区分大小写。

首先使用了正则表达式匹配来检查exp参数中是否包含“data://”,"fliter://","php://","phar://"等协议,日若包含其中任何一个协议,会输出

后使用正则表达式替换的方式检查参数中是否存在类似函数调用的语法,即以字母和下划线开头,后跟括号内可以由递归调用。若检查结果为“;”,代码会执行“eval($_GET['exp'])”,即执行exp中的代码

最后代码会检查参数中是否包含特定字符串,如"et", "na", "info", "dec", "bin", "hex", "oct", "pi", "log"等。如果存在这些字符串中的任意一个,代码将输出"还差一点哦!"并终止执行。

总结上述代码审计可知,被过滤掉了data://、filter://、php://、phar://、et、na、info、dec

bin、hex、oct、pi、log

对第二个if

 (?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,那么它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子

if(';' === preg_replace('/[a-z,_]+(?R)?(?�)?/', NULL, $_GET['exp']))可以看出这是典型的无参数rce

因为不能传参,所以只能利用函数回显套娃来代替目标参数

解法一:

scandir() :将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前目录下的所有文件和目录名称(glob()可替换)
localeconv() :返回一包含本地数字及货币格式信息的二维数组。(但是这里数组第一项就是‘.’,这个.的用处很大)
current() :返回数组中的单元,默认取第一个值。pos()和current()是同一个东西

逐步解析构造payload

var_dump(localeconv());能发现string[1]就是一个“.”,这个点是由localeconv()产生的

var_dump(localeconv()):是一个PHP函数调用,用于打印当前的本地化信息。它返回一个关联数组,包含了与当前地区相关的数字格式、货币格式、日期格式等信息。

array(19) {
  ["decimal_point"]=>
  string(1) "."
  ["thousands_sep"]=>
  string(1) ","
  ["int_curr_symbol"]=>
  string(3) "USD"
  // ...
}

 利用current()函数将这个点取出来的,点代表的是当前目录,那接下来就很好理解了,我们可以利用这个点完成遍历目录的操作,相当于就是linux中的ls指令


current()取第一个值,那么current(localeconv())就能构造一个‘.’,'.' 表示当前目录,scandir('.') 将返回当前目录中的文件和子目录,从代码审计得知flag所在的文件名就是flag.php

flag的文件名在比较后端我们可以通过array_reverse()将数组内容反转,让它从倒数第二的位置变成正数第二

移动指针读取第二个数组,参照下列数组移动操作可知我们应选用next()函数

end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动

highlight_file()返回文件内容

所以最终的payload为

?exp=highligth_file(next(array_reverse(scandir(current(localeconv())))));
解法二:

在已知文件名flag.php的情况下直接读文件

已知文件名,改包手动添加cookie头把文件名写在PHPSESSIONID后

构造payload为

readfile(session_id(session_start()));

session_start()是PHP的一个函数,用于启动一个新的会话或者恢复一个已存在的会话。session_id()函数返回当前会话的ID。

readfile()是PHP的另一个函数,用于读取文件内容并将其输出到浏览器。

参考文章链接:

BuuCTF [GXYCTF2019]禁止套娃详解(两种方法)-CSDN博客

BuuCTF [GXYCTF2019]禁止套娃详解(两种方法)-CSDN博客

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

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

相关文章

Redis(事务和持久化)(很重要!)

事务的定义: Redis中的事务是指一组命令的集合,这些命令可以在一个原子操作中执行。在Redis中,可以使用MULTI命令开始一个事务,然后使用EXEC命令来执行事务中的所有命令,或者使用DISCARD命令来取消事务。事务可以确保…

探索 Material 3:全新设计系统和组件库的介绍

探索 Material 3:全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton:支持…

策略模式实践

目录 前言 五个部分 名词解释 代码 controller层 HelloService接口 实现类 自定义注解 上下文 策略工厂 Java SPI配置 验证 前言 五个部分 接口、实现类、自定义注解、上下文、策略工厂 名词解释 自定义注解(方便后期增加实现类后灵活控制策略) 上下文(初始化…

【Java 进阶篇】深入理解 Jackson:Java 对象转 JSON 的艺术

嗨,亲爱的小白们!欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 的详细解析指南。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,而 Jackson 作为一个强大的 JSON 解析库,能够帮…

Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

linux rsyslog综合实战2

本次我们通过rsyslog服务将A节点服务器上的两个(E.g:多个日志也可以)日志(Path:/var/log/245-1.log、245-2.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS…

②【Hash】Redis常用数据类型:Hash [使用手册]

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis Hash ②Redis Hash 操作命令汇总1. hset…

【冒泡排序设计】

【冒泡排序设计】 思路代码结果 思路 冒泡排序这个算法,对于我这样的初学者来说,也不是很简单!!!(没有想象的那么简单)!  它的核心思想是:两两相邻的元素进行比较&#…

【代码随想录】算法训练计划28

回溯 1、491. 递增子序列 题目: 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以…

ElementUI用el-table实现表格内嵌套表格

文章目录 一、效果图二、使用场景三、所用组件元素(Elementui)四、代码部分 一、效果图 二、使用场景 🛀el-form 表单内嵌套el-table表格 🛀el-table 表格内又嵌套el-table表格 三、所用组件元素(Elementui&#xff…

【云原生-Kurbernetes篇】HPA 与 Rancher管理工具

文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…

[Docker]七.配置 Docker 网络

一.Docker0 网络 1.多个容器之间如何通信,是否可以直接连接 默认启动的所有容器都会加入到docker0这个网络中,所有各个容器件是可以直接通信的 先看看网卡信息: 启动几个容器来演示一下: #启动mycentos这个容器 [rootlocalhost zph]# docker run -it -d --name mycentos d757…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别?都是标准型云服务器,标准型S5是次新一代云服务器规格,标准型S6是最新一代的云服务器,S6实例的CPU处理器主频性能要高于S5实例,同CPU内存配置下的标准型S6实例要比S5实例性能更好…

Linux下安装go

正式环境: 1、找到linux 版本go包 (Downloads - The Go Programming Language) 2、下载 wget https://dl.google.com/go/go1.17.5.linux-amd64.tar.gz3、解压到/usr/local (官方推荐) tar -C /usr/local -zxvf go1…

安卓手机termux上安装MariaDB数据库并实现公网环境下的远程连接

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一个随身…

1.Gin 介绍

1.Gin 介绍 介绍 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者,我们推荐你使用 Gin 框架。 Gin 最擅长的就是 Api 接口的高并发,如果项目的规模不大,业务相对简单&a…

MySQL数据库:开源且强大的关系型数据库管理系统

大家好,我是咕噜-凯撒,数据在当今信息化时代的重要性不可忽视。作为企业和组织的重要资产,数据的管理和存储变得至关重要,MySQL作为一种关系型数据库管理系统,具有非常多的优势,下面简单的探讨一下MySQL数据…

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员,有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中,也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中,我遇到了一个非常复杂的Bug,这个…

【DevOps】Git 图文详解(七):标签管理

Git 图文详解(七):标签管理 标签(Tags)指的是某个分支某个特定时间点的状态,是对某一个提交记录的 固定 “指针” 引用。一经创建,不可移动,存储在工作区根目录下 .git\refs\tags。可…

C++ LibCurl实现Web指纹识别

Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术。这项技术旨在识别Web服务器、Web应用框架、后端数据库、JavaScript库等组件的版本和配置信息。通过分析HTTP响应头、HTML源代码、JavaScript代码、CSS文件等&#x…