首先打开题目,发现有个flag,点进去,出现一个输入框,叫我们输入ID.先不着急输,打开BP一边抓包一边输
随便输几个字看下效果
做到这里有点懵,没思路了,看了下大佬的WP,GET到一个新的知识点,服务端模板注入攻击
服务端模板注入链接:1. SSTI(模板注入)漏洞(入门篇) - bmjoker - 博客园 (cnblogs.com)
- 服务端模板注入攻击:
网站使用了一些框架语言使前端与数据分开,这类框架语言便是模板,以本题举例,如果在flag页面多尝试几次就会发现,只要是输入正常的内容,都会回显出Hello + “你输入的内容” 这个hello的弹窗便是该网站的模板.既然是模板,有固定的代码,那么就可以根据输入内容进行注入.PHP中的常见模板有twig smarty blade
在twig模板里,如果只是将用户的输入作为模板的值,那么不会有太大问题,但如果用户输入的值被认为成是模板输入的一部分,那么用户即可通过绕过来输入一些脚本并运行,并且在twig的模板里存在{{var}},它的本意是输出传递变量,但是也可以执行一些基本表达式,并将其结果作为输入变量的值,例如在本题中当用户输入ID={{2*10}}则输出的结果是hello 20,那么如此便可判定此文件中存在服务端模板注入攻击漏洞
我们在cookie的后方进行注入,输入{{2*10}}进行测试,结果不出所料,本题考察的就是服务端模板注入攻击.
判断好了就好解决了,因为页面为模板生成所以服务端模板注入攻击是有固定Payload的
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("+你想了解的东西+")}}
例:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}就是查看flag文件,接下来CTRL+C接CTRL+V,成功输出flag