ctf show web入门 89

这是一道非常经典的 PHP 弱类型与正则表达式绕过的 CTF 题目。我们需要满足两个看似矛盾的条件来获取 $flag。

以下是完整的解题思路分析:

  1. 代码核心逻辑分析

我们先来看代码:

要拿到 flag,你的输入 ?num=xxx 必须同时满足以下两个条件:

条件一: preg_match("/0-9/", $num) 必须为 假 (False)。这意味着你的输入字符串中绝对不能包含任何 0 到 9 的数字,否则程序直接报错退出。

条件二: intval($num) 必须为 真 (True)。这意味着将你的输入转换成整数时,其值必须不等于 0(在 PHP 中,非 0 数字在 if 判断中会被视为 true)。

intval() 是 PHP 中的一个内置函数,全称是 integer value,它的核心功能是:获取变量的整数值。

简单来说,就是把各种类型的数据(字符串、浮点数、布尔值、数组等)强制转换成一个整数(Integer)。

  1. 解题思路(绕过方法)

不能包含数字,但转换成整数又不能是 0,这该怎么做?这就需要利用 PHP 的特性了。

原理: preg_match 的第一个参数预期接收的是一个字符串。如果你传入一个数组(例如 ?num\[\]=),preg_match 无法处理数组,会返回 false(或者报错,但不会触发 die)。

而在 PHP 中,intval(array()) 会根据数组是否为空来返回值。一个非空数组(例如 array(1) 或 array('a'))经 intval() 转换后,其结果是 1。

1 在 if 判断中代表 true,成功绕过!

Payload 构造:

?num\[\]=a

为什么?num=a不行

如果我们传入 ?num=a,确实可以通过第一个条件(因为 a 里面没有数字,preg_match 不会报错),但它会死在第二个条件上。在安全领域(如 CTF 或防 SQL 注入)中,intval() 对字符串的解析特性非常关键:

从左往右解析: intval() 会从字符串的左边第一个字符开始检查。

如果一开始就是数字,它会一直读到第一个非数字字符为止,然后把前面的数字转成整数。

如果一开始就不是数字(且不是正负号或空格),它会直接放弃,返回 0。

在第二关时,程序执行了 intval("a"):

intval() 看到字符串的第一个字符是 'a'。

因为 'a' 不是数字,也不是正负号,intval() 无法解析,于是直接摆烂,返回了 0。

此时代码相当于变成了:if(0)。

在 PHP 的逻辑判断中,0 代表 false(假)。

因为 if(false) 条件不成立,所以大括号里的 echo $flag; 不会被执行。页面最终会是一片空白,你什么也拿不到。

为什么 ?num\[\]=a (带数组)就可以?

既然单纯的字母不行,为什么加个方括号变成数组就可以呢?

echo intval(array()); // 空数组,输出 0

echo intval(array('a')); // 非空数组,输出 1

第一关: preg_match("/0-9/", $num)。前面提到过,preg_match 只能处理字符串。面对数组,它会直接报错并返回 false。因为返回的是 false,所以不会触发 if 里面的 die(),第一关通过。

第二关: if(intval($num))。根据 PHP 的规则,intval(一个非空数组) 的结果永远等于 1。

代码变成了 if(1)。在 PHP 中,1 代表 true(真),条件成功成立,顺利打印出 flag!

总结

?num=a \rightarrow intval("a") 变成了 0(假) \rightarrow 失败

?num\[\]=a \rightarrow intval(array("a")) 变成了 1(真) \rightarrow 成功

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
一隅论数智1 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js