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:
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:
- Tips de seguridad básica al crear nuestras aplicaciones web en php/mysql (en Xombra.com).
- Seguridad en PHP y MySQL (en CodeNB.com).
- Seguridad bajo PHP y MySQL (en Q-Interactiva.com).
Seguridad con PHP / MySQL(en Peivem.com).Seguridad en sitios web con PHP y MySQL(descarga de RAR en ATP.com.ar).

Comentarios
Publicar un comentario