SQL INJECTION - materias.fi.uba.armaterias.fi.uba.ar/6669/alumnos/2006-2/SQLInjection.pdf ·...
Transcript of SQL INJECTION - materias.fi.uba.armaterias.fi.uba.ar/6669/alumnos/2006-2/SQLInjection.pdf ·...
SQL INJECTION
66.69 – Criptografía y Seguridad Informática
Benitez, MarceloChinikailo, CristianDe la Cruz, LeonardoKlas, Julián
Grupo 5
Introducción
Ataque basado en inyección de códigoExplota omisiones en la verificación de parámetrosAtaques relacionados
Cross-Site ScriptingBuffer OverflowFile Includes
2
Requerimientos para el ataque
Conocimientos técnicosObligatorios
Lenguaje SQLOpcionales
Conocimiento del DBMSPHPHTTP y lenguaje C (ataques sin browser)
Conocimientos acerca de la víctimaConsulta a ser explotadaTablas de la base de datosDBMS en uso
3
Análisis del Problema
En las aplicaciones basadas en web el usuario ingresa datos mediante formulariosLos datos se envían a un script que construye una consulta SQL usando los datos ingresadosCuando los parámetros no se validan, se pueden utilizar consultas “legales” para ejecutar acciones arbitrarias sobre una Base de Datos
4
Ejemplo: Login (codigo HTML)
<html><body>
<form name="frmSistema" method="POST" action="login.php">
<input type="text" name="username" value="Usuario"/><input type="text" name="password"
value="Password"/><input value="Ingresar" type="submit"/>
</form></body></html>
5
Ejemplo: Login (codigo HTML)
Internet Explorer – SQL InjectionInternet Explorer – SQL Injection
Ingresar
Usuario
Password
6
Ejemplo: Login (código PHP)$username = isset($_REQUEST['username'])?$_REQUEST['username']:"";$password = isset($_REQUEST['password'])?$_REQUEST['password']:"";$_dbhandler = mysql_connect("localhost", "root", "clavecita",true);$_connected = mysql_select_db("fiuba", $_dbhandler);$sql_query = "SELECT * FROM user WHERE username='".$username."' AND
password='".$password."'";$query_result = mysql_query($sql_query,$_dbhandler);$row = mysql_fetch_array($query_result);if(count($row)>1){
print "El nombre de usuario $username es Valido. Bienvenido al Sistema";. . . . . .
}
7
Ejemplo: Ataque SQL Injection
El atacante ingresa una cadena maliciosa en el cuadro “password”Esta cadena se expande en el código PHP generando una consulta “maliciosa”
8
Otros ataques posibles
Otras sentencias SQL (borra la tabla de usuarios)SELECT * FROM user_table WHERE username=’user01’ AND password=’pass01’; DROP TABLE user_table;’’;
Uso del catálogo del DBMS (Ejemplo: MySQL)SHOW DATABASES;SHOW TABLES;SHOW TABLES LIKE 'geo%';SHOW TABLES FROM db_bame;
99
Protección contra el ataque (cont.)
Validación: uso de expresiones regularesPara el ejemplo que vimos en PHP: preg_match("/^[A-Za-z0-9-_.]{3,16}$/", $username); preg_match("/^[A-Za-z0-9-_.]{3,16}$/", $password);
10
Protección contra el ataque
Los lenguajes incluyen filtros específicos para validar cadenas
PHP: mysql_real_escape_string()Java: Clase “PreparedStatement”Hay ejemplos en .NET, etc.
11
Protección contra el ataque (cont.)
Se puede configurar el Apache para que limpie las cadenas que pasa al módulo PHP:Directiva “magic_quotes_gpc” en php.iniLos caracteres ' (comilla-simple), " (comilla doble), \ (barra invertida) y NULs son escapados con una barra invertida automáticamente.
12
Protección contra el ataque (cont.)
Otras “Best Practices”8
Evitar SQL Dinámico (usar Stored Procedures)
8
Ejecutar consultas sin privilegios
8
Guardar datos cifrados (caso de los passwords)
13
Demostración 1: Login
DescripciónInyección de código en formulario de registro
Se ve la prevención utilizando:mysql_real_escape_string()Expresiones Regularesmagic_quotes_gpc
14
Demostración 2: Drop table
DescripciónInyección de código en formulario de registro
El ataque permite borrar tablas de la base de datos
15
Ejemplo de ataque desde C/C++char str_exploit="POST /phpnuke/html/ HTTP/1.0\n"
"Connection: Keep-Alive\n" "Pragma: no-cache\n" "Cache-control: no-cache\n" "Accept: text/html, image/jpeg, image/png, text/*, image/*, */*\n" "Accept-Encoding: x-gzip, x-deflate, gzip, deflate, identity\n" "Accept-Charset: iso-8859-1, utf-8;q=0.5, *;q=0.5\n" "Accept-Language: en\n" "Host: www.victim.com\n" "Referer: http://www.victim.com/phpnuke/html?name=Your_Account&op=new user\n" "User-Agent: SecurityReason - [SR]\n
...
”;
void exploit()
{
int sock=tcp_open_activo(url_server,80); // conecta al servidor
FILE * conexion=fdopen(sock,”a”);
fprintf(conexion,str_exploit);
grabar_respuesta(conexión,stdout);
}
Basado en exploit publicado en SecurityReason.org16
Demostración 2: POST desde PERLDescripciónAtaque automatizado que no puede ser realizadodesde el navegador
Utiliza sentencias SQL adicionales (UNION)Muestra ventajas de conocer la estructura de las tablas
17
Demostración 3: Ataque a phpNuke
DescripciónAtaque a portal phpNuke mediante el formulario de registro
18
Ejemplo: Ataque a phpNuke19
Ejemplo: Ataque a phpNuke
Víctimas conocidas y potenciales
Content Management Systems (CMS)phpNUKE (portal)Mambo (portal)phpBB (foros)
Sistemas basados en web: JSP, ASP.NET, PHP, etc.consultas.fi.uba.ar(listas.fi.uba.ar/pipermail/iinfo/2006-March/013843.html)
Sistemas generalesMicrosoft BizTalk Server 2002 (www.microsoft.com/technet/security/Bulletin/MS03-016.mspx)
21