admin-flask的session伪造

发布时间 2023-09-10 16:19:01作者: Eddie_Murphy

题目来自:

[HCTF 2018]admin 1

进来也没什么说的,就是一个页面,点击右上角的交互我们就可以发现login和register:

点击login,感觉像是sql注入,尝试了一下,没用。

那么我们就老老实实注册一个账号再进去吧,看看会有什么提示之类的:

 (好臭的名字)

咳咳,算是我的一个小小恶趣味吧~~

然后我们登录进去,右上角交互有三个东西:

POST打开就是一个留言板,没啥特别的,logout就直接登出了,也没什么用。

在这个change password的页面源码里,发现了个东西:

看来这个web页面是用flask框架搭建的。

flask是轻量级web框架,session存在客户端,我们可以伪造session(cookie)。

那什么是Session?

这里也有一个大神的解释:详见 Session机制详解 - lonelydreamer - 博客园 (cnblogs.com)

在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。(来自百度百科)

(本来这里是可以访问然后看源码的,但是现在访问就404了,不知道为啥跑路了......那就只好借其他人的这部分来用了www)

(注:来自CTF学习笔记——[HCTF 2018]admin_ctf特定用户_Obs_cure的博客-CSDN博客

源码审计一下,首先是发现库中有两个账号,可惜密码被加密了。

需要注意的是,session加密过程中有一个SECRET_KEY,需要我们知晓。这个东西一般放在config之类的文件里:

一般这个key可以是随机生成的,这里直接是固定的ckj123,也算减小题目难度了吧......
这个时候我们需要再找一个flask的session加密脚本,把admin的session伪造一个。

 

我们使用burpsuite抓包我们那么页面看看,应该会有session值的出现:

网上搜了搜,这个session加解密都是有对应脚本的,首先是这个解密脚本,源码放一下:

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()))   

这个需要我们在cmd上使用,如果pip install flask有点问题的还可以看我的另一个博客:

python在cmd运行时出现pip安装了包以后却出现ModuleNotFoundError No module named ‘xxx‘的问题

话不多说,直接开始decode:

这里又有需要注意的了,我们更改下面这个东西的时候,不仅仅要更改name为admin,还有改user_id=1哦~~

接下来又是一个flask加密的脚本:

链接放这里了:

https://github.com/noraj/flask-session-cookie-manager

使用payload:(这里也要注意session修改也一般是需要密钥的,这道题就是ckj123)

python flask_session_cookie_manager3.py encode -s "(密钥)" -t "(修改的明文session)"

然后复制到bp中再放包,就成功了:

据出题人说,因为很多人在做这道题的时候,在修改admin密码的时候直接修改成简单密码了,所以很多人都直接能最后弱口令爆破出来捡漏....

正规做法当然是这个flask的session伪造,还有另外两种做法,一种是Unicode欺骗,就是用ᴬᴰᴹᴵᴺ的这种形式先注册骗进去然后改密码,就等效于改了admin的密码,就可以登录进去了;还有一种做法是条件竞争,比较牛逼,一题三解可以看看这篇博客:一题三解之2018HCTF&admin-安全客 - 安全资讯平台 (anquanke.com)