web:[GXYCTF2019]禁止套娃

2023-11-22 16:15
文章标签 web 禁止 gxyctf2019 套娃

本文主要是介绍web:[GXYCTF2019]禁止套娃,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

打开页面显示为

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

用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博客

这篇关于web:[GXYCTF2019]禁止套娃的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411359

相关文章

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加