ctf show web入门107

这是一道典型的 PHP 代码审计 CTF 题目。核心考点在于 parse_str() 函数的变量覆盖漏洞 以及 PHP 的弱类型比较(==)或 MD5 碰撞。

其中最关键的代码是

php 复制代码
$v1 = $_POST['v1'];
$v3 = $_GET['v3'];
parse_str($v1, $v2);
if($v2['flag'] == md5($v3)) {
    echo $flag;
}

突破点:parse_str(v1, v2)parse_str() 的作用是将查询字符串解析到变量中。由于传入了第二个参数 v2,它会把 v1 解析后的结果存入 $v2 数组中。

因为 v1 是我们可以通过 POST 完全控制的,这意味着我们可以任意控制 v2 数组内部的键值对。我们的目标是让 v2′flag′等于md5(v2'flag' 等于 md5(v2′flag′等于md5(v3)。2. 难点:v2′flag′==md5(v2'flag' == md5(v2′flag′==md5(v3)注意这里使用的是 ==(弱类型比较),而不是 ===(全等比较)。

在 PHP 中,弱类型比较存在著名的 0e 漏洞:如果一个字符串以 0e 开头,且后面全都是数字,PHP 在进行 == 比较时,会将其视作科学计数法的数字,其值等于0*10=0。

如果两个不同的字符串经过 MD5 加密后都变成了 0e 开头的纯数字字符串,那么它们在 == 比较时都会被认为是 0,从而判定为相等。

针对这个逻辑,有两种构造 Payload 的方向:

方法一:利用 MD5 弱类型碰撞(推荐,最标准做法)

我们可以找一个经过 MD5 加密后变成 0e 开头且后面全为数字的字符串作为 v3。

常用的 0e 字符串:QNKCDZO

md5('QNKCDZO') 的结果是:0e830400451993494058024219903391

在 PHP 弱类型眼里,这个值等于 0。

构造规则:

令 v3 = QNKCDZO。此时 md5($v3) 的值在弱类型比较中等于 0。

我们需要让 $v2'flag' 在弱类型比较中也等于 0。最简单的办法就是直接让它等于另一个能触发 0e 漏洞的字符串(比如 240610708,其 MD5 也是 0e 开头),或者直接让它等于数字 0。

最终 Payload 构造:

GET 请求(放在 URL 后面):

?v3=QNKCDZO

POST 请求(放在 Body 中):

v1=flag=0 或者 v1=flag=QNKCDZO

(解释:parse_str("flag=0", v2) 会让 v2'flag' 变为 0。比较时 0 == "0e830..." 成立)

方法二:利用数组绕过 md5()

PHP 的 md5() 函数有一个特性:它无法处理数组。如果传入一个数组,md5() 会返回 NULL 并报一个警告,但程序不会奔溃。

如果我们让 v3成为一个数组,那么md5(v3 成为一个数组,那么 md5(v3成为一个数组,那么md5(v3) 的结果就是 NULL。

接着我们让 $v2'flag' 也为 NULL 或者为空,那么 NULL == NULL 就会成立。

最终 Payload 构造:

GET 请求:

?v3\[\]=1 (通过 \[\] 让 v3 变成数组)

POST 请求:

v1=flag= (留空,让 $v2'flag' 解析为 null 或空字符串)

最后得到flag为:ctfshow{0a33a620-3688-477b-b2bb-376e477d413b}

相关推荐
朱涛的自习室几秒前
我让 Gemini 4 当高管、DeepSeek 当员工,开了一家软件公司(Day 1)
android·前端·人工智能
志尊宝3 分钟前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
Capricorn19889 分钟前
一段内容查不出对错时:知芽 Notebook Skill 与 SynthID 检测器的边界
大数据·论文阅读·人工智能·笔记
兔子零102411 分钟前
FastAPI 零基础入门教程:写过 Node.js,就能轻松学会 Python 后端开发(一)
前端·后端·python
事圆则缓15 分钟前
Android 中的 Socket 和 WebSocket:从一条聊天消息看清区别
android·websocket·网络协议
桔筐17 分钟前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
霖霖71423 分钟前
【ESP32笔记】SDIO读写TF卡
笔记·单片机·嵌入式硬件·mcu·物联网
小马过河R36 分钟前
EdgeOne深度解析:从原理、适用场景到COS接入的技术逻辑
java·开发语言·前端·spring·cos
星恒随风37 分钟前
Linux进程间通信(二):深入理解System V共享内存、消息队列、信号量与内核IPC资源管理
linux·运维·服务器·笔记·学习·状态模式
商业白皮书39 分钟前
企业通过API调用大模型,推荐哪些具备数据隐私保护能力的平台?
大数据·人工智能·笔记