Foros del Web » Programando para Internet » PHP »

administrador de contenidos - seguridad

Estas en el tema de administrador de contenidos - seguridad en el foro de PHP en Foros del Web. buenos dias ! antes que nada los felicito por los grandes aportes que hacen día a día ahora bien en esta ocasión estoy desarrollando un ...
  #1 (permalink)  
Antiguo 16/04/2009, 10:59
Avatar de santoinocente  
Fecha de Ingreso: agosto-2006
Ubicación: buenos aires. argentina.
Mensajes: 59
Antigüedad: 17 años, 8 meses
Puntos: 0
De acuerdo administrador de contenidos - seguridad

buenos dias !

antes que nada los felicito por los grandes aportes que hacen día a día

ahora bien en esta ocasión estoy desarrollando un sistema de administración o backend en php + mysql
en realidad lo tengo listo solo me gustaría conocer su opinion en cuanto a la seguridad de este, si alguno tiene idea de seguridad en PHP

este es el link
http://www.marianodamianarias.com/cristobarrios4/admin

alguno puede llegar a acceder sin tener las contraseñas ¿?

muchas gracias!!!!
  #2 (permalink)  
Antiguo 16/04/2009, 11:02
 
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años, 9 meses
Puntos: 2
Esta muy sencillo ingresar a tu web, como muestra de ello te envio el texto de bienvenida:

Bienvenido!
--------------------------------------------------------------------------------
Haga click en los enlaces del menu principal para acceder a alguna de las secciones.

Ahora ya lo cambie la contraseña, ;)

Última edición por GatorV; 16/04/2009 a las 12:19
  #3 (permalink)  
Antiguo 20/04/2009, 07:22
Avatar de santoinocente  
Fecha de Ingreso: agosto-2006
Ubicación: buenos aires. argentina.
Mensajes: 59
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: administrador de contenidos - seguridad

bien por ingresar !

pero ahora bien, podrias darme una manito para aumentar la seguridad de ese administrador,
algun link para estudiarlo
es importante para mi. o al menos comentarme como has hecho

muchas gracias !!
  #4 (permalink)  
Antiguo 20/04/2009, 07:28
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: administrador de contenidos - seguridad

A mi también me interesa saber de que manera lo hiciste rquilca. ¿Por casualidad haz hecho injección SQL en los POST?

Salu2
  #5 (permalink)  
Antiguo 20/04/2009, 07:35
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: administrador de contenidos - seguridad

JAJAJA que facil entre a tu administrador ajajja

Ademas tienes un error

SQL:
Unknown column 'id_imagenes' in 'field list'

Al intentar ordenar las imagenes
  #6 (permalink)  
Antiguo 20/04/2009, 08:36
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
De acuerdo Respuesta: administrador de contenidos - seguridad

priemro nunca uses

usuario: admin
passw: admin

sgundo, habilitar magic_quotes

tercero, te paso un script para que no te hagan sql injection (me lo paso samba666)

aca la funcion

Código PHP:
function secure_quotes($valor) {
    if (
get_magic_quotes_gpc()) {
        
$valor stripslashes($valor);
    }
    if (!
is_numeric($valor)) {
         
$valor "" mysql_real_escape_string($valor) . "";
    } return 
$valor;

uso de la funcion


Código PHP:
$sql "SELECT * FROM admin_users
                        WHERE     user = '" 
secure_quotes($_POST[user]) .  "' AND pass = '" secure_quotes($_POST[pass]) . "'"
salu2
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #7 (permalink)  
Antiguo 20/04/2009, 08:47
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: administrador de contenidos - seguridad

La verdad me sorprende que aún se ponga a prueba un sistema con datos tipicos de acceso (me recuerda el password de 123456), aunque por mi cabeza jamás se me paso probar de esa manera, por el simple hecho de que ya era "historia" xD. En ese caso la inyección SQL no es necesario jaja.

Como dice aldo1982, una vez cambies los datos de acceso.. utiliza funciones como "mysql_real_escape_string()" para evitar futuros ataques.

Saludos
  #8 (permalink)  
Antiguo 20/04/2009, 09:05
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
De acuerdo Respuesta: administrador de contenidos - seguridad

esacto, debes usar

Código PHP:
mysql_real_escape_string() 
aca te dejo para que leas y veas algunos ejemplos de su uso.


mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string -- Escapa caracteres especiales de una cadena para su uso en una sentencia SQL
Descripción
string mysql_real_escape_string ( string cadena_no_escapada [, resource id_enlace] )

Escapa todos los caracteres especiales en la cadena_no_escapada, tomando en cuenta el juego de caracteres actual de la conexión, de tal modo que sea seguro usarla con mysql_query(). Si se van a insertar datos binarios, debe usarse esta función.

mysql_real_escape_string() llama a la función de la biblioteca MySQL mysql_real_escape_string, la cual coloca barras invertidas antes de los siguientes caracteres: \x00, \n, \r, \, ', " y \x1a.

Esta función debe usarse siempre (con algunas excepciones) para garantizar que los datos sean seguros antes de enviar una consulta a MySQL
Lista de parámetros

cadena_no_escapada

La cadena a ser escapada.
link_identifier

The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.

Valores retornados

Devuelve la cadena escapada, o FALSE en caso de que ocurra un error.
Ejemplos

Ejemplo 1. Ejemplo sencillo de mysql_real_escape_string()
Código PHP:
<?php
// Conectarse
$enlace mysql_connect('mysql_host''mysql_usuario''mysql_contrasenya')
    OR die(
mysql_error());

// Consulta
$query sprintf("SELECT * FROM usuarios WHERE usuario='%s' AND
     password='%s'"
,
            
mysql_real_escape_string($usuario),
            
mysql_real_escape_string($password));
?>
Ejemplo 2. Un ejemplo de un ataque de inyección SQL
Código PHP:
<?php
// Consultar la base de datos para verificar si hay una coincidencia de usuario
$consulta "SELECT * FROM usuarios WHERE usuario='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);

// No revisamos $_POST['password'], podria ser cualquier cosa que el usuario
// quiera! Por ejemplo:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Esto quiere decir que la consulta enviada a MySQL seria:
echo $consulta;
?>
La consulta enviada a MySQL:

SELECT * FROM usuarios WHERE usuario='aidan' AND password='' OR ''=''

Esto permitiría que cualquiera iniciara una sesión sin una contraseña válida.

Ejemplo 3. Una consulta "Recomendable"

Mediante el uso de mysql_real_escape_string() sobre cada variable se previene la inyección de SQL. Este ejemplo demuestra el método "recomendable" para ejecutar una consulta en la base de datos, independientemente del valor de las Comillas Mágicas.
Código PHP:
<?php
// Aplicar comillas sobre la variable para hacerla segura
function comillas_inteligentes($valor)
{
    
// Retirar las barras
    
if (get_magic_quotes_gpc()) {
        
$valor stripslashes($valor);
    }

    
// Colocar comillas si no es entero
    
if (!is_numeric($valor)) {
        
$valor "'" mysql_real_escape_string($valor) . "'";
    }
    return 
$valor;
}

// Conexion
$enlace mysql_connect('mysql_host''mysql_usuario''mysql_contrasenya')
    OR die(
mysql_error());

// Realizar una consulta segura
$consulta sprintf("SELECT * FROM usuarios WHERE usuario=%s AND password=%s",
            
comillas_inteligentes($_POST['username']),
            
comillas_inteligentes($_POST['password']));

mysql_query($consulta);
?>
La consulta no se ejecutará correctamente ahora, y los ataques de inyección de SQL no funcionarán.
Notes

Nota: Es necesaria una conexión MySQL antes de usar mysql_real_escape_string() o de lo contrario un error de nivel E_WARNING es generado, y FALSE es devuelto. Si id_enlace no está definido, se usará la última conexión con MySQL.

Nota: Si se habilita magic_quotes_gpc, aplique stripslashes() sobre los datos primero. Usar esta función sobre datos que ya han sido escapados los escapará dos veces.

Nota: Si esta función no es usada para escapar datos, la consulta es vulnerable a Ataques de Inyección de SQL.

Nota: mysql_real_escape_string() no escapa % ni _. Éstos son comodines en MySQL si se combinan con LIKE, GRANT, o REVOKE.
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #9 (permalink)  
Antiguo 20/04/2009, 09:30
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por aldo1982
sgundo, habilitar magic_quotes
Eso es mal, magic_quotes debe permanecer OFF. De hecho, creo que en PHP6 no existirá mas.
  #10 (permalink)  
Antiguo 20/04/2009, 10:54
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por Ronruby Ver Mensaje
Eso es mal, magic_quotes debe permanecer OFF. De hecho, creo que en PHP6 no existirá mas.
xq ?
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #11 (permalink)  
Antiguo 20/04/2009, 11:17
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: administrador de contenidos - seguridad

Cita:
This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.
Al igual que register_globals, depender de esta función es una muy mala práctica.
Principalmente cuando piensas distribuir una aplicación, puede que no todos los servidores la tengan activadas, y alguien aprovechando eso, te puede "colar" un ataque de inyección SQL.
Lo mejor es no depender de esta directiva, y menos aun cuando llegue PHP6.
  #12 (permalink)  
Antiguo 20/04/2009, 14:36
Avatar de santoinocente  
Fecha de Ingreso: agosto-2006
Ubicación: buenos aires. argentina.
Mensajes: 59
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: administrador de contenidos - seguridad

muchas gracias aldo1982 y a los demas que aportaron algo para mejorar el sistame

de ninguna manera era un desafio para nadie intentar ingresar al sistema si no por supuesto
que al menos me hubiese molestado en cambiar las claves de acceso por algunas mas segura

por lo que las risas estuvieron estúpidas ya que si estoy consultandoles es por que no tengo demasiada experiencia en seguridad con php

gracias otra vez
  #13 (permalink)  
Antiguo 20/04/2009, 15:24
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: administrador de contenidos - seguridad

Cita:
por lo que las risas estuvieron estúpidas ya que si estoy consultandoles es por que no tengo demasiada experiencia en seguridad con php
En parte tienes razón, incluso a mi me cayó mal cuando leí el post y me llamó la atención la verdad (como si fuese tan facil explotar un bug), pero debes tener en cuenta que no pasa por no "tener experiencia en php" sino de poner a prueba un sistema de login con datos "comunes", entiendes? sea el lenguaje que sea. Supongo que por eso dio un poco de risa.

Hay que tomarlo simplemente como un descuido. Igual te digo que todo sistema estará "seguro" siempre y cuando sepas controlar los datos enviados, especificar de que manera lo recibes (get o post), de ahi comprobar el tipo de dato (string, númerico, etc..) y recien la consulta SQL teniendo en cuenta los "escapes" para ciertos signos raros (inyección sql).

Suerte.
  #14 (permalink)  
Antiguo 20/04/2009, 22:27
Avatar de polin2bclan  
Fecha de Ingreso: julio-2008
Mensajes: 73
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: administrador de contenidos - seguridad

mda07_cristobarrios.adminDatos
mda07_cristobarrios.agenda
mda07_cristobarrios.novedades

Se pueden ver los errores y puedo ver el nombre de la abse de datos.

NUNCA uses esto:
Código PHP:
$consulta mysql_query() or die(mysql_error()); 
USALO asi
Código PHP:
$consulta mysql_query() or die("Error en la consulta"); 
Usa Addslahes para liberar ataques SQL injection.

Puedes usar la funcione que expone: aldo1982
---------------------------------------------
Otro error es que deber de declarar las variables numericas de las $_GET que sean numericas

Mira este error:
http://www.marianodamianarias.com/?ver='0&anio=2009

Deberas usarlo asi:

Código PHP:
if(is_numeric($_GET['ver']))
{
if(
is_numeric($_GET['anio']))
  {
  
EMPESAMOS EL PROCESO
  
}
  else
        {
        echo 
"El anio no es valido";
        }
}
  else
        {
        echo 
"Ver no es valido";
        } 
  #15 (permalink)  
Antiguo 21/04/2009, 10:27
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

muy bueno lo de polin2bclan a mi hace unos meses me hackearon un sitio que uso todo por modulos con db y variables get numericas... no se como hiciieron, pero me cambiaron el index y me borraron todos los archivos del FTP.

:S
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #16 (permalink)  
Antiguo 22/04/2009, 13:59
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
De acuerdo Respuesta: administrador de contenidos - seguridad

el sitio es este, a ver que me porian decir de como me entraron y borraron archivos.

http://www.dechapaypintura.com.ar


salu2 y gracias
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #17 (permalink)  
Antiguo 22/04/2009, 14:15
f0n
 
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 1
Respuesta: administrador de contenidos - seguridad

aldo.. te asegurastes que no tenias admin admin como user/pass en el ftp verdad?

jeje
  #18 (permalink)  
Antiguo 22/04/2009, 14:20
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por f0n Ver Mensaje
aldo.. te asegurastes que no tenias admin admin como user/pass en el ftp verdad?

jeje
si me fije jeje
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #19 (permalink)  
Antiguo 22/04/2009, 14:22
f0n
 
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 1
Respuesta: administrador de contenidos - seguridad

bueno, a donde quería llegar es a que hay muchisimas formas de entrar a un sistema. Es decir el SQL injection está bien, pero con eso no se domina el mundo jeje

Un saludo
  #20 (permalink)  
Antiguo 22/04/2009, 14:23
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por f0n Ver Mensaje
bueno, a donde quería llegar es a que hay muchisimas formas de entrar a un sistema. Es decir el SQL injection está bien, pero con eso no se domina el mundo jeje

Un saludo
Estoy de acuerdo con lo que decis, por eso pregunte de que forma me la pudieron hackear
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #21 (permalink)  
Antiguo 22/04/2009, 14:26
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: administrador de contenidos - seguridad

¿Que tipo de filtrado haces cuando recibes una variable por GET en tu sistema?
  #22 (permalink)  
Antiguo 22/04/2009, 14:28
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por Ronruby Ver Mensaje
¿Que tipo de filtrado haces cuando recibes una variable por GET en tu sistema?
a que te referis con el filtrado ?
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #23 (permalink)  
Antiguo 22/04/2009, 14:40
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: administrador de contenidos - seguridad

¿Revisas que la variable en realidad sea numerica?
¿Utilizas mysql_real_escape_string?

Probablemente entraron por tu panel de administracion, es bastante obvia la direccion de este:
http://www.dechapaypintura.com.ar/admin/
  #24 (permalink)  
Antiguo 22/04/2009, 14:46
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

Cita:
Iniciado por Ronruby Ver Mensaje
¿Revisas que la variable en realidad sea numerica?
¿Utilizas mysql_real_escape_string?

Probablemente entraron por tu panel de administracion, es bastante obvia la direccion de este:
http://www.dechapaypintura.com.ar/admin/
no use el real scape je. me podrias decir de ke manera habran podido ingresar ?

agradezco tu apoyo :D
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #25 (permalink)  
Antiguo 22/04/2009, 14:46
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

y para que revisar que la variable sea numerica ? en la parte del sitio web me decis vos ?
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #26 (permalink)  
Antiguo 22/04/2009, 14:48
f0n
 
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años
Puntos: 1
Respuesta: administrador de contenidos - seguridad

aldo, desde el panel de administracion tienes la opción de modificar los archivos del ftp (webFTP)?, porque si no es así... puedes empezar a considerar una actualización de tu servidor ftp, poner una contraseña más segura en éste, comprobar que está deshabilitada la opción usuario anónimo etc.
Un saludo

Y lo que te comenta el amigo Ron Ruby posiblemente es que, cuando vas a recoger la variable GET, que compruebes que es de tipo numérico por ejemplo utilizando is_numeric($variable) o haciendo un casting a int o si es de tipo numérico a double haciendo
settype($variable,"double"); por ejemplo
  #27 (permalink)  
Antiguo 22/04/2009, 14:50
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: administrador de contenidos - seguridad

Cita:
y para que revisar que la variable sea numerica ? en la parte del sitio web me decis vos ?
Por ejemplo, echale un vistazo a esto:
trabajos.php?menu=39

Si no revisas que la variable menú sea numérica y tampoco uses mysql_real_escape_string, te puede colar un ataque de inyeccion SQL.
  #28 (permalink)  
Antiguo 22/04/2009, 14:54
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 4 meses
Puntos: 6
Respuesta: administrador de contenidos - seguridad

bien ahi comprendi.

http://www.dechapaypintura.com.ar/tr...ect%20*%20from


algo asi me decis vos ? para que tire error y de el nombre de las tablas mediante mysql_error() ??
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:09.