-
qué hacer con un SQLi
Hola amigos,
Un gusto saludarlos, espero que éste sea el lugar indicado para hacer la consulta, les hago el planteamiento del siguiente escenario para solicitarles el favor de brindarme algunas ideas:
Tengo una web pequeña PHP 7.2 y MariaDB, desarrollada sin Framework ni CMS, es decir, a pie!!
Ya la estoy actualizando y montando sobre un Wordpress pero resulta que esta muy mal hecha que es vulnerable fácilmente a ataques de SQLi, ya he visto dos modificaciones no autorizadas en la base de datos, me recupero con un backcup pero vuelve a ocurrir, entiendo que mientras no solvente las partes del código que fueron mal desarrolladas esto no va a parar, pero la consulta es ¿Habrá alguna forma de identificar el origen del ataque para poder aplicar una restricción? o ¿Cómo hacer para prevenir que esto pase mientras aplico la solución definitiva?
Muchas gracias desde ya por sus ideas.
Saludos,
-
Hola @darktux
Lo tienes muy fácil o muy difícil, te cuento.
Las restricciones se puede hacer via firewall o modificando Apache para restringir que IPs puede acceder. Si solo accede dos usuarios con una IP cada uno, solo tienes que modificar la configuración para denegar el acceso a TODOS excepto esas dos IPs. Pero te cuidado, no vayas a restringir tu propia IP, pero esta solución no es aplicable si necesitas tener esa Web y su base de datos accesible a todo el mundo salvo que el acceso a la BBDD se haga en una determinada carpeta www.pepe.com/acceso dentro de la carpeta acceso que esta tus programas puedes crear un archivo .htaccess con las IPs autorizadas.
Mas informacion: Apache restringir acceso por IP
La otra solución, implica crear un programa PHP de acceso, con login y password, para después modificar todo el codigo PHP existente para insertar después del "<?php" algo similar a esto:
Código PHP:
<?php
session_start();
if (empty($_SESSION)) {
header('Location: https://'.$_SERVER['HTTP_HOST']);
die();
}
if ( !isset($_SESSION['authuser']) || $_SESSION['authuser'] != 1 ) {
echo 'Por favor, autentificase con su usuario y contraseña en este enlace: <a href="login.php">Inicializar sesión</a>';
exit(1);
}
En el login.php tienes que autentificar el usuario dentro de programa o consultando a la BBDD y poner una variable de sesión como autorizado: $_SESSION['authuser'] = 1;.
Código PHP:
if ( $valid ) {
$_SESSION['usuario'] = $usuario;
$_SESSION['rol'] = $rol;
$_SESSION['authuser'] = 1;
if ($recordarme == "on") {
setcookie("pma_data", hash('sha512',$usuario), time() + 60 * 60 * 24 * 7);
}
header ('Location: index.php');
exit;
}
-
Post Thanks / Like - 1 Gracias, 2 Me Gusta, 0 No me Gusta
-
Estimado amigo @DiabloRojo
Como siempre un gran aporte y ayuda la tuya, comienzo con la parte más fácil del filtrado y luego ir saneando a pie las partes del código que necesito.
Saludos
-
Lo mas sano y seguro, seria sanitizar las peticiones a la base de datos, si estas usando php puedes utilizar mysql_real_scape_string para evitar la inyección.
Código:
<?php
...
...
...
# Suponiendo que la variable afectada es "id"
#http://localhost/index.php?id=22
$getid=$_GET["id"];
$consulta = mysql_real_escape_string("SELECT * FROM users WHERE id='$getid'"); #consulta a la base de datos tomando el valor de la variable id en la url
mysql_query($consulta);
...
...
También trata de no imprimir el error de mysql (... or die ( mysql_error() ) ... ) ya que eso es lo que se busca ya sea manualmente o con algún programa como sqlmap para lograr la inyección.
Incluso sustituirlo por algo personalizado (... or die ("fallo en la consulta X") ...) así con suerte los programas lo tomen como falso positivo y ahora la inyección sera a ciegas (blind injection) que es muchísimo mas difícil de explotar.
Saludos.
-
Coincido con el compañero @Defton, es la mejor opción.
Usando Notepad++ en Windows o Kate o Geany en Linux puedes usar la opción buscar y reemplazar para cambiar las entradas de las variables de tus programas.
En mi caso no lo necesito porque uso PDO que ya viene con las opciones preparadas pare evitar SQLi. Lee este articulo: https://es.stackoverflow.com/questio...B3n-sql-en-php
Marcadores