【WEB】[BJDCTF2020]Easy MD5

**考点:**md5($str, true) 原始二进制,ffifdyop 经典串,PHP弱比较和强比较,md5数组绕过

打开题目,是个查询框:

bp抓包,看响应头,能够发现:

sql 复制代码
select * from 'admin' where password=md5($pass,true)

md5() 有两种输出格式:

php 复制代码
md5("hello")        // 默认 raw=false → 返回 32 位十六进制字符串
                    // 结果:5d41402abc4b2a76b9719d911017c592

md5("hello", true)  // raw=true → 返回 16 字节"原始二进制"
                    // 结果:]A@*v... (一堆乱码/不可见字符)

这段sql语句 的意思是:我们输入的密码 $pass,先算 md5($pass, true)(注意是 true,吐二进制 ),然后把结果直接拼进 SQL 语句去查数据库。

换算过来就是:

sql 复制代码
select * from 'admin' where password='你输入的密码的md5值'

因为 md5($pass, true) 吐的是二进制乱码 ,而这串乱码被直接塞进 SQL 的字符串里 。所以我们需要找到一个字符串,它的 MD5 二进制里恰好包含 'or' 这几个字符

ffifdyop就符合这个要求:

第一步 :算 ffifdyop 的普通 MD5(32 位十六进制):

sql 复制代码
md5('ffifdyop') = 276f722736c95d99e921722cf9ed621c

第二步 :把前几位十六进制转成 ASCII 字符:

十六进制 转成 ASCII 字符 说明
27 '(单引号) 字符串开头的引号
6f **o**​ 字母 o
72 **r**​ 字母 r
27 '(单引号) 字符串结尾的引号
36 **6**​ 数字 6

第三步:拼进 SQL:

sql 复制代码
-- 原本应该是:
select * from 'admin' where password='xxxx一堆乱码'

-- 实际变成:
select * from 'admin' where password=''or'6É]é!r,ùíb'
  • password = '' → 密码等于空字符串 → 假(false)
  • or → 或者(这是逻辑"或")
  • '6É]é!r,ùíb' → 一个以数字 6 开头的字符串 → MySQL 把它转成数字时取开头的 6,非零 = 真(true)

假 OR 真 = 真​ → 整个 WHERE 条件恒为真​ → 数据库返回 admin 的所有记录 → 登录绕过

成功后进入下一个页面:

查看网页源代码:

能看到有两个条件必须同时满足:

  1. $a != $b → a 和 b 原值不相等 (用 != 弱比较判断不等)
  2. md5($a) == md5($b) → a 和 b 的 MD5 值弱相等 (用 == 弱比较)

在PHP中,有个方法叫做数组绕过,因为PHP 的 md5() 无法处理数组 ,传入数组会返回 NULL(并报 Warning 但不中断)。两个 NULL 弱相等(NULL == NULL 为 true),而 a[] 和 b[] 原值又不相等 → 条件满足

所以我们可以构造:

sql 复制代码
?a[]=1&b[]=2

在url中添加后跳转:

要求 :POST 传 param1、param2,原值不全等 ,但 md5() 结果强全等 (=== 要求值和类型都相同)。

然而数组绕过依然有效...... md5(数组) 返回 NULL,两个 NULL 在 === 下值和类型都相同(都是 NULL)→ 强全等成立。

所以我们可以构造:

sql 复制代码
param1[]=1&param2[]=2

在POST里提交:

相关推荐
李兆龙的博客6 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
倔强的石头_8 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间8 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西8 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西9 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹9 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座
loong_XL11 小时前
决策模型做内容安全检测:从踩坑到上线
数据库·安全·jev·决策模型
这个DBA有点耶11 小时前
数据库双轨并行实战:全量并行策略、增量延迟控制、双向回切与一致性校验
数据库·架构·dba
adinnet202612 小时前
保单、赔付与渠道问数:保险经营数据如何实现按需查询
大数据·数据库·人工智能
云贝贝贝12 小时前
PostgreSQL 分区表:从设计到运维,大表不再卡
运维·数据库·postgresql