??HIGHOWASP #10

?? Server-Side Request Forgery (SSRF)

Ocurre cuando una aplicación web hace peticiones HTTP a un destino suministrado por el aéééticante. Permite acceder a servicios internos, metadatos de cloud y más.

?

Impacto

  • Acceso a servicios internos (Redis, Elasticsearch, BD)
  • Lectura de metadatos de cloud (AWS IMDS, GCP, Azure)
  • Port scanning de red interna
  • Bypass de firewalls y segmentación de red
  • En casos extremos: RCE
??

Explotación (�ético)

??Solo sistemas autorizados
Payloads? Test
# Acceso a localhost
http://127.0.0.1/admin
http://localhost:22
http://[::1]/

# Metadatos AWS
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/

# Bypass de filtros
http://localhost.localdomain/
http://127.1/
http://0x7f000001/
http://2130706433/  # 127.0.0.1 en decimal
Ejemplo Vulnerable? Código
# Flask vulnerable a SSRF
@app.route('/fetch')
def fetch_url():
    url = request.args.get('url')
    return requests.get(url).text  # SSRF!
???

Mitigación

Python? Seguro
import ipaddress
from urllib.parse import urlparse

def is_safe_url(url):
    parsed = urlparse(url)
    
    # Solo HTTPS
    if parsed.scheme != 'https':
        return False
    
    # Whitelist de dominios
    allowed = ['api.trusted.com', 'cdn.trusted.com']
    if parsed.hostname not in allowed:
        return False
    
    # Verificar que no sea IP privada
    try:
        ip = ipaddress.ip_address(parsed.hostname)
        if ip.is_private or ip.is_loopback:
            return False
    except:
        pass
    
    return True
  • Usar whitelist de URLs/dominios permitidos
  • Bloquear IPs privadas y localhost
  • Deshabilitar redirects automáéticos
  • Usar IMDSv2 en AWS (requiere tokens)
  • Segmentar red para limitar acceso desde app servers
??

Labs