Hacking bajo la lupa
 

Traducción y resumen de artículo para Security Focus:

- Five common Web application vulnerabilities
- Sumit Siddharth, Pratiksha Doshi

2da Parte: SQL injection

La inyección de SQL es un método muy antiguo, pero aún es popular entre los atacantes. Esta técnica permite a un atacante obtener información crucial de un servidor Web de la base de datos. Dependiendo de las medidas de seguridad de la aplicación, el impacto de este ataque puede variar desde la divulgación de información básica hasta la ejecución remota de código y total compromiso del sistema.

Rating: Medio y Crítico

Productos Vulnerables:
PHPNuke, MyBB, Mambo CMS, ZenCart, osCommerce

MS SQL tiene la característica de llamadas de procedimiento almacenado extendido (extended stored procedure), que permite ejecutar comandos a nivel de sistema a través del servidor de MS SQL - como agregar un usuario. Además, los mensajes de error mostrados por el servidor de MS SQL revelan más información que un servidor MySQL. Mientras que MS SQL Server no es especialmente propenso a ataques de inyección de SQL, hay medidas de seguridad que deben aplicarse para que sea segura y no permitir que el servidor SQL dé información crítica del sistema.

Este es un ejemplo de un código que puede ingresar un usuario y es utilizado directamente como una query de SQL:

<form action="sql.php" method="POST" />
<p>Name: <input type="text" name="name" /><br />
<input type="submit" value="Add Comment" /></p>
</form>
<?php
$query = "SELECT * FROM users WHERE username = '{$_POST['username']}";
$result = mysql_query($query);
?>

Este script funciona normalmente cuando el campo username no contiene ningún caracter malicioso:

$query = "SELECT * FROM users WHERE username = 'steve'";

Sin embargo una inyección de sql podría resultar de esta forma:

$query = "SELECT * FROM users WHERE username = '' or '1=1'";


Como la condición "or" es siempre verdadera, la función mysql_query va a retornar los registros de la tabla de datos. Un ejemplo similar sería usar "AND" y un comando de SQL que generaría un mensaje de error específico:





Es obvio que este tipo de mensajes de error ayuda a un atacante a obtener la información que está buscando (nombre de la tabla, de la base de datos, usuarios, hashes de contraseñas, etc.). Mostrar mensajes de error personalizados puede ser una buena solución para este problema, sin embargo, existe otra técnica conocida como ataque de inyección de SQL a ciegas (Blind SQL Injection), donde el atacante es todavía capaz de llevar a cabo una inyección de SQL, incluso cuando la solicitud no revela ningún mensaje de error del servidor de base de datos que contenga información útil para el atacante.

Contramedidas:

Evite conectar a la base de datos como superusuario o como el propietario de la base de datos. Utilice siempre usuarios personalizados para conectar a la base de datos con el mínimo privilegio necesario para realizar la tarea asignada.

PHP tiene dos funciones para MySQL que sanitizan los imputs del usuario: addslashes (el más viejo) y mysql_real_escape_string (el método recomendado). Esta función viene con PHP >= 4.3.0, por lo que debe comprobar primero si existe esta función y que esté ejecutando la última versión de PHP 4 o 5.

Fuente: Security Focus




 











Copyright © 2009 I-SEC. Todos los derechos reservados

Política de privacidad