题目复现链接:https://buuoj.cn/challenges
参考链接:DDCTF2019-WRITEUP

  1. def trigger_event(event):
  2. session[\'log\'].append(event)
  3. if len(session[\'log\']) > 5:
  4. session[\'log\'] = session[\'log\'][-5:]
  5. if type(event) == type([]):
  6. request.event_queue += event
  7. else:
  8. request.event_queue.append(event)

首先路由异步处理请求,使用了一个队列

  1. def buy_handler(args):
  2. num_items = int(args[0])
  3. if num_items <= 0:
  4. return \'invalid number({}) of diamonds to buy<br />\'.format(args[0])
  5. session[\'num_items\'] += num_items
  6. trigger_event([\'func:consume_point;{}\'.format(num_items), \'action:view;index\'])

主要的问题是这里的购买函数是改变余额再判断是否合法,也就是说在调用buy_handler时同时传入get_flag,处理队列中的顺序就是余额+n -> get_flag -> 判断不合法,这时我们已经成功把flag写进session了。

flask-session-cookie-manager

购买类的题很有可能是逻辑漏洞或者溢出

版权声明:本文为20175211lyz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/20175211lyz/p/11681737.html