美文网首页
flask框架——一道题目的求解

flask框架——一道题目的求解

作者: 萍水间人 | 来源:发表于2019-04-12 15:20 被阅读0次

先看我对题目的源码分析

1

def trigger_event(event):
    session['log'].append(event)
    if len(session['log']) > 5: session['log'] = session['log'][-5:]
    if type(event) == type([]):
        request.event_queue += event
    else:
        request.event_queue.append(event)

一个触发事件的函数, 传入event, 并且对event的类型进行判断, type([])是list数据类型

关于这个event_queue 稍后再说

def get_mid_str(haystack, prefix, postfix=None):
    haystack = haystack[haystack.find(prefix)+len(prefix):]
    if postfix is not None:
        haystack = haystack[:haystack.find(postfix)]
    return haystack

这个函数是用来解析参数的

haystack.find
还不知道这三个参数的具体数据类型

2 看入口点

@app.route(url_prefix+'/')
def entry_point():
    querystring = urllib.unquote(request.query_string)
    request.event_queue = []
    if querystring == '' or (not querystring.startswith('action:')) or len(querystring) > 100:
        querystring = 'action:index;False#False'
    if 'num_items' not in session:
        session['num_items'] = 0
        session['points'] = 3
        session['log'] = []
    request.prev_session = dict(session)
    trigger_event(querystring)
    return execute_event_loop()

urllib.unquote() 将query_string 的URL编码转换为字符

然后初始化request.event_queue 列表

querystring 不能为空, 且必须以action: 或者长度大于100

可以明确的是 query_string 就是? 后面的一串字符

之后就是对session 进行初始化了, 猜测session 应该是一个二维的list

那么这句话的作用就是

if len(session['log']) > 5: session['log'] = session['log'][-5:]

并且, 调用trigger_event(querystring) 触发事件

3

is_action = event[0] == 'a'
            action = get_mid_str(event, ':', ';')
            args = get_mid_str(event, action+';').split('#')
            try:
                event_handler = eval(action + ('_handler' if is_action else '_function'))
                ret_val = event_handler(args)

event是一系列事件

根据输入的字符进行拼接出函数

比如现在 query_string = action:buy;1

传入函数

def execute_event_loop():

之后会进行解析

显然现在 is_action = 1
并且在event中去get_mid_str()
下图是 buy
所以就是调用了buy_handler函数

当然不会这么简单哈哈哈哈


抱着试一试的心态,成功解密flask 的session

{'points': 3, '
log': [b'action:view;index', 
b'action:get_flag;1', 
b'action:view;index', 
b'action:get_flag;1', 
b'action:view;index'],
 'num_items': 0}

ok到现在为止这道题目我大概明白了

def show_flag_function(args):
    flag = args[0]
    #return flag # GOTCHA! We noticed that here is a backdoor planted by a hacker which will print the flag, so we disabled it.
    return 'You naughty boy! ;) <br />'
    
def get_flag_handler(args):
    if session['num_items'] >= 5:
        trigger_event('func:show_flag;' + FLAG()) # show_flag_function has been disabled, no worries
    trigger_event('action:view;index')

重点显然是上面两个函数

其实session['num_items'] 就是session中的值
所以这个应该是一道伪造session的题目了
但是我不知道怎么伪造

还有, 即便我能做到, 但是


无非就是调用了这个函数, 那我还能拿到flag咩

蜜汁微笑

坐等wp

相关文章

  • Python学习

    python-flask框架学习(五) request-Flask的请求对象 请求解析和响应封装大部分是有Werk...

  • 求解一道题

    儿子念初二。昨儿心情看似不好,试着去安慰,半晌对我说,他有不会的题,郁闷。我说,你可以尝试电话问问同学或者老师。儿...

  • java习题练习

    求解一道算法题,我做了一半,大佬来试一下。

  • Flask框架——Sijax

    上篇文章我们学习了Flask框架——Flask-SQLite数据库,这篇文章我们学习Flask框架——Flask-...

  • python flask安装和命令

    Flask Web开发实战学习笔记 Flask简介 Flask是使用Python编写的Web微框架。Web框架可以...

  • flask框架入门级基础

    摘要 flask框架是一个微框架,即:微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask ...

  • Flask框架——flask-caching缓存

    上篇文章我们学习了Flask框架——Session与Cookie,这篇文章我们来学习Flask框架——flask-...

  • flask入门

    Flask入门 Flask入门WEB工作原理Flask框架flask_script扩展蓝本(blueprint) ...

  • Flask

    Flask Introduction PythonWEB框架之Flask Flask Back-end Manag...

  • Flask框架——第一个Flask程序

    本系列文章的目的是让零基础的小伙伴从零开始一步一步学习Flask框架,从零入门到能够独立完成一个基于Flask框架...

网友评论

      本文标题:flask框架——一道题目的求解

      本文链接:https://www.haomeiwen.com/subject/nzdhwqtx.html