Bolt.new envía aplicaciones generadas por IA a los subdominios de Bolt.host en segundos, pero las plantillas predeterminadas a menudo envían claves API expuestas en paquetes de clientes y CORS permisivos. Este tutorial muestra un flujo de trabajo de escaneo ético que encuentra errores de configuración en sus propias aplicaciones Bolt utilizando el descubrimiento SERP de Scavio.
Requisitos previos
- Python 3.10+
- Una clave API de Scavio
- Permiso por escrito para cualquier dominio de destino
- solicita biblioteca
Guia paso a paso
Paso 1: Enumerar aplicaciones alojadas en Bolt
Los idiotas de SERP encuentran aplicaciones indexadas en Bolt.host.
DORKS = [
'site:bolt.host',
'site:bolt.host api_key',
'site:bolt.host \"supabase\" OR \"firebase\"'
]Paso 2: Recopilar URL candidatas
Ejecuta a cada idiota a través de Scavio.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def enumerate():
urls = set()
for d in DORKS:
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'query': d, 'num_results': 50})
for h in r.json().get('organic_results', []):
urls.add(h['link'])
return urlsPaso 3: Obtener paquetes JS del cliente
Busque secretos filtrados en el JS incluido.
import re
SECRET_PATTERNS = [r'sk_live_[A-Za-z0-9]{20,}', r'AIza[A-Za-z0-9_-]{30,}', r'eyJ[A-Za-z0-9_-]{20,}']
def scan_bundle(url):
html = requests.get(url, timeout=10).text
js_urls = re.findall(r'src=\"([^\"]+\.js)\"', html)
hits = []
for j in js_urls:
full = j if j.startswith('http') else url.rstrip('/') + j
body = requests.get(full, timeout=10).text
for p in SECRET_PATTERNS:
hits += re.findall(p, body)
return hitsPaso 4: Probar la política CORS
Verifique Acceso-Control-Permitir-Origen: *.
def cors_check(url):
r = requests.options(url, headers={'Origin': 'https://evil.example'})
return r.headers.get('Access-Control-Allow-Origin') == '*'Paso 5: Informe
Escriba un hallazgo por aplicación con gravedad.
def report(url, secrets, cors_wide):
if secrets or cors_wide:
print(f'[{url}] secrets={len(secrets)} cors_wide={cors_wide}')Ejemplo en Python
import os, requests, re
API_KEY = os.environ['SCAVIO_API_KEY']
PATTERNS = [r'sk_live_[A-Za-z0-9]{20,}', r'AIza[A-Za-z0-9_-]{30,}']
def scan():
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': 'site:bolt.host my-app', 'num_results': 20})
for h in r.json().get('organic_results', []):
html = requests.get(h['link'], timeout=10).text
secrets = []
for p in PATTERNS: secrets += re.findall(p, html)
if secrets: print(f'[{h["link"]}] leaked secrets: {len(secrets)}')
scan()Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
const PATTERNS = [/sk_live_[A-Za-z0-9]{20,}/g, /AIza[A-Za-z0-9_-]{30,}/g];
export async function scan() {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: 'site:bolt.host my-app', num_results: 20 })
});
const data = await r.json();
for (const h of data.organic_results || []) {
const html = await (await fetch(h.link)).text();
const secrets = PATTERNS.flatMap(p => html.match(p) || []);
if (secrets.length) console.log(`[${h.link}] ${secrets.length} secrets`);
}
}Salida esperada
Per-URL list of leaked secrets and CORS posture. Typical finding rate: 5-15% of Bolt apps have at least one exposed key.