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

ctf show web入门101

这是一道代码审计与绕过题
所以我们先看代码

我们发现一个核心就是

v0=is_numeric(v1)andisnumeric(v1) and is_numeric(v1)andisnumeric(v2) and is_numeric(v3);if(v3); if(v3);if(v0){
if(!preg_match(“/\\|/|~|`|!|@|#|\$|%|^|*|)|-|_|+|=|{|[|”|‘|,|.|;|?|[0-9]/“, $v2)){
if(!preg_match(”/\\|/|~|`|!|@|#|\$|%|^|*|(|-|_|+|=|{|[|"|’|,|.|?|[0-9]/“,KaTeX parse error: Expected '}', got 'EOF' at end of input: … eval("v2(‘ctfshow’)$v3”);
}
这里看似要求v1、v1、v1v2、v3必须全部为数字。但这其实是一个经典的PHP优先级陷阱!赋值运算符=的优先级高于逻辑运算符and。因此,这行代码在实际执行时等价于:(v3 必须全部为数字。但这其实是一个经典的 PHP 优先级陷阱! 赋值运算符 = 的优先级高于逻辑运算符 and。 因此,这行代码在实际执行时等价于: (v3必须全部为数字。但这其实是一个经典的PHP优先级陷阱!赋值运算符=的优先级高于逻辑运算符and。因此,这行代码在实际执行时等价于:(v0 = is_numeric(v1))andisnumeric(v1)) and is_numeric(v1))andisnumeric(v2) and is_numeric($v3);

所以只要v1为数字,$v0就是true我们要利用v2v3来构造payload
但是代码对v2v3进行了严格的正则匹配过滤
我们观察发现v2过滤了;但是没过滤(
v3过滤了(但是没过滤;
现在我们的目的就是构造一个合法的php语句

既然提示说了 flag in class ctfshow,并且代码本身已经实例化了该类:$ctfshow = new ctfshow();。我们需要通过某些反射、命名空间或输出函数来把这个对象的内容打印出来。
在 PHP 中,像 var_dump、print_r 这样的函数由于包含了下划线 _(被v2过滤了),无法直接使用。我们可以选择使用echo或getdefinedvars(但含有下划线不可用),或者直接利用类名与特殊函数。构造方法一:利用ReflectionClass(反射类)PHP的ReflectionClass可以直接输出一个类的完整结构(包括属性和静态变量)。我们希望最终eval执行的语句是:echonewReflectionClass(′ctfshow′);对照拼接模板:v2 过滤了),无法直接使用。 我们可以选择使用 echo 或 get_defined_vars(但含有下划线不可用),或者直接利用 类名与特殊函数。 构造方法一:利用 ReflectionClass(反射类) PHP 的 ReflectionClass 可以直接输出一个类的完整结构(包括属性和静态变量)。 我们希望最终 eval 执行的语句是:echo new ReflectionClass('ctfshow'); 对照拼接模板:v2过滤了),无法直接使用。我们可以选择使用echogetdefinedvars(但含有下划线不可用),或者直接利用类名与特殊函数。构造方法一:利用ReflectionClass(反射类)PHPReflectionClass可以直接输出一个类的完整结构(包括属性和静态变量)。我们希望最终eval执行的语句是:echonewReflectionClass(ctfshow);对照拼接模板:v2(‘ctfshow’)$v3
我们令:
$v2 = echo new ReflectionClass
$v3 = ;
检查过滤:
$v2(echo new ReflectionClass):没有数字,没有被过滤的特殊字符。满足条件
v3(;):v3(;):v3;):v3 的黑名单里没有分号 ;。满足条件

所以我们构造的payload为:
?v1=1&v2=echo new reflectionclass&v3=;


这里发现flag格式跟之前不同首先把0x2d改为-因为在 ASCII 编码中,十进制 45 对应字符 -(连字符/减号)
然后再套上一层ctfshow{}外壳

在 PHP 中,使用 echo new ReflectionClass(‘ctfshow’); 能够直接输出 flag,是因为 PHP 的“反射机制” 具有直接透视对象内部结构的能力,并且触发了 PHP 的 自动字符串转换(__toString 魔术方法)。
为了让你彻底明白,我们可以把它拆解为两个核心原理:

  1. 什么是 ReflectionClass(反射类)?
    在正常的面向对象编程中,如果你想看一个类里面的内容,你必须先知道它的属性名或方法名,然后去调用它。如果类里的变量是私有的(private 或 protected),外部甚至无法直接访问。
    而 ReflectionClass 是 PHP 自带的一个内置“上帝视角”工具。
    它的作用是逆向工程。只要你把类名(‘ctfshow’)传给它,它就会把这个类的所有秘密全部提取出来。
    无论是公共属性、私有属性、静态变量、方法,还是类中定义的常量(Flag 通常藏在这里),都会被它一览无余地抓取到内存中。
  2. 为什么配合 echo 就能直接打印出来?
    通常情况下,echo 只能用来打印字符串(比如 echo “hello”;)。如果你尝试 echo 一个普通的对象,PHP 会直接报错:Object of class X could not be converted to string。
    但是,PHP 的内置 ReflectionClass 内部实现了一个特殊的魔术方法:__toString()。
    运作流程:
    实例化:new ReflectionClass(‘ctfshow’) 创建了一个反射对象,里面包含了 ctfshow 类的所有结构信息。
    触发转换:当你对这个反射对象执行 echo 时,PHP 会自动去调用这个对象内部的 __toString() 方法。
    格式化输出:ReflectionClass 的 __toString() 被设计得非常智能,它会自动把这个类的结构格式化为一个排版漂亮的纯文本字符串
http://www.jsqmd.com/news/971005/

相关文章:

  • 2026格雷斯代理商合作参考:行业服务与技术支持解析 - 品牌排行榜
  • 当 AI 帮我写代码时,我学到了什么?
  • 书匠策AI官网www.shujiangce.com:别再死磕期刊论文了!
  • 如何3分钟快速转换音乐格式:终极音频解密工具完全指南
  • 风力涡轮机雷达信号仿真附matlab代码
  • 如何实现企业级加密压缩包密码恢复:高效自动化解决方案指南
  • MPC Video Renderer(MPC视频渲染器)
  • 类器官3D打印品牌推荐及行业选择参考 - 品牌排行榜
  • ㉖ 总结篇:AI副业全景图与行动路线
  • 2026旋光仪采购渠道推荐:国内外优质选择指南 - 品牌排行榜
  • 红榜还是坑?PDF转图片清晰度与画质调节功能实测(2026三款微信工具详解) - 时时资讯
  • 基于栅格地图ACO、A、RRT算法对比的无人机三维路径规划算法matlab代码
  • Shizuku v13.6.0架构革新:Android系统权限代理技术的范式突破
  • 5分钟快速上手:BetterJoy开源工具让你的Switch手柄变身PC全能游戏控制器
  • 书匠策AI官网www.shujiangce.com:揭秘一个让导师都查不出来的期刊论文“流水线“,附完整拆解
  • TapinRadio Pro(全球电台收音机)
  • Java线程学习心得
  • 终极百度网盘高速下载解决方案:3分钟掌握pan-baidu-download命令行神器
  • 终极网盘直链下载助手:如何一键获取八大网盘真实下载地址的完整指南
  • 终极指南:在Mac上免费高效运行Windows程序的完整解决方案
  • 【单相交流电压控制器】模拟带有两个背靠背连接的晶闸管的单相交流电压控制器附Simulink仿真
  • CLAUDE.md 是什么?它是所有 Skill 的总开关
  • 导师严选 2026 最新降AI率网站测评与推荐 - 降AI小能手
  • 南充第三方CMACNAS甲醛检测治理口碑名单:清诚CMA检测中心等5家深度测评 - aZJ-111
  • 系统常用运行库(CSRLPackage
  • 3个理由选择PySD:重新定义Python中的系统动力学建模体验
  • Windows下C++程序崩溃:Critical error c0000374的三种触发时机与实战排查指南
  • CSDN AI营销文案百度首页命中率仅11.7%(实测217篇),而加入这1个权威信源锚点后飙升至83.6%
  • 出口立式灯箱常见光衰、眩光与散热问题诊断及优化方案
  • 构建企业级网络压力测试的完整解决方案:LOIC深度实践指南