江苏省第四届数据安全技术应用职业技能竞赛初赛复盘

这次打的是江苏省第四届数据安全技术应用职业技能竞赛初赛。题目整体很贴近真实数据安全场景:代码仓库泄露、门店音频隐私、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.0 按 stream 和 seq 重组,对 daily_a03_mid_117 使用 AUD-LEFT-9C42A1 解 XOR,再 zlib 解压,得到明文:
1 | { |
所以同步追踪码为:
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 表示条件为假。
把每条请求中的 id、pos、阈值和响应大小整理后,可以还原 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-DD、YYYYMMDD 等生日格式没有命中。后续判断输入可能包含姓名、电话、邮箱或程序内盐值,这一题目前仍保留为未完全还原。
答案汇总
| 题目 | 答案 |
|---|---|
| 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 辅助整理的价值主要在于帮我把分散笔记、脚本思路和原始附件重新对齐,但最终结论还是需要用原件跑脚本验证,不能只靠看起来合理。



