[XYCTF 2025 Web Signin]快速理解bottle模板的set_cookie和get_cookie的原理,利用get_cookie伪造cookie进行pickle反序列化执行命令

利用bottle模板伪造cookie实现pickle反序列化

bottle模板的set_cookie和get_cookie的理解

我们来看这道题的源码

 # -*- encoding: utf-8 -*-
 '''
 @File    :   main.py
 @Time    :   2025/03/28 22:20:49
 @Author  :   LamentXU 
 '''
 '''
 flag in /flag_{uuid4}
 '''
 from bottle import Bottle, request, response, redirect, static_file, run, route
 with open('../../secret.txt', 'r') as f:
     secret = f.read()
 ​
 app = Bottle()
 @route('/')
 def index():
     return '''HI'''
 @route('/download')
 def download():
     name = request.query.filename
     if '../../' in name or name.startswith('/') or name.startswith('../') or '\\' in name:
         response.status = 403
         return 'Forbidden'
     with open(name, 'rb') as f:
         data = f.read()
     return data
 ​
 @route('/secret')
 def secret_page():
     try:
         session = request.get_cookie("name", secret=secret)
         if not session or session["name"] == "guest":
             session = {"name": "guest"}
             response.set_cookie("name", session, secret=secret)
             return 'Forbidden!'
         if session["name"] == "admin":
             return 'The secret has been deleted!'
     except:
         return "Error!"
 run(host='0.0.0.0', port=8080, debug=False)

目录穿越访问/secret.txt

 def get_cookie(self, key, default=None, secret=None, digestmod=hashlib.sha256):
         value = self.cookies.get(key)
         if secret:
             # See BaseResponse.set_cookie for details on signed cookies.
             if value and value.startswith('!') and '?' in value:
                 sig, msg = map(tob, value[1:].split('?', 1))
                 hash = hmac.new(tob(secret), msg, digestmod=digestmod).digest()
                 if _lscmp(sig, base64.b64encode(hash)):
                     dst = pickle.loads(base64.b64de
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值