admin,虽然这道题弱口令过了,但是为了尊重出题人,还是走一波流程
解法一:Unicode欺骗
关键代码:
def strlower(username):
username = nodeprep.prepare(username)
return username
而在注册时使用了一次strlower,修改密码时使用了一次,
就是因为如此,所以有了Unicode欺骗,在python里测试一下,在此网站可找对应字符(https://unicode-table.com/en/search/?q=+%09Modifier+Letter+Capital+A)
使用如下脚本:
from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep
def strlower(username):
username = nodeprep.prepare(username)
return username
print strlower(u'\u1d2c\u1d30\u1d39\u1d35\u1d3a')# ᴬᴰᴹᴵᴺ 的unicode编码为:\u1d2c\u1d30\u1d39\u1d35\u1d3a
print strlower(strlower(u'\u1d2c\u1d30\u1d39\u1d35\u1d3a'))
以上脚本的结果是ᴬᴰᴹᴵᴺ —>ADMIN----->admin
所以若是我们注册一个用户名为ᴬᴰᴹᴵᴺ的账户,进行了一次strlower,转成ADMIN,登录这个账户去修改密码,修改密码完成时用户名为admin,此时admin的密码就变成了我们修改的密码;
解法二:flask session伪造
这是flask是一大缺陷,不过官方已有补丁。
下来源码之后知道使用的flask框架,而flask对数据加密使用的是签名,由于flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,有了session,还需要签名才能进行加密,而签名可以在config.py中找到:
解密代码:
注意:python2和python3使用的生成机制不一样,这道题python2生成的session不能进行加密,所以使用python3
#!/usr/bin/env python3
import sys
import zlib