Principales problemas:
# Ejemplo de análisis de dependencias
npm audit
composer audit
Ejercicio práctico:
{
"name": "my-web-app",
"version": "1.0.0",
"dependencies": {
"lodash": "4.17.15",
"express": "4.16.1",
"node-fetch": "2.6.0",
"jquery": "3.4.1"
}
}
const express = require('express');
const fetch = require('node-fetch');
const _ = require('lodash');
const app = express();
// Vulnerable a prototype pollution via lodash merge
app.post('/merge', express.json(), (req, res) => {
const merged = _.merge({}, req.body);
res.json(merged);
});
// Vulnerable a SSRF via node-fetch
app.get('/proxy', async (req, res) => {
const url = req.query.url;
const response = await fetch(url);
const data = await response.text();
res.send(data);
});
// Vulnerable a ReDoS via express
app.get('/search/:pattern', (req, res) => {
const regex = new RegExp(req.params.pattern);
// ... búsqueda usando regex inseguro
});
// XSS via jQuery en el frontend
app.get('/', (req, res) => {
res.send(`
<script src="/jquery.min.js"></script>
<script>
// Vulnerable a XSS en jQuery < 3.5.0
$(document).ready(function() {
$('#content').html(location.hash.slice(1));
});
</script>
<div id="content"></div>
`);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Herramientas de análisis:
Problemas comunes:
# Ejemplo de autenticación débil
def login(username, password):
user = find_user(username)
if user and user.password == password: # Comparación en texto plano
session['user_id'] = user.id # Sin rotación de sesión
return True
return False # Sin rate limiting
Ejercicios:
// JWT vulnerable
const token = jwt.sign(
{ user: 'admin' },
'secret',
{ algorithm: 'none' }
);
Áreas críticas:
# Deserialization insegura
import pickle
data = pickle.loads(user_input) # Peligroso!
Ejercicios prácticos:
Aspectos clave:
# Logging insuficiente
def login(user, pwd):
if authenticate(user, pwd):
return True
return False
# Sin logging de intentos fallidos!
Prácticas:
-- Log injection
admin'); DROP TABLE logs;--
Vectores comunes:
# SSRF vulnerable
def get_data(url):
return requests.get(url).text
Escenarios prácticos:
# Ejemplo de payload SSRF
http://internal-service/
file:///etc/passwd
dict://attacker:11211/
Crear archivo compose.yml:
version: '3'
services:
dvwa:
image: vulnerables/web-dvwa:latest
ports:
- "8080:80"
environment:
- MYSQL_USER=dvwa
- MYSQL_PASSWORD=p@ssw0rd
- MYSQL_DATABASE=dvwa
volumes:
- dvwa_data:/var/lib/mysql
restart: unless-stopped
volumes:
dvwa_data:
Comandos para ejecutar:
# Iniciar DVWA
docker compose up -d
# Verificar estado
docker compose ps
# Ver logs
docker compose logs -f
# Detener DVWA
docker compose down
Objetivos: