(1)0e类md5值
PHP在进行“==”(弱类型比较)时,会先转换字符串类型,再进行字符串比较,而进行md5后以0e开头的都会被PHP识别为科学计数法,即0e被视作0的次方,结果都为0,故我们只需找到md5后为0e的字符串,常用md5后为0e的有:
txt
字符串 对应md5值
240610708 0e462097431906509019562988736854
QLTHNDT 0e405967825401955372549139051580
QNKCDZO 0e830400451993494058024219903391
PJNPDWY 0e291529052894702774557631701704
NWWKITQ 0e763082070976038347657360817689
NOOPCJF 0e818888003657176127862245791911
MMHUWUV 0e701732711630150438129209816536
MAUXXQC 0e478478466848439040434801845361
(2)GBK编码和UTF-8编码计算的MD5差异性
GBK编码和UTF-8编码计算的MD5值通常不一样,因为相同的汉字在不同编码下对应的字节序列不同,而MD5是对字节(而非字符本身)进行哈希计算的。
原因分析
编码差异
- 同一个中文字符在GBK和UTF-8中会被编码为不同的字节序列。
- 例如“中”字:
- GBK:
0xD6 0xD0
(2字节) - UTF-8:
0xE4 0xB8 0xAD
(3字节)
- GBK:
- 例如“中”字:
- MD5算法直接对字节流计算哈希值,因此编码不同必然导致MD5不同。
- 同一个中文字符在GBK和UTF-8中会被编码为不同的字节序列。
示例验证
以字符串“中文”为例:- GBK编码字节:
0xD6 0xD0 0xCE 0xC4
MD5:b4d3f3b1a23ca5d4e8e5f5d5f5d5f5d
(示例值,实际需计算) - UTF-8编码字节:
0xE4 0xB8 0xAD 0xE6 0x96 0x87
MD5:a7d8f3b1a23ca5d4e8e5f5d5f5d5f5d
(示例值,实际需计算) - 结果明显不同。
- GBK编码字节:
关键结论
- MD5依赖字节流:只要输入的字节序列不同(即使字符含义相同),MD5结果就不同。
- 编码一致性重要:在需要对比MD5的场景(如文件校验、数据一致性检查),必须确保编码方式统一(全部用GBK或全部用UTF-8)。
实际场景建议
- 跨系统通信: 明确约定编码(如HTTP头声明
Content-Type: text/plain; charset=utf-8
),避免因编码差异导致MD5不匹配。 - 文件存储: 在保存文件时注明编码格式(如UTF-8 with BOM),防止解码错误。
- 编程处理:
- Python示例:python
import hashlib text = "中文" md5_gbk = hashlib.md5(text.encode('gbk')).hexdigest() # GBK编码的MD5 md5_utf8 = hashlib.md5(text.encode('utf-8')).hexdigest() # UTF-8编码的MD5 print(md5_gbk != md5_utf8) # 输出 True
- Python示例:
特殊情况
如果文本仅包含ASCII字符(如英文、数字),则GBK和UTF-8的编码字节相同(均为1字节),此时MD5值会相同。
例如字符串"hello":
- GBK和UTF-8编码均为
0x68 0x65 0x6C 0x6C 0x6F
,MD5结果一致。
总结
- 中文字符:GBK和UTF-8的MD5值不同(因编码字节不同)。
- 纯ASCII字符:MD5值相同(因编码字节一致)。
- 务必统一编码:在需要一致性校验的场景中,明确编码标准是关键!
(3)题目复现
题目:[审计]
- 题目来源:polarctf-web-[审计]
- 解题:
php
no no no! <?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['xxs'])) { # 要求get传参xxs
$input = $_GET['xxs'];
if (is_array($input)) { # 要求xss不为数组
die("错误:输入类型不允许为数组。");
}
if (!preg_match("/^0e[0-9]+$/", md5($input))) { # 要求xxs的md5值以0e开头,且后边跟着数字
die("错误:输入的MD5值必须以'0e'开头,并跟随数字。");
}
if (!is_numeric($input)) { # 要求xxs为数字
die("错误:输入必须是数字。");
}
die("恭喜:".$flag);
} else {
die("错误:必须设置正确参数。");
}
?>
错误:必须设置正确参数。
240610708
的md5值为0e462097431906509019562988736854
,满足题意,payload:
?xxs=240610708
得到flag
题目:[0e事件]
- 题目来源:polarctf-web-[0e事件]
- 解题:
根据题意上传一个特殊的字符串240610708
,其md5值以0e
开头