1. 题目背景与初步观察这道来自BJDCTF2020的题目名为Cookie is so stable从标题就能看出考察点与Cookie和某种stable技术相关。结合BUUCTF平台特性这是一道典型的Web安全挑战题。我初次打开题目环境时首先注意到的是一个简单的登录页面页面上方有明显的Welcome to BJDCTF2020标题。在没有任何线索的情况下我习惯性地先查看页面源代码。通过Chrome开发者工具检查发现页面底部有一行注释!-- Hint: What makes you stable? --这个提示相当关键。stable一词在Web安全领域通常有两种解读一是暗指PHP的SSTIServer-Side Template Injection因为PHP的模板引擎Twig的吉祥物就是一只名为Stable的企鹅二是指向Stable版本软件可能存在的漏洞。结合题目名称中的Cookie我初步判断这可能是一道关于Twig模板注入的题目。2. Cookie分析与参数测试2.1 基础Cookie操作首先我尝试在登录页面随便输入用户名密码发现无论输入什么都会跳转到一个欢迎页面URL为/welcome.php。使用Burp Suite拦截请求观察到服务器设置了如下CookieSet-Cookie: userguest; path/这验证了题目名称中Cookie的提示。我立即尝试修改这个Cookie值将其从guest改为admin后刷新页面但页面内容没有任何变化说明简单的Cookie值修改并不能直接获取flag。2.2 SSTI可能性验证考虑到Twig模板引擎的特性我尝试在Cookie值中注入模板语法。将Cookie修改为user{{7*7}}刷新页面后发现Cookie值被显示在页面上的欢迎信息中且显示的内容是49而不是原始字符串。这明确证实了服务器确实使用了Twig模板引擎并且存在SSTI漏洞。注意不同模板引擎的测试payload有所不同。Twig使用双花括号{{}}作为模板标记而Jinja2等其他引擎可能有不同的语法。准确识别模板引擎类型对后续利用至关重要。3. Twig SSTI深入利用3.1 Twig环境探测确认SSTI存在后下一步是探测Twig的环境和可用功能。我尝试了以下payloaduser{{_self}}这个payload返回了Twig的模板类信息证实了服务器使用的是Twig 1.x版本因为Twig 2.x和3.x对_self的输出格式有所不同。接着尝试user{{_self.env}}这个payload返回了服务器环境变量包括关键的系统路径信息。值得注意的是Twig的沙箱机制通常会限制某些危险函数的调用但通过_self这个特殊变量可以绕过部分限制。3.2 文件系统访问为了读取服务器上的文件我构造了以下payloaduser{{[cat /etc/passwd]|filter(system)}}这个payload利用了Twig的filter功能调用系统命令。然而服务器返回了错误信息提示system函数被禁用。这说明服务器配置了较为严格的安全限制需要寻找其他途径。于是转向文件读取使用user{{app.request.server.get(DOCUMENT_ROOT)}}成功获取到网站根目录路径后尝试读取网站源码user{{/var/www/html/flag.php|file_excerpt(0,100)}}这个payload成功读取到了flag.php的部分内容但发现文件内容被截断。于是改用user{{file(/var/www/html/flag.php)}}最终成功获取到完整的flag.php文件内容其中包含了我们需要获取的flag。4. 解题过程中的关键技巧4.1 Twig沙箱绕过技术在较新版本的Twig中开发者通常会启用沙箱模式来限制危险函数的使用。这道题目中的几个关键绕过技巧包括使用_self模板变量访问环境信息利用filter过滤器调用PHP函数通过app.request.server获取服务器配置信息特别值得注意的是Twig 1.x和2.x/3.x的payload构造方式有所不同。这道题目使用的是Twig 1.x所以一些在新版本中可用的payload可能无效。4.2 文件读取的多种方法当直接命令执行被禁用时文件读取是获取flag的常用方法。在Twig环境下除了使用file()函数外还可以尝试user{{include(/etc/passwd)}}或者user{{source(/var/www/html/index.php)}}不同的函数可能绕过不同的安全限制需要根据实际情况尝试。5. 完整解题步骤总结访问题目页面观察基础功能检查页面源代码发现提示注释修改Cookie值测试SSTI可能性确认Twig模板注入漏洞存在通过_self变量探测Twig环境尝试直接命令执行通常会被禁用转向文件读取方式获取flag定位flag文件路径并读取内容从文件内容中提取flag6. 防御措施与安全建议从防御角度开发者应该避免直接将用户输入作为模板内容渲染及时更新Twig到最新版本3.x严格配置沙箱模式禁用危险函数对必须使用的用户输入进行严格过滤考虑使用静态模板而非动态渲染这道题目展示了即使是一个简单的Cookie参数如果处理不当也可能导致严重的服务器端漏洞。在实际开发中应该对所有用户可控输入保持高度警惕。