文章目录
- 前言
- 一、[WesternCTF2018]shrine
前言
随着学习的不断深入,为了防止自己忘记之前所学的内容,于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆!!
一、[WesternCTF2018]shrine
这一关主要是SSTI的内容,再进行打靶场前,先让我们来了解一下什么是SSTI。
基础知识
SSTI 就是服务器端模板注入(Server-Side Template Injection)。漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。
靶场攻打
再大致了解了后,我们启动靶场:
我们发现一打开靶场就有这一串的代码信息,我们先来分析这部分的代码具体有啥内容:
- 我们看到第一部分这里有个函数flask.render_template_string , 这个函数就是一个模板的调用函数。
当我们在ctf中看到这个函数时,就可以联想到这很有可能是一道SSTI的题。 - 这里会对我们传入的参数进行过滤,也就是说会将传入的参数中的()进行过滤掉,防止我们调用特殊变量或者python内置的函数等等。
- 4 这里代码将__name__这个系统变量传入到对应的app变量中,再调用app变量里的config参数调出FLAG的值。
在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。在本关中就有一个config 对象。
且本关由于对输入的参数进行了过滤() 因此,我们可以利用python中的url_for()函数是用于构建操作指定函数的URL。(因为这个函数可以省略(),所以可用)
在分析了传入的pyload的构成后,我们还需要看看在哪个位置处存在注入点:
在代码中的这一部分,有一个app.route() 这里就是指对应的注入的路径!!!
然后,开始注入:
- 那么我们构造如下payload:
/shrine/{{url_for.__globals__}}
效果如下:
globals 会列出当前的所有的变量。 但是根据题目,我们需要找到当前使用的变量,也就是flask的变量。(这里已经在图中标识了)
- 然后,读取当前命名空间中的对应变量信息:当前在flask模板下里的config
/shrine/{{url_for.__globals__['current_app'].config}}
此时,就可以发现该flag了!!! 但是呢,我们还可以用如下payload进行读取:
/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
至此,大功告成!!!