Seguridad PHP y MySQL: la inyección SQL

Observa este código script escrito en PHP.

Su función es mostrar un formulario y pedir un dato, llamarse a sí mismo, comprobar si la variable está definida, en cuyo caso es que hemos rellenado el formulario y enviado a servidor; si es así, construimos una orden SQL, la ejecutamos, recibimos los datos y los procesamos.


Hasta aquí, nada fuera de lo normal.

<html>
<head>
<title>Ataque por SQL Injection</title>
</head>
<body>
<?
 if (isset($_REQUEST['id'])) {
  $sql = "SELECT * FROM mitabla WHERE id = " . $_REQUEST['id'];
  // ... ejecutar SQL
  // ... recuperar resultado
  // ... hacer más cosas
 }
 else {
  ?>
  <form method="POST" action="miprograma.php">
  <p>ID a consultar: <input type="text" name="id"></p>
  <p><input type="submit" value="Enviar"></p>
  </form>
  <?
 }
?>
</body>

Este pequeño script puede usarse de dos maneras, rellenando el formulario y pulsando el botón Enviar o bien con una llamada directa a la URL "miprograma.php?id=1", por ejemplo.

Pero qué pasa si bien en el formulario, o en la llamada directa vía URL pasamos algo así como "1; DELETE FROM mitabla;".

Claro, el atacante tiene que saber el nombre de la tabla, que podría averiguarlo si provoca un error y el programa está hecho para que devuelva el mensaje generado por mysql_error() vía un echo. Puede ser, es habitual que se dejen ese tipo de mensajes en los desarrollos.

Este tipo de ataques se denomina SQL injection y forma parte del ABC básico de los atacantes novatos. Como ahora mismo estoy con este asunto, recomiendo la lectura de estos artículos, aunque casi todos giran entorno a las mismas recomendaciones básicas:


Comentarios

Entradas populares