刷題記錄:[DDCTF 2019]homebrew event loop
題目復現鏈接:https://buuoj.cn/challenges
參考鏈接:DDCTF2019-WRITEUP
知識點
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)
首先路由異步處理請求,使用了一個隊列
def buy_handler(args):
num_items = int(args[0])
if num_items <= 0:
return 'invalid number({}) of diamonds to buy<br />'.format(args[0])
session['num_items'] += num_items
trigger_event(['func:consume_point;{}'.format(num_items), 'action:view;index'])
主要的問題是這里的購買函數是改變余額再判斷是否合法,也就是說在調用buy_handler時同時傳入get_flag,處理隊列中的順序就是余額+n -> get_flag -> 判斷不合法
,這時我們已經成功把flag寫進session了。
2、flask session解密
總結
購買類的題很有可能是邏輯漏洞或者溢出