criticalCWE-472A04:2021

Manipulacion de Precios

Aceptar precios del cliente en vez de buscarlos del lado del servidor permite a los atacantes modificar requests de checkout y comprar productos al precio que elijan.

Cómo Funciona

Cuando una aplicacion de e-commerce envia el precio al servidor como parte del request de checkout, los atacantes pueden interceptarlo y modificarlo. Usando las herramientas de desarrollador del navegador o un proxy como Burp Suite, cambian el precio de $99.99 a $0.01 antes de que el request llegue al servidor. Si el servidor confia en el precio proporcionado por el cliente y crea el payment intent de Stripe o procesa la orden con ese monto, el atacante obtiene el producto casi gratis. Esta vulnerabilidad es sorprendentemente comun en aplicaciones que pasan datos de precio a traves de campos de formulario ocultos, variables JavaScript o bodies de requests de API en vez de buscar el precio canonico de la base de datos del lado del servidor.

Código Vulnerable
app.post('/api/checkout', async (req, res) => {
  const { productId, price, quantity } = req.body;
  const session = await stripe.checkout.sessions.create({
    line_items: [{ price_data: {
      currency: 'usd',
      unit_amount: price,  // Price from client!
      product_data: { name: req.body.productName }
    }, quantity }],
    mode: 'payment'
  });
  res.json({ url: session.url });
});
Código Seguro
app.post('/api/checkout', async (req, res) => {
  const { productId, quantity } = req.body;
  const product = await db.product.findUnique({ where: { id: productId } });
  if (!product) return res.status(404).json({ error: 'Product not found' });
  const session = await stripe.checkout.sessions.create({
    line_items: [{ price: product.stripePriceId, quantity }],
    mode: 'payment'
  });
  res.json({ url: session.url });
});

Ejemplo Real

En 2023, una vulnerabilidad de manipulacion de precios en una plataforma importante de delivery de comida permitia a los usuarios modificar totales de ordenes via requests de API. Los atacantes cambiaron precios a $0.01 y realizaron miles de ordenes antes de que el problema fuera detectado, resultando en perdidas financieras significativas para la empresa.

Cómo Prevenirlo

  • Nunca aceptes precios del cliente — siempre busca los precios desde la base de datos del lado del servidor
  • Usa Stripe Price IDs almacenados en tu base de datos en vez de montos dinamicos con price_data
  • Valida los montos totales del lado del servidor antes de crear payment intents
  • Registra y genera alertas en ordenes donde el monto cobrado difiere del precio esperado del catalogo

Tecnologías Afectadas

Node.jsReactNext.jsPythonGoJavaPHP

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas