[NSSRound#13 Basic]flask?jwt?解题思路&过程

这篇具有很好参考价值的文章主要介绍了[NSSRound#13 Basic]flask?jwt?解题思路&过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

过程

打开题目链接,是一个登录框,不加验证码,且在注册用户名admin时提示该用户名已被注册,因此爆破也是一种思路。不过根据题目名字中的提示,jwt,且拥有注册入口,注册一个用户先。

注册完用户,通过getFlag按钮,得到提示不是admin用户,在忘记密码的页面,找到flask的secretKey,因此考虑flask的session伪造。
[NSSRound#13 Basic]flask?jwt?解题思路&过程,CTF刷题,flask,python

jwt

简要介绍一下jwt。JSON Web Token, JWT。jwt是一种协议,用来解决用户认证的问题。我们熟知的认证方式是session-cookie的形式,客户端向服务端发送用户名和密码,服务端验证后会在当前的会话(session)中保存用户的相关信息(例如:当前用户的权限),并向客户端返回一个session_id,也即客户端的cookie。下次请求时,客户端将通过Cookie传送该session_id,服务端接收到之后,通过session_id来查询对应session,从而获取与用户相关的信息。

这种机制的问题时需要服务端保存session,且session查询需要消耗资源。

因而引入jwt,jwt的设计比较简明,一个三段式的字符串,如下:
[NSSRound#13 Basic]flask?jwt?解题思路&过程,CTF刷题,flask,python使用base64编码,以.分隔为了三个部分:Header、Payload、Signature。

  • Header
    header部分用于标识生成Signature的算法。例如图中的,也是默认的HS256:HMAC-SHA256。
  • Payload
    payload部分存放需要传递的数据,有7个官方字段,当然也可以添加自己的字段,但是因为该部分内容是base64编码的,与明文传输并无二致,避免传输私密信息:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
  • Signature
    使用一个客户端与服务端都知道的密钥对前两部分进行加密,作为一个签名附加在jwt的第三部分。

故而当服务端签发jwt返回给客户端时,客户端可以使用相同的密钥和指定算法,验证前两部分的有效性;反过来,服务端也可以通过此种方法来验证客户端的jwt是否有效*。

flask session伪造

有了密钥,使用https://github.com/noraj/flask-session-cookie-manager/tree/master对session进行伪造。

首先解密可以得到:{'_fresh': True, '_id': '0212d692b0824b514d6eab354c932359356d94eff6bd2dbabe3236c8f95e3081a881f9f142deb7505132b14c04ab8a813bfc3d319348345395132f1947daf8cc', '_user_id': '2'},改_user_id为1,重新加密后,替换原有session获得flag。

acquisition

  1. 学习了flask的session伪造的解法
  2. 重温了一遍jwt

reference

https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
https://github.com/noraj/flask-session-cookie-manager/tree/master
https://blog.csdn.net/Leaf_initial/article/details/131560501

后记
* 这里想到一个问题:对称加密下,客户端也保存有相同的密钥,那么客户端自己也是可以伪造签名的,例如一个非admin的用户,将自己的权限改为了admin,即payload部分内容发生改变,同时他将新的签名进行更新,不就可以伪造jwt了?当然这个过程也有许多细节问题可以用来规避,例如1)如果使用非对称的加密算法,既然客户端只是验证,客户端保存一个公钥即可,jwt的签发由服务端保存的私钥进行2)payload中避免使用如“admin=0”,“admin=1”此类的身份验证策略,也可以避免此种伪造。3)还是把用户的权限控制放在服务端,验证完jwt后通过查询ACL再来决定用户的真正权限。可能对于具体的使用场景、使用流程的认识还不到位,因而有诸如此类的疑惑,后续搞明白了再写一写文章来源地址https://www.toymoban.com/news/detail-540519.html

到了这里,关于[NSSRound#13 Basic]flask?jwt?解题思路&过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NSSRound#17 Basic web

    一个登录界面 看到页面名字Robots? 转到robots.txt 看到加密 加密解密。 hint解密,使用Hex加密方式解出 用户名熟悉吗,新生赛可遇见过哦~.记得用户名全用小写哦~~ username使用棋盘密码,解出ctfer。 password使用base32和base64加密,解出c9fa95881ea0152791d4a759dacd79de,再用md5解出密码

    2024年03月09日
    浏览(50)
  • 中国顶级CTF竞赛网络安全大赛--2022网鼎杯re2解题思路

    PEID查不出来,用了die,显示是UPX3.96的壳,用了脱壳机,脱不了,只能手动脱壳,拖入x64dbg,F9运行到程序领空,很明显的特征,push: 无脑使用ESP定律大法,对ESP下硬件访问断点: F9运行,在pop处停下: F4运行到下面第一个jmp,F8,进去又是一个jmp,继续F8,到达OEP: 使用x

    2023年04月22日
    浏览(30)
  • [NSSRound#16 Basic]RCE但是没有完全RCE

    题目代码: 第一个是md5强类型比较,用数组 md5_1[]=1md5_2[]=2 不行,那就用md5碰撞,使用payload: 第二个是md5弱类型比较, 只要两个数的md5加密后的值以0e开头就可以绕过,因为php在进行弱类型比较(即==)时,会先转换字符串的类型,再进行比较,而在比较时因为两个数都是以0e开

    2024年01月23日
    浏览(58)
  • 力扣刷题SQL-584. 寻找用户推荐人,解题思路及2种解法

    给定表 customer ,里面保存了所有客户信息和他们的推荐人。 +------+------+-----------+ | id   | name | referee_id| +------+------+-----------+ |    1 | Will |      NULL | |    2 | Jane |      NULL | |    3 | Alex |         2 | |    4 | Bill |      NULL | |    5 | Zack |         1 | |    6 | Mark |      

    2024年02月16日
    浏览(36)
  • [第五空间 2021]pklovecloud 解题思路&过程

    打开题目,一道关于php反序列化的的代码审计问题。源码如下: 可以看到,通过ace-echo_name()函数,可以调用到file_get_contents来读文件;acp-__toString()魔术方法中有通过其cinder属性对echo_name()的调用,且__construct()会创建cinder为一个对象; 于是初步构造payload: 还不够,目前只是构

    2024年02月14日
    浏览(30)
  • 【misc】[NSSRound#12 Basic]Secrets in Shadow --linux提权,shadow文件hash爆破

    首先使用ssh连上主机 : ssh ctf@node5.anna.nssctf.cn -p 28844  接着再输入 ls -a l查看文件 尝试打开文件,发现权限不够,根据题目的提示打开shadow文件 在以前的Linux系统中,用户名、所在的用户组、密码(单向加密)等信息都存储在、/etc/shadow的 文件中,很多软件通过调用这个文件

    2024年02月04日
    浏览(32)
  • 【每日算法 && 数据结构(C++)】—— 13 | 求最长自增子序列(解题思路、流程图、代码片段)

    Today’s quote is: \\\"Actions speak louder than words. 今天的一句话是:“行动胜于言辞 求最长递增子序列 最长递增子序列是指在给定序列中,找到一个最长的子序列,使得子序列中的元素按照递增的顺序排列。 例如,对于序列 [1, 3, 2, 5, 4, 7, 6],其中的最长递增子序列可以是 [1, 2, 4,

    2024年02月12日
    浏览(30)
  • 河南省第四届”金盾信安杯”网络安全大赛writeup(过程,解题思路)

    目录 写在最最前面 Misc Misc-qianda0_Sdoku​编辑 Misc-盗梦空间 Misc-Megmi Misc-数据泄露01-账号泄露追踪 Web Web-eZphp2 Web-EzPHP Web-有来无回 Crypto Crypto-小菜一碟 Crypto-RRSSAA​编辑 Crypto-simpleR 加油各位( •̀ ω •́ )y 期待与君再相逢 本人今天也是在和病毒抗争中,打今天的 ” 金盾信安杯

    2024年02月04日
    浏览(36)
  • 2023国赛数学建模A题第一问解题思路 - 定日镜场的优化设计(详细过程,小白读完就会)

    补充知识点: 定日镜是反射聚焦太阳辐射的单元,聚光子系统由成千上万面的定日镜组成,聚光子系统的投资成本约占了电站总投资成本的 50%[39]。由于太阳光线的发散性和太阳位置的变化,入射的太阳光线并不能完全被定日镜反射聚焦到吸热器上,系统存在的能量损失约为

    2024年02月09日
    浏览(29)
  • 2023国赛数学建模A题第二问解题思路 - 定日镜场的优化设计(详细过程,小白读完就会)

    2.1.1基础布局 在塔式太阳能热发电领域,由 Laurence等人提出的辐射网格布局是一种应用较广泛的排布方式。此布局方式是将定日镜沿等方位线交替放置在各恒定半径处,且随着径向距离的增加,镜场排布也呈现出由密到疏的趋势。为定量表示定日镜与吸热塔的位置关系,还引

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包