una reales paso pagina kali inyeccion injection hackear hacer evitar ejemplos ejemplo como casos php sql sql-injection

php - reales - ¿La inyección SQL es un riesgo hoy en día?



inyeccion sql server (20)

¡Tengo que desarrollar un servidor que no tenga forma de desactivar magic_quotes! Incluyo esto en cada página para deshacer los efectos de las comillas mágicas, por lo que puedo hacer el correcto escapando sin "doble escape". Aunque puedo saborear vómitos solo por leer esto, no he encontrado una mejor solución.

if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); }

He estado leyendo acerca de los ataques de inyección SQL y cómo evitarlos, aunque parece que nunca puedo hacer que los ejemplos "horribles" funcionen, por ejemplo, ver esta publicación .

$_GET un archivo PHP y una tabla en la base de datos, tuve un valor pasado por $_GET y traté de eliminar la tabla haciendo bob''); drop table students; -- bob''); drop table students; -- bob''); drop table students; -- y no funcionó. PHP escapa automáticamente del /' y la consulta tiene un error, sin daños. El mismo problema al tratar de replicar "ataques" de inicio de sesión como AND WHERE 1=1 etc.

código de ejemplo:

<?php $id = $_GET[''id'']; $sql = "INSERT INTO Users (Username) VALUES ($id)"; echo $sql; mysql_query($sql) or die(mysql_error());

Y pasaría sql.php?id=1); delete from Users; -- sql.php?id=1); delete from Users; --

Entonces, ¿es esto algo anticuado que solía aplicarse en los días de PHP3 o algo así, y hoy en día incluso los principiantes están protegidos de cosas como citas mágicas?

Estoy usando PHP5 en Ubuntu.


¿No puede PHP consultar los parámetros? Si puede (como me sorprendería si no lo hiciera), esa es la única solución que mitiga TODOS los ataques de inyección de SQL.



Como ya he mencionado varias veces en , soy un firme defensor de PDO, simplemente deje de usar el antiguo mysql, hágase un favor a usted mismo y a sus clientes, aprenda PDO (es realmente fácil) y aproveche las declaraciones preparadas y parámetros vinculados Incluso si no necesita declaraciones preparadas en cuanto al rendimiento, aún obtiene los beneficios de seguridad.

Además, recomendaré colgar toda tu aplicación en la cara del cliente si las comillas mágicas están activadas. Es solo un drenaje de recursos diseñados para proteger a los tontos y molestar a los inteligentes. (usa más CPU que escapando manualmente, porque codifica todo, incluso cuando no lo necesita)


Cuando se crea SQL a partir de cadenas, la inyección SQL es un peligro real.

También descubrí que tratar de evitar crear SQL a partir de cadenas es una tarea inútil. Tarde o temprano, la forma completa de su SQL (no solo las cosas que podrían ser parámetros) debe generarse en tiempo de ejecución.


El ejemplo de bobby tables no funcionará con la interfaz mysql porque no hace múltiples consultas en una sola llamada. La interfaz mysqli es vulnerable al ataque de consulta múltiple. La interfaz de MySQL es más vulnerable al ataque de refuerzo de privilegios:

En su formulario escribo una cuenta: admin password: '' or 1=1 -- para que su inicio de sesión típico sql: select * from users where user_name = ''$admin'' and password = ''$password'' . El o hace que esto sea cierto y le permite iniciar sesión.


El robo de identidad más grande de la historia se logró en 2007 mediante la explotación de una vulnerabilidad de inyección SQL: ver " Inyecciones de inyección SQL en Heartland, violaciones a Hannaford " (ComputerWorld, 18/08/2009).

OWASP informó en 2007 que los ataques de inyección (de los cuales la inyección SQL es un ejemplo) continúan siendo uno de los problemas de seguridad de software más comunes.

También puede buscar Noticias de inyección SQL recientes y encontrar muchos casos reportados cada mes.

Sin embargo, el ejemplo en la caricatura XKCD no es necesariamente el tipo más común de exploit. Dejar caer una tabla ejecutando una segunda instrucción SQL en una solicitud probablemente no le ganaría mucho al atacante en el camino de datos valiosos, sería simplemente vandalismo.

Además, algunas interfaces de consulta no permiten multi-query de forma predeterminada de todos modos. Es decir, la API del cliente de la base de datos ejecuta una única instrucción dada la cadena SQL, independientemente de los puntos y comas. Esto derrota el ejemplo que se muestra en la caricatura.

Nota: El método query() PDO es conocido por ser compatible con múltiples consultas por defecto. Por lo tanto, es susceptible al ataque al estilo XKCD.

Como han señalado otras personas, el riesgo más probable es que una inyección SQL altere la lógica de las expresiones SQL y aplique su consulta a filas adicionales además de las deseadas.

Por ejemplo:

$sql = "UPDATE Users SET PASSWORD = MD5(''" . $_POST["password"] . "''||salt) " . "WHERE user_id = " . $_POST["userid"];

¿Qué sucede cuando envío una solicitud con el parámetro userid establecido en la cadena 123 OR userid=456 ? Me gustaría restablecer mi propia contraseña (ID de usuario 123), así como la contraseña de ID de usuario 456. Incluso el hash de la contraseña con una sal por usuario no protegería contra esto. Ahora puedo iniciar sesión en cualquiera de las cuentas.

Hay muchas formas de perpetrar la inyección SQL.


Ese ataque en particular no funciona, ya que mysql_query solo ejecutará una sola declaración.

Sin embargo, aún puedo abusar de tu código, por ejemplo, si accedí a que el ID sea SELECT password FROM Users WHERE Username=''admin'' podría tener una posibilidad de luchar para que tu sistema pueda exponer alguna información interna.

Básicamente, si permite la entrada no filtrada en su SQL, habrá formas muy creativas de crear datos que no esperaba y de exponer datos que no tenía intención de utilizar.


Este es un riesgo muy activo, las citas mágicas intentan darte una solución, pero prefiero desarrollarlas siempre con comillas mágicas. De esta manera, tengo que asegurarme de que realmente escapo de las entradas. Quién sabe si las comillas mágicas estarán activadas o desactivadas en el servidor donde se implementó realmente el script.


Este sigue siendo un gran problema. No puede suponer que magic_quotes está activada en cada instalación de PHP que pueda usar.

Para ver si magic qotes está activado y limpiar el desorden de las comillas mágicas:

if ( get_magic_quotes_gpc() !== 0 ) { $foo = stripslashes( $foo ); }

Luego, limpie sus declaraciones un poco:

$foo = mysql_real_escape_string( $foo ); $sql = "select * from foo where bar=''{$foo}''";

etc.

De hecho, es mejor que simplemente magic_quotes estrictamente las magic_quotes si tienes la capacidad para hacerlo.

Espero que eso te ayude.


Hay muchas maneras diferentes de realizar una Inyección SQL y muchas formas de eludir las precauciones básicas de seguridad.

Esos ataques han estado dentro de las 10 principales vulnerabilidades de aplicaciones web (rango n.º 2) según OWASP.

Para obtener más información, consulte Top 10 2007-Flaqueos de inyección .



La regla de oro más simple es suponer que toda la input usuario puede estar contaminada. Verifique que los tipos de datos sean los esperados, que las variables estén en los rangos de longitud / tamaño que esperaba, los archivos sean del tamaño y tipos que permita, etc. Se pueden requerir otras comprobaciones de datos no externos, antes de llamar a un administrador importante. nivel de función, hacer una comprobación - ($userlevel != ADMIN)?die():important_function();

Siempre hay un pez más grande, o alguien que es un idiota más grande que tú. Evita los supuestos sobre los datos y tienes una ventaja.


Las comillas mágicas no tienen en cuenta la codificación de caracteres y, por lo tanto, son vulnerables a ataques basados ​​en caracteres de multi-byte .

En cuanto a que es un riesgo hoy en día, las búsquedas de Google aparecen en innumerables sitios vulnerables. Se informó de una vulnerabilidad de inyección SQL para Bugzilla alrededor del 10 de septiembre. Por lo tanto, sí, los sitios aún están en riesgo. ¿Deberían serlo? Las herramientas están ahí para prevenir la inyección, entonces no.


Los parámetros pasados ​​a consultas sql desde las páginas web suelen ser ID numéricos. Por ejemplo, supongamos que tiene una url http://foo.com/page.php?section=34 desde la cual se utiliza la ID de sección en una consulta como esta:

SELECT content FROM sections WHERE section_id=$section;

No hay citas para escapar como en su ejemplo y lo que sea que ponga después de que el número en la URL se pase a la consulta ... Entonces, el riesgo es real.


No, esto sigue siendo muy relevante.

Como son XSS y CSRF. Nunca subestimes la importancia de un filtrado de entrada adecuado.


No, y cuanto menos te preocupes por la inyección de SQL, es más probable que te golpee.


Oh, mi ... La inyección SQL no es un riesgo, es un agujero de seguridad enorme . Principalmente existe en php porque la API hace que quieras interpolar cualquier dato antiguo en tus consultas SQL.

Cuando veo un sitio escrito en PHP o ASP, puedo oler los vectores de inyección SQL de los que apestan. La gente intenta proteger sus aplicaciones PHP con mysql_real_escape_string() e intval() y hacer lo mismo en otros idiomas. Esto es un error. Es como codificar en C en lugar de en Java o Python, donde en el primero, comete un error y está muerto, pero en el segundo, solo pueden existir defectos semánticos.

Insto encarecidamente a las personas a utilizar ya sea mysqli con declaraciones preparadas, o cualquier otra cosa que esté parametrizada , sustituyendo texto en código y luego interpretarlo es una mala práctica en primer lugar en mi humilde opinión.

En otra nota, las citas mágicas de PHP son simplemente tontas, y afortunadamente, obsoletas. Solo puede causar más daño que bien. Si dependes de citas mágicas, significa que tu aplicación será propiedad cuando las comillas mágicas estén deshabilitadas. Del mismo modo, puede romper otras aplicaciones que no esperan cadenas escapadas en las entradas.


Según OWASP 2017 Top 10 , todavía la Inyección es el ataque más sucedido y peligroso.

"La inyección SQL es siempre el riesgo número uno. Eso es un reflejo de cuántos incidentes hay, así como de otros factores que lo mantienen muy arriba" Troy Hunt - fundador del sitio de violación haveibeenpwned.com

Solo para recordar, con la inyección SQL podemos volcar toda la base de datos, controlar el servidor web cargando el shell web, etc.


Todo lo contrario. Las comillas mágicas están en desuso en PHP5 y se eliminarán por completo en PHP 5.4 , ya que trajeron más confusión al mundo de la programación de lo que hicieron bien. Comprobar si las comillas mágicas están activas, y escapando cualquier entrada de SQL escrupulosamente si es necesario, sigue siendo muy, pero muy importante ... No hay razón para sentirse mal, todos hemos estado allí, y mi culo sin saber se ha salvado mediante citas mágicas incontables veces :)

El manual de PHP sobre citas de magia explica todo.