Autor Tema: [Ayuda] XSS en BBCode  (Leído 1069 veces)

Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
[Ayuda] XSS en BBCode
« en: 24 de Diciembre de 2011, 19:04:19 pm »
Hola!!

Verán, ando haciendo un BBCode, pero descubrí un XSS en un sitio (quien lo quiera por MP, para no hacer spam) en el que había cientos de XSS... entré a ver si alguno afectaba a mi sistema y sí, hay uno que me es imposible solucionar.

Tengo esto para los links (que es donde hay XSS) :
Código: [Seleccionar]
/\[url=(.+)\](.+)\[\/url]/Usi

Si se fijan, con poner:
Código: [Seleccionar]
[url]java script:alert(/xss/);[/url]
(El espacio es un tab, no un espacio normal)

Como bien saben, en HTML los espacios, para que se vean se han de convertir a  , y aprovechando eso, funciona el XSS.

Me gustaría encontrar algún modo de solucionar el problema con las expresiones regulares y sin usar urlencode() o parecidos, ya que necesito hacerlo con expresiones regulares sí o sí.

Saludos.

Comunidad PHPeros

[Ayuda] XSS en BBCode
« en: 24 de Diciembre de 2011, 19:04:19 pm »

Desconectado -Pituko-

  • PHPero Experto
  • *****
  • Mensajes: 954
  • Karma: 20
  • Sexo: Masculino
  • ¡Hala Madrid!
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #1 en: 24 de Diciembre de 2011, 20:00:42 pm »
Hola!!

Verán, ando haciendo un BBCode, pero descubrí un XSS en un sitio (quien lo quiera por MP, para no hacer spam) en el que había cientos de XSS... entré a ver si alguno afectaba a mi sistema y sí, hay uno que me es imposible solucionar.

Tengo esto para los links (que es donde hay XSS) :
Código: [Seleccionar]
/\[url=(.+)\](.+)\[\/url]/Usi

Si se fijan, con poner:
Código: [Seleccionar]
[url]java script:alert(/xss/);[/url]
(El espacio es un tab, no un espacio normal)

Como bien saben, en HTML los espacios, para que se vean se han de convertir a  , y aprovechando eso, funciona el XSS.

Me gustaría encontrar algún modo de solucionar el problema con las expresiones regulares y sin usar urlencode() o parecidos, ya que necesito hacerlo con expresiones regulares sí o sí.

Saludos.
Puedes extraer todos los * y después comprobarlos en una función para que al final se haga el preg_replace de cada URL ¿me entiendes?
« Última modificación: 24 de Diciembre de 2011, 20:02:43 pm por -Pituko- »

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[Ayuda] XSS en BBCode
« Respuesta #2 en: 25 de Diciembre de 2011, 01:55:30 am »
Hay una parte que no entiendo... ¿Cómo se ejecuta el XSS si solo es un texto que apunta a javascript:alert('XXX');?

Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #3 en: 25 de Diciembre de 2011, 02:54:54 am »
Hay una parte que no entiendo... ¿Cómo se ejecuta el XSS si solo es un texto que apunta a javascript:alert('XXX');?
Al clickear, pero claro, hay gente que no entiende nada, y clickea. Por ejemplo: "click aqui y gana dinero facilmente",  muchos novatos pican.
Puedes extraer todos los * y después comprobarlos en una función para que al final se haga el preg_replace de cada URL ¿me entiendes?
Bueno, yo decía hacerlo con expresiones regulares y no funciones de PHP, ya que consumirían bastante RAM y ahora estoy optimizando...

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[Ayuda] XSS en BBCode
« Respuesta #4 en: 25 de Diciembre de 2011, 09:41:56 am »
Al clickear, pero claro, hay gente que no entiende nada, y clickea. Por ejemplo: "click aqui y gana dinero facilmente",  muchos novatos pican.Bueno, yo decía hacerlo con expresiones regulares y no funciones de PHP, ya que consumirían bastante RAM y ahora estoy optimizando...
Perdona, pero eso ya no es XSS. Porque no están inyectando código que afecte el funcionamiento frontend de la página. Estás siendo muy extremista. Bueno, entrando en tema: si haces que todos los vínculos que se usen con ese bbcode se abran en una nueva página, no debe pasar nada. Por cierto, lo que la mayoría de los que usan BBCode hacen, es agregar el http:// antes de mostrar los enlaces (si no lo tienen).

Además, me parece un poco exagerado lo de "consumiría bastante RAM". Ese tipo de "optimizaciones" me dan a entender que lo tuyo no son los CMS ni los frameworks.
« Última modificación: 25 de Diciembre de 2011, 09:45:09 am por Physlet »

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #5 en: 25 de Diciembre de 2011, 13:17:45 pm »
Perdona, pero eso ya no es XSS. Porque no están inyectando código que afecte el funcionamiento frontend de la página. Estás siendo muy extremista. Bueno, entrando en tema: si haces que todos los vínculos que se usen con ese bbcode se abran en una nueva página, no debe pasar nada. Por cierto, lo que la mayoría de los que usan BBCode hacen, es agregar el http:// antes de mostrar los enlaces (si no lo tienen).

Además, me parece un poco exagerado lo de "consumiría bastante RAM". Ese tipo de "optimizaciones" me dan a entender que lo tuyo no son los CMS ni los frameworks.

En realidad hay una vulnerabilidad XSS siempre que puedes inyectar códigos en el navegador de otra persona, así que si habría un ataque XSS.
Eso de "click aquí" tampoco es una cosa del otro mundo. La mayoría de los usuarios si no tienen ni idea de informatica van a pinchar y ya está.
Lo que se puede hacer con algo así es innumerable.

La solución, borrar whitespaces antes de hacer la expresión regular y listo.
Ya sea con otra expresión regular o alguna función de PHP.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #6 en: 25 de Diciembre de 2011, 14:10:10 pm »
Podrías usar en vez de (.+) algo como ([^(javascript:)]+) o eliminar los links que empiecen por javascript: con algo como $texto = preg_replace('#\[url\]javascript:.+\[/url\]#i', 'XSS', $texto);

Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #7 en: 25 de Diciembre de 2011, 17:07:35 pm »
Perdona, pero eso ya no es XSS. Porque no están inyectando código que afecte el funcionamiento frontend de la página. Estás siendo muy extremista. Bueno, entrando en tema: si haces que todos los vínculos que se usen con ese bbcode se abran en una nueva página, no debe pasar nada. Por cierto, lo que la mayoría de los que usan BBCode hacen, es agregar el http:// antes de mostrar los enlaces (si no lo tienen).

Además, me parece un poco exagerado lo de "consumiría bastante RAM". Ese tipo de "optimizaciones" me dan a entender que lo tuyo no son los CMS ni los frameworks.
Si, ni los CMS ni los frameworks son lo mio.
En realidad hay una vulnerabilidad XSS siempre que puedes inyectar códigos en el navegador de otra persona, así que si habría un ataque XSS.
Eso de "click aquí" tampoco es una cosa del otro mundo. La mayoría de los usuarios si no tienen ni idea de informatica van a pinchar y ya está.
Lo que se puede hacer con algo así es innumerable.

La solución, borrar whitespaces antes de hacer la expresión regular y listo.
Ya sea con otra expresión regular o alguna función de PHP.

Saludos
Pero borrando los whitespaces "borro" lo que el usuario puso... si tu por ejemplo entras a Facebook, pongas lo que pongas, queda ahí, como lo pusiste. No quiero ser como otras webs que dicen "no pueden usar X caracter por seguridad".
Por eso me complico tanto la vida, porque quiero que quede bien, y que no sea otro script más de los que no admiten ciertos caracteres.

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #8 en: 25 de Diciembre de 2011, 18:03:08 pm »
Si, ni los CMS ni los frameworks son lo mio.Pero borrando los whitespaces "borro" lo que el usuario puso... si tu por ejemplo entras a Facebook, pongas lo que pongas, queda ahí, como lo pusiste. No quiero ser como otras webs que dicen "no pueden usar X caracter por seguridad".
Por eso me complico tanto la vida, porque quiero que quede bien, y que no sea otro script más de los que no admiten ciertos caracteres.

La vida es así.
No todo puede ingresarse en todos sitios.
Como en este caso: no tiene sentido usar un tabulador en un link, porque los links no llevan tabulaciones, y lo que se hace es complicar la vida.
Si los links no usan tabulaciones, entonces no los permitas, de eso mismo se trata.

El problema es que se quieren dar demasiadas libertados y posibilidades al usuario, y eso no debería pasar.
Si tu estás pidiendo un link, el contenido del campo DEBE ser un link. Si no lo es, pasan cosas como estas. Y si un usuario quiere introducir un tabulador en un link, entonces o quiere ver las vulnerabilidades del sitio, o no sabe nada en absoluto de lo que está haciendo.

Otra cosa es un campo de texto, si quieres mostrar tabulaciones en campos de texto puedes hacerlo, no hay nada de malo.
Pero filtra según lo que permitas. Puedes hacer un str_replace de \t por   o algo por el estilo, pero no me gusta demasiado la idea.

La idea es que tú delimites lo que el usuario pueda hacer. No tener barreras está bien, pero siempre que puedas mantenerlo, y a veces intentar ser tan... "libre" puede salirte caro.
Busca siempre un por qué, no simplemente "por qué el usuario podría querer".
Me explico, en un sitio como PHPeros o donde se comparte código, va a ser necesario que tratemos las tabulaciones, pero si alguien va a escribir en un muro de Tuenti (por ejemplo) no tiene sentido usar tabulaciones. No están pensados para eso.

Aún asi, ya te digo, si quieres hacerlo puedes probar a sustituir \t por  

Por cierto, ni siquiera PHPeros (SMF 2.0.1) permite los tabuladores en los mensajes. Si hacéis la prueba copiando y pegando desde el bloc de notas, por ejemplo, vais a ver que lo que hace es sustituir la tabulación por un montón de espacios en blanco, pero no es una tabulación en sí.

Un saludo
« Última modificación: 25 de Diciembre de 2011, 18:05:42 pm por CarlosRdrz »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #9 en: 25 de Diciembre de 2011, 19:40:44 pm »
La vida es así.
No todo puede ingresarse en todos sitios.
Como en este caso: no tiene sentido usar un tabulador en un link, porque los links no llevan tabulaciones, y lo que se hace es complicar la vida.
Si los links no usan tabulaciones, entonces no los permitas, de eso mismo se trata.

El problema es que se quieren dar demasiadas libertados y posibilidades al usuario, y eso no debería pasar.
Si tu estás pidiendo un link, el contenido del campo DEBE ser un link. Si no lo es, pasan cosas como estas. Y si un usuario quiere introducir un tabulador en un link, entonces o quiere ver las vulnerabilidades del sitio, o no sabe nada en absoluto de lo que está haciendo.

Otra cosa es un campo de texto, si quieres mostrar tabulaciones en campos de texto puedes hacerlo, no hay nada de malo.
Pero filtra según lo que permitas. Puedes hacer un str_replace de \t por   o algo por el estilo, pero no me gusta demasiado la idea.

La idea es que tú delimites lo que el usuario pueda hacer. No tener barreras está bien, pero siempre que puedas mantenerlo, y a veces intentar ser tan... "libre" puede salirte caro.
Busca siempre un por qué, no simplemente "por qué el usuario podría querer".
Me explico, en un sitio como PHPeros o donde se comparte código, va a ser necesario que tratemos las tabulaciones, pero si alguien va a escribir en un muro de Tuenti (por ejemplo) no tiene sentido usar tabulaciones. No están pensados para eso.

Aún asi, ya te digo, si quieres hacerlo puedes probar a sustituir \t por  

Por cierto, ni siquiera PHPeros (SMF 2.0.1) permite los tabuladores en los mensajes. Si hacéis la prueba copiando y pegando desde el bloc de notas, por ejemplo, vais a ver que lo que hace es sustituir la tabulación por un montón de espacios en blanco, pero no es una tabulación en sí.

Un saludo
1.- Si es necesario... no voy a usar eso como los muros de tuenti, que para algo hago BBCode.
2.- PHPeros SÍ deja poner tabulaciones:
Código: [Seleccionar]

Prueba a seleccionar eso y verás.
3.- Yo quiero hacerlo posible porque en cualquier lado como por ejemplo Facebook, Twitter o cualquier sitio web popular. Ninguno te va a decir que no soporta ciertos caracteres, ya que todos admiten lo que pongas.

Es lo mismo que decir: "no soportamos caracteres raros, ni acentos ni nada". Eso no se puede decir, y hay que encontrar el modo de solucionar el problema, ya sea usando htmlentities() o especificando un charset apropiado.

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:[Ayuda] XSS en BBCode
« Respuesta #10 en: 01 de Enero de 2012, 21:08:04 pm »
1.- Si es necesario... no voy a usar eso como los muros de tuenti, que para algo hago BBCode.
2.- PHPeros SÍ deja poner tabulaciones:
Código: [Seleccionar]

Prueba a seleccionar eso y verás.
3.- Yo quiero hacerlo posible porque en cualquier lado como por ejemplo Facebook, Twitter o cualquier sitio web popular. Ninguno te va a decir que no soporta ciertos caracteres, ya que todos admiten lo que pongas.

Es lo mismo que decir: "no soportamos caracteres raros, ni acentos ni nada". Eso no se puede decir, y hay que encontrar el modo de solucionar el problema, ya sea usando htmlentities() o especificando un charset apropiado.

Hola,

1.- Ok entonces puedes probar a hacer lo que te dije del str_replace.
2.- Tiene sentido que lo digas, porque es justo lo que te comentaba. SMF en los mensajes normales no deja añadir tabulaciones porque no tienen sentido (sustituyen por espacios) sin embargo dentro de la etiqueta code si lo permite porque en el código si que tiene sentido. Es lo que intento decirte.
3.- Casi en ningún sitio soportan TODOS los caracteres. Simplemente hacen la "transformación" de forma transparente para el usuario, que no es lo mismo.

Un saludo
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es