当前位置: 首页 > article >正文

【无标题】PHP-get_definde_vars

[题目信息]:

题目名称题目难度
PHP-get_defined_vars2

[题目考点]:

get_defined_vars — 返回由所有已定义变量所组成的数组

此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

[Flag格式]:

SangFor{tHOllYKRkqYkRWPS0zZf8z1QztC3q_2D}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

http://分配ip:2088

[题目writeup]:

1、实验主页

2、源码分析

<?php
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
} else {
    show_source(__FILE__);
}

分析题目代码,逻辑十分清晰。

首先着眼这个正则表达式

[^\W]+\((?R)?\)

其中"[]“表示匹配的开始结束,”^"表示取反。

\W,(注意这个W是大写的),匹配非字母、数字、下划线。等价于[^A-Za-z0-9_]

所以[^\W]是对上面的\w取反: 匹配所有字母数字下划线的字母。

不太熟悉正则的注意正则中的 “+”,是为了拼接整个表达式的,并不是需要我们匹配 “+”,

然后是\((?R)?\):

其中两侧的\( 和\)表示匹配括号。

(?R),(?R)表示递归表达式本身,

(?R)?,最后的"?"表示匹配1个或者0个表达式本身,最后的 “?” 必不可少的。

整个正则是要把对应形式的内容提取出来,然后通过preg_replace函数,用空字符串进行代替,得到一个字符串必须是完全等于**“;”**的。

简而言之,正则限制了只能执行一个函数,但不能设置参数。

这时候需要使用到一个php函数

get_defined_vars — 返回由所有已定义变量所组成的数组

此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

用于返回定义的全部变量,这样就相当于可以获取任意位置传入变量值。

就可以通过nextcurrentreset来操纵这个数组,就可以获取到想要的变量值。

只需要reset所有的变量,然后只有当前get赋值,那么就只剩下get请求的变量了

查看目录结构,直到找到flag位置

?1=print_r(scandir('../'));//&code=eval(implode(reset(get_defined_vars())));

查询flag值

?1=readfile('../flag_phpbyp4ss');//&code=eval(implode(reset(get_defined_vars())));


http://www.kler.cn/a/560971.html

相关文章:

  • Unity汽车笔记
  • 三七互娱游戏策划岗内推
  • angular新闻列表分页
  • nodejs npm install、npm run dev运行的坎坷之路
  • Linux System V - 消息队列与责任链模式
  • linux应急响应-进程排查
  • VM C#脚本 调用命令行 以python为例
  • 搭建Appium工具环境
  • 赛前启航 | 三场重磅直播集结,予力微软 AI 开发者挑战赛!
  • 边缘安全加速(ESA)套餐
  • 本地部署AI模型 --- DeepSeek(二)---更新中
  • 使用 Promptic 进行对话管理需要具备python技术中的那些编程能力?
  • 【深度学习】矩阵的核心问题解析
  • 【数据结构】(11) Map 和 Set
  • uniapp修改picker-view样式
  • 小迪安全23-php后台模块
  • 【DBeaver】Oracle数据库连接报错:驱动程序 ‘Oracle‘ 的配置错误的解决办法
  • C++(STL)--queue(队列)priority_queue(优先队列)dequeue(双端队列)
  • 深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分
  • uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效