evitar XSS en eval()

Iniciado por nØFi#, 12 Noviembre 2009, 10:00 AM

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

nØFi#

Buenas!

Estoy haciendo un script con un eval que ejecuta una serie de cosas que se le pasan por variable. Me he puesto a trastear un poco y evidentemente sin filtros ni nada es vulnerable a XSS. Estoy pensando una forma buena para evitar cualquier XSS pero no termino de encontrar algo optimo. En php era facil, usaba un htmlentities y ya me codificaba todos los caracteres a html, pero en javascript nose como puedo hacer el filtro.

Alguna idea de como filtrar?
#

braulio--


Azielito

No se pode con str_replace? y quitar los "<>" y demas? claro, tratando de evitar un bypass



Darioxhcx


Azielito

mira esta pagina :xD

http://phpjs.org/functions/htmlentities:425

y mira el index de la pagina, esta bn bueno :D


WHK

Un htmlentities no eviatrá un xss ya que puedes insertar saltos de linea o carácteres nulos. Si por ejemplo tu código está encerrado en un try{} basta con hacer un salto de linea y escribir un }catch(x){alert(document.cookie) ya que el try evitará que se termine la ejecución del script por un error de sintaxis dejando la posibilidad de ejecutar código arbitrario.

Yo te recomendaría que utilizes una función similar a lo que hace escape real string de php pero para js, le haces stripslashses, luego addslashses, eliminas \n \r \01 \00, etc y al final lo pasas por trim o utiliza expresiones regulares con match.

Ahora, si vas a pasar variables que si contienen saltos de linea puedes pasarlos a urlencode y despues lo procesas en urldecode teniendo en cuenta de que si lo vas a imprimir en la página debes tener cuidado de no imprimir todo directamente o si no también tendrás problemas de xss.

sirdarckcat

Cita de: braulio23 en 12 Noviembre 2009, 13:56 PM
Puedes poner el código?
sin codigo no se puede ayudar.. depende que hay dentro del eval.

nØFi#

#7
El eval() lo uso para ejecutar un objeto json.. algo asi:

Código (‭‬‭‬javascript) [Seleccionar]

<script>

var var2 = "'};alert('XSS');//";

var json = "variables = {'var1':'aaaa','var2':'"+var2+"'}";

eval(json);

</script>


En este caso, una manera de evitar el XSS seria escapar comillas.. pero con el \00 o algun otro metodo se puede bypassear?

Pensando un poco, creo que seria mejor poner una expresion regular que solo aceptase caracteres [a-zA-Z] y seria mas seguro. Como lo veis?


PD: Muy buena la pagina de phpjs :D


EDIT:

algo asi tenia pensado:
Código (javascript) [Seleccionar]

<script>

var var2 = "'}alert('XSS')//";

var json = "variables = {'var1':'aaaa','var2':'"+var2+"'}";

if(var2.match(/^[a-zA-Z0-9]*$/)) eval(json);
else console.log('eivaa');

</script>


no creo que haya ningun bypass no?  :xD
#

sirdarckcat

 
Citarif(var2.match(/^[a-zA-Z0-9]*$/)) eval(json)
si.. eso esta bien para lo que quieres hacer.

y no te recomiendo uses eval si vas a parsear JSON.. te recomendaria usar este:
http://www.json.org/json2.js

porque su sintaxis y todo se esta portando a los navegadores (firefox/internet explorer/chrome/etc..)

nØFi#

Perfecto :D

Lo de parsear con el objeto JSON ya lo estuve pensando, pero con navegadores 'viejos' (IE6 por ejemplo) no va a funcionar no?

Es que la gente no se actualiza,usa mucho el ie6.. incluso ie5 XDD
#