php - saber - Alguien ha pirateado mi base de datos, ¿cómo?
mi correo ha sido hackeado (6)
Creo que esto se hace a través de shell php (puerta trasera). ¿Es eso un anfitrión compartido? de ser así, compruebe si otro sitio web en el mismo servidor es atacado o no, esto lo ayudará a ver si el atacante ingresa a su sitio desde su vecindario. Para ver sitios web en su servidor, necesita escaneo inverso de IP.
Alguien ha pirateado mi base de datos y ha abandonado la mesa.
En mi página de PHP hay una sola consulta en la que estoy usando mysql_real_escape_string:
$db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset(''utf8'',$db_con);
$email= mysql_real_escape_string($_POST[''email'']);
$name= mysql_real_escape_string($_POST[''name'']);
$sex= mysql_real_escape_string($_POST[''sex'']);
if($_POST[''M'']!=""){ $sim = 1; }else { $sim = 0; }
$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( ''".$email."'', ''".ucwords(strtolower($name))."'', ''".$sex."'',''".$sim."'')";
$res = mysql_query($query) or die("Query fail: " . mysql_error() );
mysql_close($db_con);
Y register_globals
está deshabilitado .
Entonces, ¿cómo fue pirateada mi base de datos?
El hecho de que su base de datos se haya visto comprometida no significa que haya una inyección sql. Si lo desea, puede compartir el registro de acceso, que debería proporcionar suficientes pistas sobre dónde ingresó el atacante. Mi suposición sería la inclusión de archivos locales, donde incluía el archivo de configuración, o quizás algún tipo de vulnerabilidad de ejecución de código. Sin más información, es solo una adivinación, bien podría haber sido un buen trabajo de ingeniería social o un ataque de phishing ...
En vista de ello, no has dejado ninguna abertura para un ataque de inyección sql. ¿Este extracto del código es definitivamente aquel en el que se está produciendo la intrusión?
Lo único que puedo encontrar es este anuncio ambiguo de un proveedor de hosting sobre ucwords: http://2by2host.com/articles/php-errors-faq/disabled_ucwords/
GRAMO
No parece que el código que pegaste proporcione un ataque adecuado. La forma en que investigaría esto es escanear los registros binarios de MySQL para la declaración DROP TABLE relevante, para darme una marca de tiempo. Luego puede usar esa marca de tiempo para buscar solicitudes de Apache con las que puede correlacionarse.
Entonces, es solo un caso de auditar cuidadosamente el código en cada solicitud de candidato hasta que lo encuentre :(
Tal vez tienes un usuario de MySQL con una contraseña débil. Cambiaría todas las contraseñas y verificaría quién está autorizado a conectarse a la base de datos MySQL. Bloquee su firewall para que solo se abran los puertos necesarios (80,443?)
Aquí hay algunos artículos sobre cómo bloquear tu código php http://www.addedbytes.com/writing-secure-php/
Atentamente. Asbjørn Morell
La conexión MySQL. Si no se especifica el identificador de enlace, se asume el último enlace abierto por mysql_connect (). Si no se encuentra dicho enlace, intentará crear uno como si se llamara a mysql_connect () sin argumentos. Si no se encuentra o no se establece ninguna conexión, se genera un error de nivel E_WARNING.
Como se explica aquí: ¿mysql_real_escape_string () TOTALMENTE protege contra la inyección de SQL?
En función de su fragmento de código, ha conectado la base de datos dos veces.
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset(''utf8'',$db_con);
Y no proporcionó el identificador de enlace de la base de datos para:
$email= mysql_real_escape_string($_POST[''email'']);
$name= mysql_real_escape_string($_POST[''name'']);
$sex= mysql_real_escape_string($_POST[''sex'']);
Por lo tanto, mysql_set_charset no tiene ningún efecto de escape real proporcionado $_POST
para caracteres de varios bytes.
Sugerencia
- elimine el segundo
mysql_connect($db_host,$username,$password);
- agregue explícitamente
$db_con
al hacermysql_real_escape_string