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:

相关文章:
2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】
一、题目如下: 二、代码解读: 这段代码是一个简单的PHP脚本,它接受通过GET请求传递的两个参数:‘pass’和’func’: ① $password trim($_GET[pass] ?? );:从GET请求中获取名为’pass’的参数࿰…...
软件设计师——软件工程(一)
📑前言 本文主要是【软件工程】——软件设计师——软件工程的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄…...
阿里云|人工智能(AI)技术解决方案
函数计算部署Stable Diffusion AI绘画技术解决方案 通过函数计算快速部署Stable Diffusion模型为用户提供快速通过文字生成图片的能力。该方案通过函数计算快速搭建了AIGC的能力,无需管理服务器等基础设施,专注模型的能力即可。该方案具有高效免运维、弹…...
Axure中继器的使用
一.中继器介绍 在Axure中,中继器(Relays)是一种功能强大的元件,可以用于创建可重复使用的模板或组件。中继器允许您定义一个主要的模板,并在页面中重复使用该模板的实例。以下是中继器的作用和优缺点: 作…...
猫罐头哪个牌子好性价比高?五大性价比高的品牌推荐
很多猫奴担心猫咪天天吃干猫粮可能会导致营养不足,所以想给猫咪换换口味,改善一下饮食。这时,选择猫罐头是个不错的选择。不过,喂猫罐头也是有一些讲究的。 作为从业6年的宠物护理师来说,作为早在几年就开始接触猫罐头…...
宣布推出 ML.NET 3.0
作者:Jeff Handley 排版:Alan Wang ML.NET 是面向 .NET 开发人员的开源、跨平台的机器学习框架,可将自定义机器学习模型集成到 .NET 应用程序中。ML.NET 3.0 版本现已发布,其中包含大量新功能和增强功能! 此版本中的深…...
常见的排序算法---快速排序算法
快速排序算法 快排是基于分治的思想来的,快速排序就是在元素序列中选择一个元素作为基准值,每趟总数据元素的两端开始交替排序,将小于基准值的交换的序列前端,大于基准值的交换到序列后端,介于两者之间的位置称为基准值…...
hive企业级调优策略之分组聚合优化
测试用表准备 hive企业级调优策略测试数据 (阿里网盘下载链接):https://www.alipan.com/s/xsqK6971Mrs 订单表(2000w条数据) 表结构 建表语句 drop table if exists order_detail; create table order_detail(id string comment 订单id,user_id …...
英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案
12月13-14日,“凝心聚力,共赢计算新时代”——2023计算产业生态大会在北京香格里拉饭店成功举办。英码科技受邀参加行业数字化分论坛活动,市场总监李甘来先生现场发表了题为《AI哨兵,为铁路安全运营站好第一道岗》的精彩主题演讲&…...
【openssl】Linux升级openssl-1.0.1到1.1.1
文章目录 前言一、openssl是什么?二、使用步骤1.下载2.编译安装3.一些问题 总结 前言 记录一次openssl的升级,1.0.1升级到1.1.1 一、openssl是什么? OpenSSL是一个开源的加密工具包,广泛用于安全套接层(SSLÿ…...
美国联邦机动车安全标准-FMVSS
FMVSS标准介绍: FMVSS是美国《联邦机动车安全标准》,由美国运输部下属的国家公路交通安全管理局(简称NHTSA)具体负责制定并实施。是美国联邦政府针对机动车制定的安全标准,旨在提高机动车的安全性能,减少交通事故中的人员伤亡。F…...
龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场
产品描述 LT6211B 是一款用于 VR/ 显示应用的高性能 HDMI1.4 至 LVDS 芯片。 对于 LVDS 输出,LT6211B 可配置为单端口、双端口或四端口。对于2D视频流,同一视频流可以映射到两个单独的面板,对于3D视频格式,左侧数据可以发送到一个…...
解决docker拉取镜像错误 missing signature key 问题
核心原因:本地docker版本过低,需要: 1. 彻底卸载本地docker文件 2. 配置yum 镜像文件, 重新安装最新版本 相信教程可参考: CentOS安装Docker(超详细)_centos 安装docker-CSDN博客...
倒计数器:CountDownLatch
CountDownLatch 是 Java 中用于多线程编程的一个同步工具。 它允许一个或多个线程等待其他线程执行完特定操作后再继续执行。 CountDownLatch 通过一个计数器来实现, 该计数器初始化为一个正整数,每当一个线程完成了指定操作,计数器就会减一。…...
vue内容渲染
内容渲染指令用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有3个 1.v-text 缺点:会覆盖元素内部原有的内容 2.{{}}:插值表达式在实际开发中用的最多,只是内容的占位符,不会覆盖内容 3.v-html:可以把带有标…...
Kafka为什么能高效读写数据
1)Kafka 本身是分布式集群,可以采用分区技术,并行度高(生产消费方并行度高); 2)读数据采用稀疏索引,可以快速定位要消费的数据; 3)顺序写磁盘; …...
Flink系列之:Table API Connectors之Debezium
Flink系列之:Table API Connectors之Debezium 一、Debezium二、依赖三、使用Debezium Format四、可用元数据五、Format参数六、重复的变更事件七、消费 Debezium Postgres Connector 产生的数据八、数据类型映射 一、Debezium Debezium 是一个 CDC(Chan…...
【Python基础】文件读写
文章目录 [toc]打开文件open()函数参数解析示例 文件路径绝对路径示例 相对路径示例 打开文件的模式常用模式 读文件示例 写文件示例 按行读写文件readline()示例 readlines()示例 writelines()示例 关闭文件示例finally语句示例 上下文管理器示例 自定义读写类示例 打开文件 …...
电脑风扇控制软件Macs Fan Control mac支持多个型号
Macs Fan Control mac是一款专门为 Mac 用户设计的软件,它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度,以提高设备的散热效果,减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…...
clangd:Couldn‘t build compiler instance
在使用vscode clangd 搭建RK3588 5.10版本linux内核代码开发环境时,使用bear生成 compile_commands.json时,clangd生成标签失败代码无法跳转,查看clangd日志,发现标签生成失败,失败原因:Couldnt build comp…...
IGF-I Analog ;CYAAPLKPALSSC
一、基础信息多肽名称:IGF-I Analog 胰岛素样生长因子 I 类似物 三字母序列:Cys-Tyr-Ala-Ala-Pro-Leu-Lys-Pro-Ala-Lys-Ser-Cys 单字母序列:CYAAPLKPALSSC 氨基酸数量:12 aa 结构修饰:分子内二硫键 二硫键配对…...
本地化AI代码助手部署指南:从模型选型到性能调优
1. 项目概述:一个面向开发者的本地化AI代码助手最近在GitHub上看到一个挺有意思的项目,叫“JPeetz/Hermes-Studio”。乍一看名字,可能会联想到希腊神话里的信使赫尔墨斯,或者某个设计软件。但点进去你会发现,这其实是一…...
3步在Windows上安装APK应用:告别安卓模拟器的轻量级解决方案
3步在Windows上安装APK应用:告别安卓模拟器的轻量级解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行Android应用却不想安…...
3步精通UE4SS游戏Mod开发:从注入到实战完全指南
3步精通UE4SS游戏Mod开发:从注入到实战完全指南 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS UE…...
从零到一:在STM32F103上构建FatFs文件系统并驱动W25Q64 Flash
1. 硬件准备与环境搭建 在开始构建FatFs文件系统之前,我们需要先准备好硬件环境。我手头用的是STM32F103C8T6最小系统板,搭配一块W25Q64 Flash芯片。这块Flash芯片容量为8MB,通过SPI接口通信,正好适合用来做文件存储介质。 首先得…...
Guitar Pro 8.1.5作为吉他爱好者的练琴神器,其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点,为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性Guit
Guitar Pro 8.1.5作为吉他爱好者的练琴神器,其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点,为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性 Guitar Pro 8.1.5同时支持macOS与Windows系统,mac用户无需转战Wi…...
如何在Windows任务栏实时监控股票行情:TrafficMonitor股票插件终极指南
如何在Windows任务栏实时监控股票行情:TrafficMonitor股票插件终极指南 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 你是否曾经在工作时频繁切换窗口查看股票行情…...
扩散模型如何重塑建筑设计流程:从概念生成到性能优化的AI协作
1. 项目概述:当AI成为建筑师的“副驾驶”几年前,当我在设计院通宵达旦地对着屏幕调整一个曲面屋顶的参数时,我就在想,有没有一种工具,能让我把脑子里那个模糊的意象,瞬间变成可供推敲的视觉草稿?…...
2026年6分钟腾讯云部署OpenClaw/Hermes Agent及使用喂饭级步骤流程
2026年6分钟腾讯云部署OpenClaw/Hermes Agent及使用喂饭级步骤流程。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工…...
RuoYi Office 企业多端协同办公落地实战
很多企业在推进数字化办公时,常陷入一个尴尬的境地:PC 端的管理后台功能强大但操作繁琐,移动端的小程序或 App 虽然便捷却数据割裂。HR 在电脑上录入的员工档案,销售在手机里看不到;老板在微信上审批的流程,…...
