ctf.show_web5

ctf.show web5 完整解题步骤与原理

一、题目代码逻辑拆解

先梳理页面中 PHP 代码的核心规则:

  1. 必须通过 GET 请求传入两个参数 v1v2
  2. 严格的参数校验:
    • v1 必须是纯英文字母ctype_alpha() 校验,仅支持 a-z/A-Z,不能包含数字、符号)
    • v2 必须是纯数字is_numeric() 校验,仅支持 0-9 的数字)
  3. 核心判断:当 md5($v1) == md5($v2) 成立时,直接输出 Flag。

二、核心漏洞原理:PHP 弱类型比较 + MD5 0e 绕过

这道题的考点是PHP 弱类型比较(==) 的经典漏洞,也是 CTF Web 入门的必考知识点:

  1. PHP 中,使用 == 做相等判断时,会自动做类型转换。如果两个字符串的格式是 0e+纯数字,会被解析为科学计数法的浮点数
  2. 科学计数法中,0e 开头的数值本质是 0 × 10的n次方,结果永远等于 0。
  3. 因此,只要两个字符串的 MD5 值都是 0e 开头,它们的弱类型比较结果就会是 true,哪怕原始字符串完全不同。

三、符合要求的 Payload 与解题步骤

1. 筛选符合条件的参数

我们需要找到两组满足校验规则、且 MD5 值为 0e 开头的字符串:

表格

参数 符合要求的取值 校验规则匹配 对应 MD5 值
v1(纯字母) QNKCDZO 全英文字母,通过 ctype_alpha() 校验 0e83040045199378878257216928734
v2(纯数字) 240610708 纯数字,通过 is_numeric() 校验 0e46209743190650901956298873685

补充:你截图里的 v1=byGcY&v2=240610708 同样有效,byGcY 的 MD5 值也是 0e 开头,符合要求。

2. 完整解题操作

  1. 打开题目地址,在浏览器地址栏的 URL 末尾,拼接 GET 参数,最终访问的 URL 为: plaintext

    复制代码
    https://b40a656a-e437-4bb4-b077-f2117008f78b.challenge.ctf.show/?v1=QNKCDZO&v2=240610708
  2. 访问拼接后的 URL,页面会直接输出 Flag。

  3. 复制完整的 Flag,提交到 ctf.show 平台即可完成题目。


四、补充知识点与备用方案

  1. **为什么不用 MD5 强碰撞?**MD5 强碰撞是指两个不同内容生成完全一致的 MD5 值,实现难度高、成本大。这道题用弱类型的 0e 绕过即可,是入门题的标准考点。

  2. 其他可用的备用 Payload

    表格

    纯字母 v1 纯数字 v2
    aabg7XSs 0e215962017
    aabC9RqS 314282422
    s878926199a 342302858
  3. 关键注意点

    • 必须用 GET 方式传参,直接在 URL 拼接即可,无需其他工具
    • 这里的判断是弱比较 ==,如果是强比较 ===,就需要真正的 MD5 碰撞,这道题不涉及
    • ctype_alpha() 不区分大小写,大小写字母均可通过校验;is_numeric() 不能包含小数点、正负号,必须是纯数字。

这两个值是通过暴力枚举(Brute Force) 生成并筛选出来的,是 PHP 弱类型比较漏洞中公认的「经典 Payload」。


一、生成原理与过程

  1. 核心目标 :找到满足以下条件的两组字符串:
    • 第一组(v1):纯字母,MD5 值以 0e 开头,后面全是数字
    • 第二组(v2):纯数字,MD5 值以 0e 开头,后面全是数字
  2. 实现方法:写一个脚本,循环生成随机字符串,计算 MD5,逐一检查是否符合规则。

简单的 Python 枚举示例(理解原理用)

python

运行

复制代码
import hashlib
import random
import string

def find_md5_0e(prefix='', charset=string.ascii_letters, max_len=10):
    """暴力枚举寻找MD5以0e开头的字符串"""
    while True:
        # 随机生成指定字符集的字符串
        length = random.randint(1, max_len)
        s = prefix + ''.join(random.choice(charset) for _ in range(length))
        # 计算MD5
        md5_hash = hashlib.md5(s.encode()).hexdigest()
        # 检查是否符合 0e+纯数字 的格式
        if md5_hash.startswith('0e') and md5_hash[2:].isdigit():
            print(f"找到匹配值:{s}")
            print(f"MD5:{md5_hash}")
            return s

# 示例:找纯字母的(对应v1)
print("正在寻找纯字母的0e开头MD5...")
find_md5_0e(charset=string.ascii_letters)

二、为什么这两个值最常用?

  1. 「经典」的定义 :它们是最早被批量枚举出来、且在 CTF 社区中流传最广的两组值,类似「数学公式」一样被大家记住。
  2. 流传过程
    • 早期安全研究者在研究 PHP 弱类型比较漏洞时,通过脚本跑出来了一批这样的字符串
    • 这些 Payload 被整理成「CTF 常用 Payload 清单」,在各类 Writeup(题解)中反复出现
    • 久而久之,QNKCDZO240610708 就成了这一考点的「标准答案」

三、更多同类常用 Payload(可直接替换)

除了题目中的这两个,以下是同样常用的备选值,遇到同类题可直接用:

表格

纯字母(v1) 对应 MD5 纯数字(v2) 对应 MD5
QNKCDZO 0e83040045199378878257216928734 240610708 0e46209743190650901956298873685
aabg7XSs 0e087386482136013740957780965295 0e215962017 0e291242474110885585856788203760
aabC9RqS 0e041022512123460537604701758222 314282422 0e631149826846557425283880885155
相关推荐
Johny_Zhao9 小时前
网络安全等级保护测评实施方案
linux·网络·人工智能·网络安全·信息安全·云计算·等保测评·系统运维·itsm
菩提小狗10 小时前
每日安全情报报告 · 2026-09-06
网络安全·漏洞·cve·安全情报·每日安全
HackTwoHub16 小时前
BurpSuite2026.8专业(稳定版)下载Windows/Linux/Mac支持Java21以上(新增Burp AT智能体)
linux·运维·服务器·安全·macos·网络安全·自动化
Chockmans17 小时前
SRC---信息收集(灯塔自动化推荐)
网络安全
数据知道17 小时前
YARA 规则编写实战——从样本到检测规则
网络·安全·网络安全
Fnetlink119 小时前
Fnet 云网安 260907
网络·人工智能·安全·web安全·网络安全·智能路由器
学逆向的19 小时前
PE——合并节
开发语言·网络安全·pe
武汉唯众智创19 小时前
计算机网络综合实训室怎么建?2026版建设思路、云平台架构与课程体系深度拆解
网络安全·产教融合·职业教育·计算机网络综合实训室·实训室建设·网络系统建设与运维·网络实训室
锐速网络20 小时前
漏洞管理闭环:扫描、验证、渗透、修复全流程
网络安全·渗透测试·漏洞管理·漏洞修复·漏洞扫描·安全运维·虚拟补丁
上学的小垃圾20 小时前
华为eNSP防火墙USG6000V登录管理方式
网络·网络安全·华为