渗透学习-CTF篇-web-BUUCTF

文章目录

  • 前言
  • 一、[WesternCTF2018]shrine


前言

随着学习的不断深入,为了防止自己忘记之前所学的内容,于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆!!


一、[WesternCTF2018]shrine

这一关主要是SSTI的内容,再进行打靶场前,先让我们来了解一下什么是SSTI。

基础知识
SSTI 就是服务器端模板注入(Server-Side Template Injection)。漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。

靶场攻打
再大致了解了后,我们启动靶场:
渗透学习-CTF篇-web-BUUCTF_第1张图片
我们发现一打开靶场就有这一串的代码信息,我们先来分析这部分的代码具体有啥内容:
渗透学习-CTF篇-web-BUUCTF_第2张图片

  1. 我们看到第一部分这里有个函数flask.render_template_string , 这个函数就是一个模板的调用函数。
    当我们在ctf中看到这个函数时,就可以联想到这很有可能是一道SSTI的题。
  2. 这里会对我们传入的参数进行过滤,也就是说会将传入的参数中的()进行过滤掉,防止我们调用特殊变量或者python内置的函数等等。
  3. 4 这里代码将__name__这个系统变量传入到对应的app变量中,再调用app变量里的config参数调出FLAG的值。

在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。在本关中就有一个config 对象。

且本关由于对输入的参数进行了过滤() 因此,我们可以利用python中的url_for()函数是用于构建操作指定函数的URL。(因为这个函数可以省略(),所以可用)

在分析了传入的pyload的构成后,我们还需要看看在哪个位置处存在注入点:
在这里插入图片描述
在代码中的这一部分,有一个app.route() 这里就是指对应的注入的路径!!!

然后,开始注入:

  1. 那么我们构造如下payload:
/shrine/{{url_for.__globals__}}

效果如下:
渗透学习-CTF篇-web-BUUCTF_第3张图片
globals 会列出当前的所有的变量。 但是根据题目,我们需要找到当前使用的变量,也就是flask的变量。(这里已经在图中标识了)

  1. 然后,读取当前命名空间中的对应变量信息:当前在flask模板下里的config
/shrine/{{url_for.__globals__['current_app'].config}}

渗透学习-CTF篇-web-BUUCTF_第4张图片
此时,就可以发现该flag了!!! 但是呢,我们还可以用如下payload进行读取:

/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}

渗透学习-CTF篇-web-BUUCTF_第5张图片

至此,大功告成!!!


你可能感兴趣的:(渗透学习,学习,前端,flask)