Skip to content

(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是对字节(而非字符本身)进行哈希计算的。

原因分析

  1. 编码差异

    • 同一个中文字符在GBK和UTF-8中会被编码为不同的字节序列。
      • 例如“中”字:
        • GBK:0xD6 0xD0(2字节)
        • UTF-8:0xE4 0xB8 0xAD(3字节)
    • MD5算法直接对字节流计算哈希值,因此编码不同必然导致MD5不同。
  2. 示例验证
    以字符串“中文”为例:

    • GBK编码字节0xD6 0xD0 0xCE 0xC4
      MD5:b4d3f3b1a23ca5d4e8e5f5d5f5d5f5d(示例值,实际需计算)
    • UTF-8编码字节0xE4 0xB8 0xAD 0xE6 0x96 0x87
      MD5:a7d8f3b1a23ca5d4e8e5f5d5f5d5f5d(示例值,实际需计算)
    • 结果明显不同。

关键结论

  • MD5依赖字节流:只要输入的字节序列不同(即使字符含义相同),MD5结果就不同。
  • 编码一致性重要:在需要对比MD5的场景(如文件校验、数据一致性检查),必须确保编码方式统一(全部用GBK或全部用UTF-8)。

实际场景建议

  1. 跨系统通信: 明确约定编码(如HTTP头声明Content-Type: text/plain; charset=utf-8),避免因编码差异导致MD5不匹配。
  2. 文件存储: 在保存文件时注明编码格式(如UTF-8 with BOM),防止解码错误。
  3. 编程处理
    • 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

特殊情况

如果文本仅包含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-[审计]

image-20250428144616504

  • 解题:
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

image-20250428144908999.png

题目:[0e事件]

  • 题目来源:polarctf-web-[0e事件]

image-20250429083630459

  • 解题:

根据题意上传一个特殊的字符串240610708,其md5值以0e开头

image-20250429083701803

滇ICP备2025057983号-1