[HCTF 2018]admin

[HCTF 2018]admin

进入页面可以看见左边有选项,发现一共有两个选项:

image-20221128012124906

根据常识,没注册肯定不能登录,因此我们随便注册一个账号:123456789,

然后注册,跟着提示继续登录,页面发生变化:

image-20221128012225910

看左边选项框,这次变成了四个选项:index、post、change password、logout,意思分别是索引、发送、改密码、注销。

点击发送看看:

image-20221128024405331

这里啥也没有,因此卡住了。

开始抄大佬作业了。

第一种解法

flask session伪造。

首先介绍一些什么是flask session伪造:

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

利用方式:

我们可以用python脚本把flask的session解密出来,但是如果想要加密伪造生成我们自己的session的话,还需要知道flask用来签名的SECRET_KEY

点开改密码的页面,看看源码,发现了:

image-20221128172829323

这是这个题的源代码因此下载下来看一看,看 网上大佬说的用pycharm或其他打开,审计代码,先看路由(route),每一个.py文件一个一个审计。最后在templates中找到index.html里有线索:

image-20221128173053314

image-20221129111747091

current_user.is_authenticated函数:在模板渲染时,会先判断当前用户的登录状态( current_user.is_authenticated )。 如果用户没有登录( current_user.is_authenticated 返回 False ),就不会渲染表单部分的 HTML 代码,即上面代码块中 {% if… %} 和 {% endif %} 之间的代码。

因此这里需要让session[‘name’] == ‘admin’

而通过对flask的了解,我们可以得知,在知道secret_key的情况下,我们可以对签名进行伪造。

此处参考文章:https://www.leavesongs.com/PENETRATION/client-session-security.html

而通过f12可以得知session的值:
image-20221129112521337

这里找到网上大佬的解密脚本:

#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    print(decryption(sys.argv[1].encode()))
//注意要自己装好flask模块才能运行,又卡里一会儿

终于调试好可以运行了:

image-20221129135029587

把name改成admin进行加密,加密脚本获取网上大佬的:mirrors / noraj / flask-session-cookie-manager · GitCode

使用格式如下:

image-20221129135633115

得到加密后的session,修改session的值即可完成登录:

image-20221129135921348

得到了最终答案:

flag{0f75975b-f96c-487f-87a9-6b48e3dfa2b3}

后两种解法太高级了看不懂先不看(bushi

参考文章:

https://www.cnblogs.com/chrysanthemum/p/11722351.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
06-02

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值