漏洞描述
在CTFd v2.0.0-v2.2.2的注册过程中,错误的用户名验证会允许攻击者接管任意帐户,前提是用户名已知并且在CTFd实例上启用了电子邮件。要利用此漏洞,必须使用与受害者的用户名相同的用户名进行注册,但在用户名之前和/或之后插入空格。这将使用与受害者相同的用户名注册该帐户。在为新帐户启动密码重置后,由于用户名冲突,CTFd将重置受害者的帐户密码。
漏洞分析
该漏洞主要由注册部分的逻辑产生的
查看源码https://github.com/CTFd/CTFd/blob/fe85fdf1e5561e9f04c1c80c72e894dcd7ea3ad7/CTFd/auth.py#L159
1 | def register(): |
程序在判断用户名是否重复时,使用的用户名是用户直接Post过来的,而在存入数据库中的时候进行了strip操作.所以我们只要注册一个前面或后面加空格的admin账号即可绕过用户名重复的限制.
再来看一下找回密码的逻辑
https://github.com/CTFd/CTFd/blob/fe85fdf1e5561e9f04c1c80c72e894dcd7ea3ad7/CTFd/auth.py#L95
1 |
|
程序会根据你输入的邮箱发送相关账号更新信息到你邮箱中,而当你更新你的密码时,会从你访问的url获取data(你的假账号),并将它反序列化,根据序列化出来的对象的name值更新对应的账号(被覆盖的账号)密码
利用方式
- 利用添加空格绕过限制来注册一个与受害者用户名相同的账号
- 生成忘记密码链接发送到自己的邮箱
- 将自己的账号的用户名改成与被攻击者不相同的用户名(可选)
- 用邮箱中收到的链接更改密码。
- 登录受害账户