比赛界面截图

这次打的是江苏省第四届数据安全技术应用职业技能竞赛初赛。题目整体很贴近真实数据安全场景:代码仓库泄露、门店音频隐私、AI 客服越权溯源、SQL 盲注日志还原,以及最后一组杂项数据泄露/脱敏/通话外泄题。

先说明一下边界:本文由比赛过程记录、赛后整理和赛后 AI 辅助补解共同合并而成。现场已经确认的部分会直接写结论;赛后继续分析出来的内容会明确标注;仍未完全做出的题不会伪装成现场解出。

题目一:源码泄露

附件给了仓库服务器快照和泄露源码样本。核心思路是把 SSH 登录日志、授权公钥、Git bare 仓库和临时文件恢复结果串起来。

auth.log 中异常成功登录来自 10.18.8.73,日志给出 key_fp_prefix=SHA256:s1BnYrBJr15crI。对照 authorized_keys 中的四把公钥,并按 build_temp_bundle.py 暗示的 OpenSSH 指纹前缀规则计算后,可以定位到 ops-release-mirror 这把密钥。

泄露源码版本通过样本文件内容和服务器 bare 仓库对象匹配,定位到对应 commit:

1
2561d4af185e4e4d1dc1af4f6deedece003ffa6e

临时文件部分则从 /srv/git/tmp/deleted_blocks/block_0017.bin 中恢复被删除的 mirror-*.tgz 残留,计算 SHA256 前 16 位:

1
d12e8b053a56ed7b

题目二:隐私泄露

这一题由三块组成:WAV 音频隐写、边缘盒子缓存镜像、总部同步流量。

现场先从边缘盒子镜像中恢复 SQLite 缓存数据库,发现 audio_cache 表里只有一条记录仍处于 wal_pending,对应未按要求清理的敏感缓存:

1
AUD-LEFT-9C42A1

赛后继续补解时,这个批次号又变成了流量解密的 XOR key。把 PCAP 中的 STORE-CHUNK/4.0streamseq 重组,对 daily_a03_mid_117 使用 AUD-LEFT-9C42A1 解 XOR,再 zlib 解压,得到明文:

1
2
3
4
5
6
7
8
9
10
11
{
"audio_batch": "AUD-LEFT-9C42A1",
"policy": "headquarter_v3",
"payload": {
"audio_ref": "STORE-A03_20260421_090819.wav#lsb",
"device_sn": "EDGEBOX-A03-SN-882194",
"stego_profile": "pcm_lsb_v1",
"retention": "raw-feature-package"
},
"sync_trace": "UPLINK-RAW-6E91B3"
}

所以同步追踪码为:

1
UPLINK-RAW-6E91B3

同一段明文还提示了真正藏码的音频文件:STORE-A03_20260421_090819.wav#lsb。提取 PCM 最低位后得到:

1
YLSTEG:482913:END

因此 6 位核验码是:

1
482913

题目三:AI 客服溯源

这一题需要把网关日志、模型调用日志、检索链路日志、权限决策日志和 DLP 告警交叉起来看。

最早能够被多源共同佐证的敏感信息披露会话是:

1
SESS-20260418-093817

继续沿着 RAG 检索链路和 ACL 决策看,问题集中在租户过滤配置上。关键配置项为:

1
tenant_filter_required

结合发布记录,异常回复集中出现的策略版本为:

1
support_claims_r2_20260418

这个题的坑点不在单个日志,而在“deny 了但后续链路仍把上下文带给模型”的跨组件证据链。

题目四:数据溯源与校验

题目给了 7 万多行访问日志,攻击者通过 SQL 布尔盲注逐位读取 user_info 表中的银行卡号。判断条件主要看响应长度差异:47 bytes 表示条件为真,24 bytes 表示条件为假。

把每条请求中的 idpos、阈值和响应大小整理后,可以还原 500 条 id,id_card。按 id 升序拼成标准字符串后计算 MD5:

1
b7d1ee7e0856d1845fe7d4822ae2f6ab

再按卢恩算法校验银行卡号,未通过校验的 ID 为:

1
36_127_173_288_307_467

题目五:综合题

这一组更像多个小题打包。

第一个数据泄露题给的是 Base64 字符串,直接解码即可得到姓名、编号和身份证号。题目要编号:

1
S20251002

通话外泄题是双声道 WAV。DLP 告警指出右声道存在 700-1500Hz 规则音调,USB 日志里也能看到 DTMF-MOD v0.3 设备接入。对右声道做 DTMF 解码,并用 Luhn 校验,得到 19 位银行卡号:

1
6228480001234567897

数据加密题涉及 CGL 后量子哈希,需要在 GF(p^2) 的 2-同源图上从 start_j 搜到 target_j,再用 SHA256(str(secret_path))[:16] 解 AES-CBC。赛后已分析出参数和起始邻居,但本地缺 SageMath 环境,图搜索没有完成。

数据脱敏题确认了目标哈希是标准 SM3,单纯枚举 YYYY-MM-DDYYYYMMDD 等生日格式没有命中。后续判断输入可能包含姓名、电话、邮箱或程序内盐值,这一题目前仍保留为未完全还原。

答案汇总

题目 答案
1-1 SSH 指纹 SHA256:s1BnYrBJr15crIh48E/6UHuJKM2ZEARymspEhTjaQhU
1-2 Git commit 2561d4af185e4e4d1dc1af4f6deedece003ffa6e
1-3 临时文件 SHA256 前 16 位 d12e8b053a56ed7b
2-1 音频核验码 482913
2-2 音频缓存批次 AUD-LEFT-9C42A1
2-3 同步追踪码 UPLINK-RAW-6E91B3
3-1 异常会话 ID SESS-20260418-093817
3-2 配置项 tenant_filter_required
3-3 策略版本 support_claims_r2_20260418
4-1 数据溯源 MD5 b7d1ee7e0856d1845fe7d4822ae2f6ab
4-2 Luhn 异常 ID 36_127_173_288_307_467
5-1 编号 S20251002
5-2 数据加密 未完成,赛后仍需 SageMath 图搜索
5-3 数据脱敏 未完成,疑似非纯生日 SM3
5-4 通话外泄银行卡号 6228480001234567897

复盘

这套题最舒服的地方是证据之间能互相咬合。比如第 2 题的缓存批次既是镜像答案,又是 PCAP 解密 key;PCAP 解出的明文又反过来指向具体 WAV 的 LSB 隐写。题目没有只考单点工具,而是在逼人把文件系统、流量、音频和日志证据串成一条链。

不足也很明显:现场时间里有些方向没有及时连起来,尤其是“一个答案可能是下一问 key”这种 CTF 常见设计,后面还是要更敏感一点。赛后 AI 辅助整理的价值主要在于帮我把分散笔记、脚本思路和原始附件重新对齐,但最终结论还是需要用原件跑脚本验证,不能只靠看起来合理。