ctf show web入门90

这是一个经典的 PHP 弱类型与函数特性绕过的 CTF 题目。我们的目标是让代码执行到 echo $flag;,也就是需要同时满足两个条件。

下面为你梳理详细的解题思路:

我们需要分析接收参数 $num 后的逻辑控制流:

if($num==="4476"){

die("no no no!");

}

含义:使用强等于 === 校验。如果传入的 $num 严格等于字符串 "4476",程序直接终止。

策略:我们传入的值绝对不能是普通的 "4476"。

if(intval($num, 0)===4476){

echo $flag;

}

含义:使用 intval($num, 0) 处理后,其整数值必须严格等于整数 4476。

关键点:注意 intval 的第二个参数是 0。当 base 为 0 时,PHP 会根据字符串的前缀来自动检测并转换进制:

如果字符串以 0x 或 0X 开头,视为十六进制。

如果字符串以 0 开头,视为八进制。

如果字符串是正常的数字,视为十进制。

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

要同时满足**"不等于字符串 '4476'"但"整数转换后等于 4476"**,有以下几种常见的绕过技巧:

方法一:八进制绕过(推荐)

将十进制的 4476 转换为八进制。因为 intval($num, 0) 中基数为 0,当我们传入以 0 开头的八进制字符串时,它会将其自动转为十进制的 4476。

Payload 1:?num=010574

方法二:十六进制绕过

将十进制的 4476 转换为十六进制。

4476 的十六进制是 117c。

在 PHP 中,以 0x 开头会被识别为十六进制。

Payload 2:?num=0x117c

方法三:数字+字符串绕过(PHP 弱类型特性)

intval() 函数在转换非标准数字字符串时,会从左往右读取,直到遇到非数字字符为止。

例如,intval("4476a") 的结果就是 4476。

由于 "4476a" === "4476" 为 false,可以完美绕过第一个 if。

Payload 3:?num=4476a 或 ?num=4476.5

方法四:正负号或空格绕过

添加正号:" +4476" 强等于校验不通过,但 intval() 转换后依然是 4476。

Payload 4:?num=+4476 或 ?num= 4476%20

相关推荐
丨白色风车丨5 分钟前
LangChain Agent 从入门到实战:创建与调用参数全解析
前端·python·langchain
qq_284274053 小时前
机械设计基础·滚动轴承全解(类型·代号·选型·寿命)+轮系与蜗杆蜗轮传动
笔记·学习·自动化·制造
ACP广源盛139246256738 小时前
硬件选型笔记:国产 PCIe Gen2.1 交换芯片 IX6024@ACP,工控与存量设备国产化改造方案评估
笔记·硬件架构·硬件工程·pcie·国产芯片
Jmyd01238 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
砚凝霜8 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
文人sec9 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
u01110267510 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
摇滚侠10 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
xier_ran10 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
志尊宝10 小时前
Vue3 零基础每日笔记(078):首屏加载速度优化汇总——清单化方案
笔记