2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】

一、题目如下:

在这里插入图片描述


二、代码解读:

这段代码是一个简单的PHP脚本,它接受通过GET请求传递的两个参数:‘pass’和’func’:
$password = trim($_GET['pass'] ?? '');:从GET请求中获取名为’pass’的参数,然后使用trim函数去除首尾空格,并将结果赋给变量 $password。如果’pass’参数不存在,则使用空字符串。
$func = trim($_GET['func'] ?? 'hint');:从GET请求中获取名为’func’的参数,然后使用trim函数去除首尾空格,并将结果赋给变量$func。如果’func’参数不存在,则默认使用字符串’hint’。
function hint() {show_source(__FILE__);} :定义了一个名为hint的函数,它的作用是显示当前文件的源代码,使用了show_source函数。
if (md5(\$password)==='21c6008facc283f8839d3b9fed640c15') {:检查通过GET请求传递的’pass’参数的MD5哈希值是否等于指定的值。如果匹配,进入条件块。
function youwin() {echo file_get_contents("/flag");}:在条件成立时,定义了一个名为youwin的函数,它的作用是输出名为’/flag’的文件的内容,使用了file_get_contents函数。
$func();:调用根据’func’参数确定的函数。默认情况下,如果’func’参数不存在,将调用hint函数。


二、解题思路:

常规思路就是绕过 md5 效验。但是这里是强比较,显然无法绕过。尝试参数爆破,看有没有除pass、func 额外的请求参数, bp 跑参数字典:

在这里插入图片描述

果然发现了一个 file 请求参数,使用 readfile() 函数读取文件,尝试任意文件读取:

在这里插入图片描述尝试读取 flag, 发现存在拦截:

在这里插入图片描述

readfile() 可以直接读取 php 文件,且php代码不会被解析

读取当前文件源代码:

在这里插入图片描述尝试绕过 preg_match 正则,传递数组参数:

在这里插入图片描述成功绕过,但是 readfile() 不接受数组作为参数, 网上没找到 readfile() 相关漏洞的文献资料。故放弃…


想起上上周看到 p 牛10月份写的一篇文章,提到了 PHP 临时函数名特性 , 且给的题目案例跟这题很像。 ==> 2023年10月PHP函数小挑战

PHP在编译“函数定义”的时候,会使用 zend_compile_func_decl 函数。这个函数有个关键的参数叫 toplevel,这个参数表示当前的函数定义是否在顶层作用域。

顶层作用域: 顶层作用域通常是指在全局范围内声明的变量、函数或类,而不是在任何函数或控制结构内声明的。

<?php

// 在顶层作用域定义的函数
function func1() {
    echo 'func1';
}

if (true) {
	// 在if条件判断内部定义的函数,不是顶层作用域
    function func2() {
        echo 'func2';
    }
}

当toplevel为true的时候,就是直接将当前函数名 lcname 加入函数表;当 toplevel为false的时候,使用 zend_build_runtime_definition_key 函数生成一个 key,将 key 作为函数名加入函数表。也就是说,根据函数所在的位置的不同(是否是顶级作用域),PHP编译时生成的函数名也会不同。
在这里插入图片描述

key 是按照如下算法生成:

'\0' + name + filename + ':' + start_lineno + '$' + rtd_key_counter

除了第一个 \0 字符,后面四部分的含义如下:

  • name 函数名
  • filename PHP文件绝对路径
  • start_lineno 函数起始定义行号(以1为第一行)
  • rtd_key_counter 一个全局访问计数,每次执行会自增1,从0开始

最后保存在函数表中的函数名,就是上面这个以 \0 开头的字符串。


以上是看 p 牛的文章简要梳理一下核心知识点。但是我发现一个问题:

在这里插入图片描述图中说只要构造:'\0' + name + filename + ':' + start_lineno + '$' + rtd_key_counter 调用就可以了,但是后面图中 payload 又是:
'%00' + name + filename + ':' + start_lineno + '$' + rtd_key_counter 这种方式:

在这里插入图片描述在这里插入图片描述
为什么又变成了 %00 而不是 \0 呢?小小的探究一下:

前提:windows,php 7.4 (要限制7.4版本,稍后会说), vld.dll 内存监控插件 (要下载和php版本相对应的)

本地编写和比赛环境一样的代码,文件名为:965ee283f4c848ad99b0a7961ed89199.php,使用php7.4 配合vld插件解释运行:

 ./php -d vld.execute=0 -d vld.active=1  E:\phpstudy_pro\WWW\php-learn\965ee283f4c848ad99b0a7961ed89199.php

在这里插入图片描述在这里插入图片描述可以看到实际的临时函数名确实是以 %00 开头的。php 底层是由C语言编写的,在C语言中,\0和%00实际上有相似的作用,都表示空字符(null character)。\0是C语言中用于表示空字符的一种方式,通常用在字符串中作为字符串的结束标志。%00通常是在格式化输入输出函数中使用的格式说明符,表示空字符。 我们请求参数被php接收并解释运行,也是一个输入的过程,所以要使用 %00 为开头构建。(个人见解)


为什么要限制 php7.4 这个版本去复现呢?

我尝试使用 php7.3 版本配合vld插件去解释运行相同的代码,得到如下:

在这里插入图片描述在这里插入图片描述不同版本有差异性,7.4 版本结尾更加具有规律性,能爆破。


按照上面的思路,按照 zend_build_runtime_definition_key 的算法计算出 key 作为函数名:(rtd_key_counter 从 0 开始爆破)

%00youwin/var/www/html/965ee283f4c848ad99b0a7961ed89199.php:7$rtd_key_counter

比赛环境没了,本地搭了一个。

发现爆破不出flag:

在这里插入图片描述

trim 函数在接收参数的时候会去除掉字符串首尾的空白字符。可以加反斜杠绕过:\%00

故要改写成如下:

\%00youwin/var/www/html/965ee283f4c848ad99b0a7961ed89199.php:7$rtd_key_counter

bp 开始爆破 rtd_key_counter 得 flag:

在这里插入图片描述

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

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

相关文章

解决你的 Nginx 代理跨域问题详细完整版

当你遇到跨域问题&#xff0c;不要立刻就选择复制去尝试。请详细看完这篇文章再处理 。我相信它能帮到你。 分析前准备&#xff1a; 前端网站地址&#xff1a;http://localhost:8080 服务端网址&#xff1a;http://localhost:59200 首先保证服务端是没有处理跨域的&#x…

22.JSP技术

JSP起源 在很多动态网页中&#xff0c;绝大部分内容都是固定不变的&#xff0c;只有局部内容需要动态产生和改变。如果使用Servlet程序来输出只有局部内容需要动态改变的网页&#xff0c;其中所有的静态内容也需要程序员用Java程序代码产生&#xff0c;整个Servlet程序的代码将…

OpenShift 4 - 管理和使用 OpenShift AI 运行环境

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 2.50 的环境中验证 文章目录 启停 Notebook Server启动停止 Notebook 镜像Notebook Image 和 ImageStream使用定制的 Notebook Image 定制服务器的运行配置应用和项目用户和访问权…

一篇文章带你了解各个程序员接单平台,让你选择不再迷茫!!!

相信现在很多程序员都已经走上了或者准备走上网上接单这条路&#xff0c;但是目前市面上的接单平台可谓五花八门&#xff0c;对于各个平台的优缺点&#xff0c;不同的程序员该如何选择适合自己的接单平台&#xff0c;你又是否了解呢&#xff1f; 接下来就让小编用一篇文章来为…

C++数据结构——二叉搜索树详解

目录 一&#xff0c;关于二叉搜索树 1.1 概念 1.2 基本结构 二&#xff0c;二叉搜索树接口实现 2.1 插入 2.2 查找 2.3 打印 2.4* 删除 三&#xff0c;二叉搜索树接口递归实现 3.1 查找 3.2 插入 3.3 删除 四&#xff0c;二叉搜索树的默认成员函数 五&#xff0c;…

国产划片机品牌众多,如何选择优质的供应商?

在半导体行业的发展浪潮中&#xff0c;划片机作为关键设备之一&#xff0c;其性能和质量对于生产过程的高效性和产品的质量具有至关重要的影响。近年来&#xff0c;国产划片机的品牌数量不断增多&#xff0c;为半导体行业提供了更多的选择。然而&#xff0c;如何从众多的品牌中…

2023 英特尔On技术创新大会直播 | AI 融合发展之旅

前言 2023 年的英特尔 On 技术创新大会中国站&#xff0c;主要聚焦最新一代增强 AI 能力的计算平台&#xff0c;深度讲解如何支持开放、多架构的软件方案&#xff0c;以赋能人工智能并推动其持续发展。 大会的目标之一是优化系统并赋能开发者&#xff0c;特别注重芯片增强技术…

个人用户的数据之美:数据可视化助力解读

数据可视化是一种强大的工具&#xff0c;不仅可以为企业和专业人士提供见解&#xff0c;也对个人用户带来了许多实际的帮助。下面我就以一个数据可视化从业者的视角&#xff0c;来谈谈数据可视化对个人用户的益处&#xff1a; 首先对于个人用户来说&#xff0c;数据可视化可以让…

金蝶报表二开

本案例描述&#xff1a; 折旧明细报表中加入字段&#xff1a;存放地点、成本中心部门、使用人组织三个字段。 参考社区案例&#xff1a;报表二次开发添加自定义字段的指导方案 步骤&#xff1a; 1、加入报表插件 继承原报表的类。重写BuilderReportSqlAndTempTable、GetRe…

【Python秘技】用Python实现千图成像,千字成像,编程炫技必备!

一个千图成像&#xff0c;千字成像的程序&#xff0c;开源给大家玩玩。 用她的名字组成她的照片会不会很酷呢&#xff1f; 后续会完善更多功能&#xff0c;打包为程序。 源代码在这里&#xff1a;https://github.com/w-x-x-w/Thousand-Image-Generator 讲解在这里&#xff…

armday1

1到一百的累加

Saliency Prediction in the Deep LearningEra: Successes and Limitations

摘要&#xff1a; 近年来&#xff0c;由于深度学习和大规模注释数据的进步&#xff0c;视觉显著性模型在性能上有了很大的飞跃。然而&#xff0c;尽管付出了巨大的努力并取得了巨大的突破&#xff0c;但模型在达到人类水平的准确性方面仍然存在差距。在这项工作中&#xff0c;…

CTF命令执行部分总结

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白&#xff0c;正在自学ing。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。 ⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️ 关于…

keep-live原理,react-router如何实现keep-alive

3. keep-live原理&#xff0c;react-router如何实现keep-alive 先说结论&#xff1a;被keep-alive标签包裹的组件在第一次初始化时&#xff08;渲染从render开始&#xff09;会被缓存起来&#xff08;以vnode的形式&#xff09;&#xff0c;再次访问时&#xff08;actived生命周…

在Python中使用Kafka帮助我们处理数据

Kafka是一个分布式的流数据平台&#xff0c;它可以快速地处理大量的实时数据。Python是一种广泛使用的编程语言&#xff0c;它具有易学易用、高效、灵活等特点。在Python中使用Kafka可以帮助我们更好地处理大量的数据。本文将介绍如何在Python中使用Kafka简单案例。 一、安装K…

[C++]——STL简介

带你了解c的STL 前言&#xff1a;一、什么是STL?二、STL有什么版本&#xff1f;三、STL的组件有哪些&#xff1f;四、如何学习STL?五、总结 前言&#xff1a; 我写这个博客&#xff0c;是为了在学习过程中能够更加有条理&#xff0c;更加全面&#xff0c;更加清晰的学习STL。…

喜报|棱镜七彩获评江苏省专精特新中小企业

近日&#xff0c;江苏省工业和信息化厅发布《关于江苏省2023年专精特新中小企业和2020年度专精特新企业复核通过企业名单的公示》&#xff0c;棱镜七彩成功入选2023年江苏省省级专精特新中小企业名单。 图 2023年省级专精特新中小企业公式名单节选 “专精特新”是国家为鼓励中…

Nodejs 第二十五章(http)

“http” 模块是 Node.js 中用于创建和处理 HTTP 服务器和客户端的核心模块。它使得构建基于 HTTP 协议的应用程序变得更加简单和灵活。 创建 Web 服务器&#xff1a;你可以使用 “http” 模块创建一个 HTTP 服务器&#xff0c;用于提供 Web 应用程序或网站。通过监听特定的端…

docker在线安装nginx

1、查看所有镜像 1、不带容器卷常规启动nginx&#xff0c;命令如下 docker run --name nginx-test -p 8089:80 -d a6bd71f48f68 2、在宿主机创建/usr/local/data/nginxdocker/目录&#xff0c;在此目录下创建html和logs文件夹&#xff0c;然后将容器内的 nginx.conf 和 html 下…

nodejs使用nodejieba

Nodejieba是一个基于Node.js平台的中文分词模块&#xff0c;用于将中文文本切分成有意义的词汇。它是结巴中文分词的Node.js版本&#xff0c;结巴分词是一种开源的中文分词工具&#xff0c;广泛应用于中文自然语言处理领域 优点 高性能&#xff1a; Nodejieba的底层实现采用了…