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:

在这里插入图片描述

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

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

相关文章

C语言——内存函数的使用与模拟实现

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…

【小白专用】php pdo sqlsrv 类,php连接sqlserver

1.找到自己版本&#xff0c;我的程序是64位的。 注意&#xff1a;ts与nts的区别&#xff0c;查看phpinfo信息&#xff0c;如下 <?phpecho phpinfo();?> 2.运行后&#xff0c;可以查看到如下数据&#xff1a; ① PHP 的版本是8.2.13&#xff1b; ② 属于线程安全版 ts…

远程多窗口和Screen用法

Termius 远程链接服务器终端时&#xff0c;经常遇到需要开多个窗口&#xff0c;另外还可能涉及到正在运行的程序一旦和服务器链接断开&#xff0c;那么程序也就停止执行了。对于单单只需要多个窗口的问题&#xff0c;建议下载一个Termius这样软件&#xff0c;比多次打开…

西门子S71200系列PLC通过PROFINET连接多功能电表

西门子S71200连接多功能电表 1、需求描述&#xff1a; 通过西门子S7-1200系列PLC&#xff0c;连接多功能电表&#xff0c;通过Modbus协议读写电表的数据。 2、方案描述&#xff1a; 桥接器的网口连接西门子S7-1200系列PLC的网口&#xff0c;串口连接到电表的485通讯口&#x…

2023美团商家信息

2023美团商家电话、地址、经纬度、评分、均价、执照...

第一节TypeScript 安装

一、TypeScript 安装 前提条件&#xff1a;我们环境中已经配置npm环境。 1、使用npm安装TypeScript 首先查看你本地是否已安装npm。打开cmd -> 输入“npm -v” 回车&#xff0c;查看输出的npm版本 上述输出代码你本地环境已经安装了npm工具&#xff0c;可以使用以下命令来…

【数据结构】并查集的简单实现,合并,查找(C++)

文章目录 前言举例&#xff1a; 一、1.构造函数2.查找元素属于哪个集合FindRoot3.将两个集合归并成一个集合Union4.查找集合数量SetCount 二、源码 前言 需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规…

文件操作学习总结

磁盘上的⽂件是⽂件。 但是在程序设计中&#xff0c;我们⼀般谈的⽂件有两种&#xff1a; 程序⽂件、数据⽂件 &#xff08;从⽂件功能的⻆度来分类 的&#xff09;。 程序⽂件 &#xff1a; 程序⽂件包括源 程序⽂件&#xff08;后缀为.c&#xff09; , ⽬标⽂件&#xff0…

产品需求分析师的职责内容(合集)

产品需求分析师的职责内容1 职责&#xff1a; 1、根据公司战略规划&#xff0c;负责妇产科相关平台产品的中长期规划; 2、组织需求调研、收集、分析、整理、提炼、用户的需求&#xff0c;分析形成可行性研究报告; 3、深入挖掘产品需求&#xff0c;管理用户及公司内部业务需求&a…

配置OSPF与BFD联动示例

1、OSPF与BFD联动 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种用于检测转发引擎之间通信故障的检测机制。 BFD对两个系统间的、同一路径上的同一种数据协议的连通性进行检测&#xff0c;这条路径可以是物理链路或逻辑链路&#xff0c;包…

贪吃蛇(三)绘制蛇身

绘制蛇身的逻辑不难&#xff0c;存储上面使用结构体。 第一行和第十九行绘制--其它行&#xff0c;绘制|&#xff0c;分别在头尾处。 (1) 扫描蛇身&#xff0c;如果扫描到则绘制[]。 (2) 扫描蛇身&#xff0c;如果扫描不到则绘制空白。 #include"curses.h"struct Sn…

文件操作入门指南

目录 一、为什么使用文件 二、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四、文件的顺序读写 ​编辑 &#x1f33b;深入理解 “流”&#xff1a; &#x1f342;文件的顺序读写函数介绍&#xff1a; …

爬虫实战案例 -- 爬取豆瓣读书网页内容

进入网站检查信息 , 确定请求方式以及相关数据 找到爬取目标位置 开始敲代码 # 链接网站 def url_link(url):res requests.get(url,headers headers)response res.textparse_data(response)# 爬取信息 def parse_data(data):msg <li\sclass"media\sclearfix…

在 CentOS 上使用 Docker 运行 RabbitMQ

在 CentOS 上使用 Docker 运行 RabbitMQ 使用Docker来运行RabbitMQ非常方便&#xff0c;以下是一个简单的步骤&#xff0c;以YAML配置文件方式创建和运行RabbitMQ容器。 构建容器 创建Docker Compose文件 创建一个docker-compose.yml文件&#xff0c;内容如下&#xff1a; …

C# 将 Word 转化分享为电子期刊

目录 需求 方案分析 相关库引入 关键代码 Word 转 Pdf Pdf 转批量 Jpeg Jpeg 转为电子书 实现效果演示 小结 需求 曾经的一个项目&#xff0c;要求实现制作电子期刊定期发送给企业进行阅读&#xff0c;基本的需求如下&#xff1a; 1、由编辑人员使用 Microsoft Word…

MyBatis-Plus如何 关闭SQL日志打印

前段时间公司的同事都过来问我&#xff0c;hua哥公司的项目出问题了&#xff0c;关闭不了打印sql日记&#xff0c;项目用宝塔自己部署的&#xff0c;磁盘满了才发现大量的打印sql日记&#xff0c;他们百度过都按照网上的配置修改过不起作用&#xff0c;而且在调试时候也及为不方…

mysql的asc和desc全称

原文&#xff1a;http://t.csdnimg.cn/BJ2sUhttp://t.csdnimg.cn/BJ2sU

[AutoSar]基础部分 RTE 02 S/R Port 显式/隐式

目录 关键词平台说明一、显式&#xff08;Explicit&#xff09;和隐式&#xff08;Implicit&#xff09;1.1 显式模式1.1.1code 二、隐式模式2.1 code 三、区别 关键词 嵌入式、C语言、autosar、EcuM、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语…

字符串逆序输出

逆序输出就是本来abc输出的&#xff0c;然后我想让他输出成cba&#xff0c;那么我们还是要用到for循环&#xff0c;只不过原先是从零开始往上加&#xff0c;这回呢&#xff0c;是从上面往下减 我们观察上面这个图片&#xff0c;我们想要输出olleh&#xff0c;那么我们就要从4开…

2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能

2023 英特尔On技术创新大会直播 | 探索视觉AI的无限可能 前言一未来的 AI&#xff1a;释放视觉 AI 真正潜力二AI技术突破、视觉Al挑战及前沿研究创新三全尺度视觉学习全尺度视觉学习示例1.GridConv 实现三维人体姿态估计更高准确率2.KW 预训练及迁移模型性能3.无数据增强稠密对…