SQL INJECTION - materias.fi.uba.armaterias.fi.uba.ar/6669/alumnos/2006-2/SQLInjection.pdf ·...

Post on 07-Nov-2018

224 views 0 download

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