Duda, seguridad XSS

Iniciado por CoolTesting, 9 Junio 2014, 14:05 PM

0 Miembros y 1 Visitante están viendo este tema.

CoolTesting

Buenas compañeros, esto es simplemente una duda que me surgió mientras hacia unas cuantas pruebas ¿Qué creen de esta seguridadi Anti-XSS?

Efectivamente, el XSS lo hacen inyectando etiquetas html, o hasta javascript.
Pero se sabe que para abrir una etiqueta se utiliza "<" y para cerrarla "/>
Bueno enfin, este es el código html el cual envía lo que escribe el usuario:
Código (html4strict) [Seleccionar]

<HTML>
<HEAD>
<TITLE>Index duda</TITLE>
</HEAD>

<BODY>

<A HREF="xss.php?var=hola">Saludar</A>
<BR><BR>
<A HREF="xss.php?var=adios">Despedirse</A>

</BODY>
</HTML>


y Este es mi código "Protector.":
Código (php) [Seleccionar]


<?php
 
//Protección XSS cooltesting
$bug $_GET["var"];
 if ((
strpos($bug,'<')!== false) or strpos($bug,'>') !==false)
 {
 
Header("HTTP/1.1 404 Not found");
 
echo 
'   
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
Lo que busca no existe, o dejó de existir.
</body>
</html>
'
;
 }else{
 
 echo
'Has escrito: '.$bug;
 
 }
?>





Solamente quiero saber si esta es una buena protección, gracias de ante mano. Es que pienso montar un servidor y no me gustaría para nada que me hagan un Deface
El ganador es el que sabe perder.

engel lex

si puede servir, aunque puedes usar htmlentities que lo que hará es convertir a todas las "entidades" html (como < es "&lt;", > es "&gt;" y letras acentuadas) en su respectivo html, así las etiquetas quedan destruidas y son meramente visuales
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

WHK

no, no sirve, para eso existe htmlepcialchars que ya viene integrado con php por defecto:

http://cl1.php.net/htmlspecialchars

CoolTesting

Cita de: WHK en  9 Junio 2014, 16:54 PM
no, no sirve, para eso existe htmlepcialchars que ya viene integrado con php por defecto:

http://cl1.php.net/htmlspecialchars


¿Por qué no serviría, si se verifica si contiene "<" o ">" y si lo tiene simplemente no lo muestra, me dirías por qué no?

Gracias
El ganador es el que sabe perder.

CoolTesting

Cita de: WHK en  9 Junio 2014, 16:54 PM
no, no sirve, para eso existe htmlepcialchars que ya viene integrado con php por defecto:

http://cl1.php.net/htmlspecialchars

OK,OK,OK ya entendí o creo que entendí sin necesidad de que respondas, solo dime si estoy en lo correcto:

El problema es que el código "inyectado" no lo muestra, pero sí trabaja con él, osea el usuario ve el mensaje: "Lo que busca no existe, o dejó de existir", pero el código si se ha ejecutado, solo que no lo devuelve al cliente.

Será por eso que no sirve mucho el código?
El ganador es el que sabe perder.

WHK

El tema es el siguiente:

Cuando haces una pagina web y necesitas desplegar un dato como por ejemplo el nombre de una persona necesitas utilizar la codificación adecuada (en este caso esa codificación se llama entidad html), por ejemplo, si estamos programando en html vamos a tener un código como este:

<div><p>Pedro</p></div>

Ahora, por norma de HTML dice que cuando colocas carácteres especiales estos deben ser codificados siempre en entidad html, por ejemplo:

<div><p>Pedro&#039;s</p></div>

Esto nos mostrará:
Pedro's

Ahora, esto no es que yo lo diga o que se le ocurrió a alguien, esto es norma y es parte del estandard del código HTML y esto es para prevenir justamente problemas cuando necesitas escribir código html sobre un html, por ejemplo:

<div>&lt;div&gt;</div>

Esto escribe:
<div>

Pero no lo ejecuta. Ahora cuando desde php dejas que las personas pongan lo que se les da la gana puedes provocar que se rompa la codificación completa del documento html y puede que en algunos navegadores no te aparezcan las letras de forma correcta o puedes provocar un agujero de seguridad de tipo XSS.

En este punto cuando dejas que la gente escriba lo que sea vas a tener problemas con los caracteres unicode, etiquetas, comillas, ampersand y cualquier carácter interpretable por el navegador.

Ahora, porque no es buena idea hacer tu propio filtro como lo acabas de hacer?, porque no eres un experto en seguridad informática ni sabes de memoria todos los posibles vectores de ataques (los cuales son muchisimos y no solo escribir etiquetas < y >).

Por ejemplo, digamos que mañana necesitas escribir un valor dentro de un parámetro de una etiqueta html:

Código (php) [Seleccionar]
<a href="test.php?texto=<?php echo $_GET['texto']; ?>">link</a>

Dentro del parámetro por url "texto" puedo inyectar un XSS:

test.php?texto=" onclick="alert(document.cookie)

Entonces tu HTML quedará así:

Código (php) [Seleccionar]
<a href="test.php?texto=" onclick="alert(document.cookie)">link</a>

Y te fijas que acá no usamos < ni >?, ese es otro vector como muchos otros, ahora tendrias que hacer otro filtro distinto para prevenir las comillas, despues tendras problemas con las comillas simples, despues con los backspaces, despues con los caracteres unicode, despues con los saltos de linea, despues con los ampersand, etc etc.

Entonces para que no te vueles la cabeza haciendo una chorronada de filtros o un filtro muy grande usas la función HTMLSPECIALCHARS el cual ya está diseñada para filtrar todos los posibles carácteres bajo el contexto necesario.

Te recomiendo que nunca dejes la seguridad de una aplicación en tus manos, siempre dejalo en manos del mismo creador del lenguaje de programación o framework que estás utilizando ya que hay gente mas especializada que ya se hizo todas estas preguntas antes y tienen las herramientas suficientes como para crear un ambiente seguro.

Saludos.

CoolTesting

Cita de: WHK en  9 Junio 2014, 22:44 PM
El tema es el siguiente:

Cuando haces una pagina web y necesitas desplegar un dato como por ejemplo el nombre de una persona necesitas utilizar la codificación adecuada (en este caso esa codificación se llama entidad html), por ejemplo, si estamos programando en html vamos a tener un código como este:

<div><p>Pedro</p></div>

Ahora, por norma de HTML dice que cuando colocas carácteres especiales estos deben ser codificados siempre en entidad html, por ejemplo:

<div><p>Pedro&#039;s</p></div>

Esto nos mostrará:
Pedro's

Ahora, esto no es que yo lo diga o que se le ocurrió a alguien, esto es norma y es parte del estandard del código HTML y esto es para prevenir justamente problemas cuando necesitas escribir código html sobre un html, por ejemplo:

<div>&lt;div&gt;</div>

Esto escribe:
<div>

Pero no lo ejecuta. Ahora cuando desde php dejas que las personas pongan lo que se les da la gana puedes provocar que se rompa la codificación completa del documento html y puede que en algunos navegadores no te aparezcan las letras de forma correcta o puedes provocar un agujero de seguridad de tipo XSS.

En este punto cuando dejas que la gente escriba lo que sea vas a tener problemas con los caracteres unicode, etiquetas, comillas, ampersand y cualquier carácter interpretable por el navegador.

Ahora, porque no es buena idea hacer tu propio filtro como lo acabas de hacer?, porque no eres un experto en seguridad informática ni sabes de memoria todos los posibles vectores de ataques (los cuales son muchisimos y no solo escribir etiquetas < y >).

Por ejemplo, digamos que mañana necesitas escribir un valor dentro de un parámetro de una etiqueta html:

Código (php) [Seleccionar]
<a href="test.php?texto=<?php echo $_GET['texto']; ?>">link</a>

Dentro del parámetro por url "texto" puedo inyectar un XSS:

test.php?texto=" onclick="alert(document.cookie)

Entonces tu HTML quedará así:

Código (php) [Seleccionar]
<a href="test.php?texto=" onclick="alert(document.cookie)">link</a>

Y te fijas que acá no usamos < ni >?, ese es otro vector como muchos otros, ahora tendrias que hacer otro filtro distinto para prevenir las comillas, despues tendras problemas con las comillas simples, despues con los backspaces, despues con los caracteres unicode, despues con los saltos de linea, despues con los ampersand, etc etc.

Entonces para que no te vueles la cabeza haciendo una chorronada de filtros o un filtro muy grande usas la función HTMLSPECIALCHARS el cual ya está diseñada para filtrar todos los posibles carácteres bajo el contexto necesario.

Te recomiendo que nunca dejes la seguridad de una aplicación en tus manos, siempre dejalo en manos del mismo creador del lenguaje de programación o framework que estás utilizando ya que hay gente mas especializada que ya se hizo todas estas preguntas antes y tienen las herramientas suficientes como para crear un ambiente seguro.

Saludos.
Excelente, muchisimas gracias WHK lo explicaste bastante bien.
El ganador es el que sabe perder.