Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: CICOLO_111234 en 19 Abril 2009, 16:16 pm



Título: como evitar la inyeccion sql
Publicado por: CICOLO_111234 en 19 Abril 2009, 16:16 pm
hola!

tengo este codigo:
Código:
if (isset($_GET['ID'])) {
  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
}
mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);

y me gustaria como evitar la inyeccion sql.

salu2


Título: Re: como evitar la inyeccion sql
Publicado por: braulio-- en 19 Abril 2009, 18:52 pm
Mira esta página:
http://informatica-practica.net/solocodigo/index.php/2007/09/06/evitar-inyeccion-sql-ii/ (http://informatica-practica.net/solocodigo/index.php/2007/09/06/evitar-inyeccion-sql-ii/)


Título: Re: como evitar la inyeccion sql
Publicado por: WHK en 20 Abril 2009, 01:02 am
hola!

tengo este codigo:
Código:
if (isset($_GET['ID'])) {
  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
}
mysql_select_db($database_prueba, $prueba);
$query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);

y me gustaria como evitar la inyeccion sql.

salu2

Eso tiene sql inyección ya que el addslashes solo agrega slashses a carácteres que puedan influir en la query, en este caso reemplazaría las comillas dobles y simples pero en el ejemplo que tu pusiste no se necesita una comilla para lanzar la sql inyección.


Código
  1. $_GET['ID'] = '-1 union select 1,concat(shell_en_dword),3 into outfile test.php --';
  2.  
  3. if (isset($_GET['ID'])) {
  4.  $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['ID'] : addslashes($_GET['ID']);
  5. }
  6. mysql_select_db($database_prueba, $prueba);
  7. $query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = %s", $colname_Recordset1);

Para poder evitar esto necesitas encerrar el valor entre comillas y de todas formas tendrías problemas con los slashses asi que simplemente puedes utilizar mysql_real_escape_string:
Código
  1. if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
  2.  
  3. mysql_select_db($database_prueba, $prueba);
  4. $query_Recordset1 = sprintf("SELECT * FROM noticias WHERE ID = '%s'", mysql_real_escape_string($colname_Recordset1));

O también:
Código
  1. if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
  2.  
  3. mysql_select_db($database_prueba, $prueba);
  4. $query_Recordset1 = 'SELECT * FROM noticias WHERE ID = \''.mysql_real_escape_string($colname_Recordset1.'\'';

Ahra si ID es un valor numérico puedes hacer:
Código
  1. if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
  2.  
  3. mysql_select_db($database_prueba, $prueba);
  4. $query_Recordset1 = 'SELECT * FROM noticias WHERE ID = '.(int)$colname_Recordset1;

O también:

Código
  1. if(isset($_GET['ID'])) $colname_Recordset1 = $_GET['ID']; else die('No hay valor');
  2.  
  3. mysql_select_db($database_prueba, $prueba);
  4. $query_Recordset1 = 'SELECT * FROM noticias WHERE ID = '.(int)preg_replace('|[^0-9.]|i', '', $colname_Recordset1);
De esta forma tomará carácteres válidos y no devolverá error si realmente hay un valor numérico.