buu_ssti
SSTI刷题
网上找的老图了:
这里的绿线表示结果成功返回,红线反之。有些时候,同一个可执行的 payload 会在不同引擎中返回不同的结果,比方说
49
会在 Twig 中返回49,而在 Jinja2 中则是7777777。
参考:一篇文章带你理解漏洞之 SSTI 漏洞(不知道为啥有时候打不开…)
Flask/Jinja2
flask之ssti模版注入从零到入门(比较基础,对python没啥基础的同学比较友好。)
[BJDCTF 2nd]fake google
随便输了点东西之后提示ssti:
经过测试,最后输入49后返回7777777,应该是jinja2:
输入:{{ config.items() }}
:没找到什么东西
然后根据上面那篇从零到入门构造?name={{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('ls /').read()}}
读取根目录,可以看到flag在根目录下:
构造payload:?name={{"".__class__.__bases__[0].__subclasses__()[117].__init__.__globals__['popen']('cat /flag').read()}}
[WesternCTF2018]shrine
一打开是一坨源代码,直接告诉你是flask模板
查看网页源代码会好看些:
safe_jinjia是一个简单的waf,会将(
和)
替换为空,并且加上{% set config=None%}{% set self=None%}
简单测试:)可以看到config为空:
想要绕过圆括号的过滤,但是绕着绕着发现绕不过去:
然后又在想能不能使得set失效,但是同样失败,看了wp才发现是去找其他的配置
参考:
https://eviloh.github.io/2018/09/03/TokyoWesterns-2018-shrine-writeup/
https://www.cnblogs.com/Cl0ud/p/12316287.html
Tornado render
[护网杯 2018]easy_tornado
一打开有三个txt,逐一点开,flag.txt给出了flag的文件名/fllllllllllag
,并且根据hints.txt,访问需要文件名+filehash,filehash为:md5(cookie_secret+md5(filename))
。刚开始抓包看cookie,但是找了蛮久的都没找到,然后就直接在filename输入flag文件名,出现了报错界面(当filename和filehash不匹配就会出现),并且msg是可控的,根据welcome.txt的render想到ssti:
虽然也是python写的,但是这题不像flask那样利用python的属性,而且它有waf,刚开始我想的是如何绕过waf,但是看了wp才知道自己的思路完全不对,应该利用tornado本身的属性
通过查找资料可以知道tornado为了保证cookie的安全有一个cookie_secret,并且保存在setting中,构造payload:/error?msg={{handler.settings}}
得到cookie_secret:
剩下的就很简单了
利用/hints.txt
验证:
得到flag:
文章标题:buu_ssti
本文作者:Kyle
发布时间:2020-10-27, 16:54:08
最后更新:2020-10-29, 17:02:05
原始链接:https://silver2835.github.io/2020/10/27/buu-ssti/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。