Una factura se devuelve a otra cuenta.
Un ejemplo ficticio de cómo se documenta un hallazgo, de la evidencia al retest. Los dominios, las cuentas y los datos son inventados.
Alcance
En alcance: app.example.com y api.example.com/v1, probados con dos cuentas de prueba autorizadas. Excluido por acuerdo: páginas de pago de terceros. La autenticación se confirmó al definir el alcance, y esta prueba externa no necesitó código fuente.
Cuentas de prueba
session=test-account-a
Dueña de la factura demo-01
session=test-account-b
Dueña de la factura demo-02
Solicitud y respuesta
Autenticados como la cuenta de prueba A, pedimos una factura que pertenece a la cuenta de prueba B.
GET /api/invoices/demo-02 HTTP/1.1 Host: api.example.com Cookie: session=test-account-a
{ "invoice": "demo-02",
"owner": "test account B"}La API devolvió la factura de la cuenta B a la cuenta A. Un investigador reprodujo el resultado antes de reportarlo.
Pasos para reproducir
- Inicie sesión en app.example.com como la cuenta de prueba A.
- Envíe GET /api/invoices/demo-02 con la sesión de la cuenta A.
- Observe una respuesta 200 con la factura de la cuenta B.
- Repita como la cuenta B para confirmar que demo-02 pertenece a B.
Contexto de código Alcance propuesto de Defense
Recorrido: aplicación web, luego el servicio de facturación, luego la consulta de la factura. El handler carga una factura por id y la devuelve sin comprobar el dueño.
export async function getInvoice(req, res) {
const invoice = await invoices.find(req.params.id)
return res.json(invoice) // owner not compared}Enfoque sugerido: compare el dueño de la factura con la cuenta autenticada antes de devolverla.
Revisión de los desarrolladores
Sus desarrolladores revisan la orientación y deciden el cambio. Una versión posible:
const invoice = await invoices.find(req.params.id) + if (!invoice || invoice.accountId !== req.session.accountId) {+ return res.status(403).end()+ } return res.json(invoice)
Expectativa del retest
Después de la corrección de su equipo, repetimos la misma solicitud autorizada dentro del alcance.
Las facturas de la propia cuenta A deben seguir devolviendo 200.403