[HCTF 2018]admin --- flask session 的加密解密

  1. 进入靶场,没什么特殊页面,如果运气足够好的话,账号:admin,密码:123,否则注册一个用户,然后登录抓包,看能否得到有用信息
    在这里插入图片描述
    后续的一个包,也没什么有用信息,看到 session 这部分,应该是base64编码,尝试了解码未得到结果,登录成功后,尝试其他功能看能否得到有用信息

  2. 修改密码部分,网页源码中有端倪
    在这里插入图片描述
    访问地址,发现更多有用信息,flask 是 python 的 web 端框架,赶紧搜索了一下 flask session
    Flask的session使用

  3. 利用
    flask中session是存储在客户端cookie中的,也就是存储在本地。flask仅仅对数据进行了签名。签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题。

     (1)session 可以设置/获取
     (2)需要在 config.py 文件中配置 SECRET_KEY 
     (3)可以进行伪造,网上找一下 flask session 的伪造方法
    

    flask session 加密解密工具

  4. 取用我们自己注册的用户登录成功的 session 进行解密,如下
    在这里插入图片描述

根据题目可知,登录管理员账户应该可得 flag,审计代码的结果发现,在 index.html 中也有提到
在这里插入图片描述
在这里插入图片描述
那么我们就用上述解密得到的结果,修改用户名为 admin,再加上 SECRET_KEY 进行加密,伪造 payload

SECRET_KEY 在 config.py 中位 ckj123

import os

class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123'
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test'
    SQLALCHEMY_TRACK_MODIFICATIONS = True
  1. 根据以上信息,伪造 session
    在这里插入图片描述
    重新登录,bp 抓包,用伪造的 session 替换原来的 session 即可
    在这里插入图片描述
    在这里插入图片描述

  2. 在代码审计的时候,我们发现,注册、登录和修改密码处,都对用户名进行了小写转化~~
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 此处应当可做文章,假设第一次注册时,输入用户名转化为 ADMIN ,我们再去修改密码时转化为 admin,这样不就可以绕过登录和注册界面直接修改 admin 密码了么?因此进行 Unicode 编码欺骗;这里原理就是利用nodeprep.prepare函数会将unicode字符ᴬ转换成A,而A在调用一次nodeprep.prepare函数会把A转换成a。

ᴬᴰᴹᴵᴺ -> ADMIN -> admin

用 ᴬᴰᴹᴵᴺ 注册并登录,然后修改密码,即可修改 admin 用户密码

  1. 总结
    Unicode 编码未接触过的东西,搞的有疲惫,ᴬᴰᴹᴵᴺ 这个东西真不好找啊,浪费很长时间在Unicode编码上
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask应用程序中使用Flask-Login并将用户会话存储在Redis中,可以通过继承Flask-Login的UserMixin类并实现get_id()和from_id()方法来实现。然后使用Flask-Session和Redis扩展将会话存储在Redis中。 以下是一个示例: ```python from flask_login import UserMixin from flask_session import Session from redis import Redis from flask_redis import FlaskRedis redis_store = FlaskRedis() class User(UserMixin): def __init__(self, id): self.id = id @staticmethod def get(user_id): if not user_id: return None user_data = redis_store.get(user_id) if not user_data: return None return User.from_id(user_id) @staticmethod def from_id(user_id): user_data = redis_store.get(user_id) if not user_data: return None return User(user_id) def save(self): redis_store.set(self.id, {'id': self.id}) app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis(host='localhost', port=6379) app.config['SESSION_USE_SIGNER'] = True Session(app) redis_store.init_app(app) ``` 在上面的示例中,我们创建了一个名为User的类,在其中实现了get_id()和from_id()方法。这些方法用于从Redis中获取用户数据和将用户数据保存到Redis中。 接下来,我们使用Flask-Session扩展和Redis扩展设置会话存储在Redis中。在初始化应用程序之前,我们需要设置Flask-Session配置和Redis连接配置。 最后,我们使用redis_store.init_app(app)将Redis扩展配置到Flask应用程序中。 这样,我们就可以在Flask应用程序中使用Flask-Login并将用户会话存储在Redis中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值