Flask的session使用: https://www.jianshu.com/p/278d4f59839d
进去看见注册登录框以为是sql注入,想到和sql-labs有一关有点一样,先随便注册一个账户然后通过这个账户修改admin账户的密码,最后登录admin账户进行信息搜集 不过这题好像不一样 方法一:flask session伪造 刚开始的几个页面没有啥有用的信息,先注册一个登录然后在修改密码界面有一个提示(界面很多,但是没有线索的时候,尽量把所有源码都看完,不有遗漏) falsk中session的构成 由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中 (可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,很容易被篡改,存在安全漏洞。 github上有session的加解密脚本,直接down下来就可以用 其中对已知session的解密仍需要知道session_key,通常保存在config.py中(这个前面给提示了,在flask源码里有)
如果不知道session_key,可以通过下面这个脚本解密
#!/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()))
下面黄色的时解出来的内容: 其中的’name’:‘123’ 就是我们的身份信息,对其进行修改,然后在加密成session {‘_fresh’: True, ‘_id’: b’17f2c4df8b412ea9261790036844c898dcdba2bf885b3faa215d2d511e1dffc48b73379be9fcde01d5c8e28a77d71e31a6cde89b26d76a3d17e500eef85635f9’, ‘csrf_token’: b’a48186ea5dc1245a9ea531fef3c20990e6724653’, ‘image’: b’Rp2V’, ‘name’: ‘admin’, ‘user_id’: ‘10’} 方法二:unicode欺骗
在代码审计的时候,我们发现,注册、登录和修改密码处,都对用户名进行了小写转化 name = strlower(session[‘name’])
????? -> ADMIN -> admin
具体可查Unicode字符表 ???????????????????????? 第一次注册时使用 ?????,系统自动转化为ADMIN,而ADMIN又会被自动转化为admin 再admin修改密码 登录拿flag
|