Foro de elhacker.net

Seguridad Informática => Hacking => Mensaje iniciado por: 19.5 en 30 Julio 2007, 02:01 am



Título: Código PHP AntiXSS
Publicado por: 19.5 en 30 Julio 2007, 02:01 am
Buenas...
Yo creía que los ataques XSS eran bastante simples y sin mayor provecho que sacar, pero leyendo me di cuenta que estaba muy equivocado.
A partir del siguiente hilo: http://foro.elhacker.net/index.php/topic,164268.0.html me surgio una idea. Esa función es efectiva pero que pasa si a alguien se le ocurren cifrar los carácteres? Por ejemplo "<" ponerlo como %3c ya no funcionaría.
Por eso pense en una función que pudiese evitar la mayor cantidad de posibles ataques XSS, es decir, los mismo carácteres pero cifrados.

Una aclaración: El código siguiente es libre de ser mejorado. Además, se hizo pensando en que cualquiera lo pudiese entender, siendo muy básico para que a uds. se les ocurran ideas. Claramente usando funciones de PHP5 quedaría reducido...

Código:
$chr = "<>,;:'.\"\\&%()#¼¾¢";
$xss = "scripting";

for ($i=0; $i<strlen($xss); $i++)
{
for ($h=0; $h<strlen($chr); $h++)
{
if (substr($xss, $i, 1) == substr($chr, $h, 1))
{
echo "Posible XSS";
exit;
}
}
}

Uso: Cambiar la variable $xss por algo como "prob<ando" y verán el mensaje.

Sería útil a la hora de evaluar un query en un buscador por ejemplo, pero si se quiere analisar un campo referido a noticias lógicamente tendría sus inconveniencias.

A ver quien es capáz de vulnerarlo... :rolleyes:

PD1: Me gustaría leer la crítica sobre el codigo de Sirdarckcat
PD2: No puse el código en las etiquetas "php" porque me transformaba algunos carácteres de la variable $chr.

Ref.:
- http://foro.elhacker.net/index.php/topic,98324.0.html
- http://ha.ckers.org/xss.html


Título: Re: Código PHP AntiXSS
Publicado por: Crack_X en 30 Julio 2007, 02:09 am
Lo que estas haciendo es verificando si uno de los caracteres en $chr esta en el string? Porque no mejor comparar con una expresion regular que no accepte esos ? Correr dos loops no es muy bonito y en especial si el mensaje son varios parrafos.


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 30 Julio 2007, 02:45 am
si, ademas es un poco lento..
Una buena opción para DETECTAR ataques de XSS, sería php-ids (php-ids.org)..
Una para permitir HTML, sin tener peligro de XSS, pueden usar html-purifier (htmlpurifier.org)..

Aun asi, para algo rapido, puedes hacer una expresion regular como bien dice crack_x
:D
Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 30 Julio 2007, 03:39 am
Mira que os complicáis la vida creando funciones que lo único que hacen es que el proceso de carga sea más lento, o por lo menos esa es mi opinión personal...

¿Alguien me puede decir por qué no se utiliza en estos casos la función htmlentities()?

Citar
htmlentities($_GET['var'], ENT_QUOTES)

Si lo que quieren es evitar RFI, no dejen en manos de una variable el fichero a incluir, utilicen switch para inclusiones dinámicas...

Y quizás lo más importante, no cojan malos hábitos de programación escribiendo los atributos de los campos sin comillas dobles/simples.



Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 30 Julio 2007, 04:13 am
htmlentities es LA funcion de XSS jaja, pero no siempre es muy buena, porque rompe cosas que aveces no deben romperse.. (por ejemplo si vas a hacer algo mas con ese input, debes descodificarlo antes de usarse).. por eso, la mejor opción orientada a casos particulares, es hacer tu propia expresión regular, siembargo, si no tienes idea de como parchear, y solo quieres estar seguro que no te van a atacar con XSS, usa htmlentities, el doctor lo recomienda xD


Título: Re: Código PHP AntiXSS
Publicado por: born2kill en 30 Julio 2007, 06:23 am
jajja, esta muy bien el codigo....no te parece mejor un .htaccess  :xD .... Lo que se te va a hacer un mundo cargando la web  :xD

Si alguien logra vulneral esto  :D

.htaccess

Código:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (\"|%22).*(\>|%3E|<|%3C).* [NC]
RewriteRule ^(.*)$ index.php [NC]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC]
RewriteRule ^(.*)$ index.php [NC]
RewriteCond %{QUERY_STRING} (javascript:).*(\;).* [NC]
RewriteRule ^(.*)$ index.php [NC]
RewriteCond %{QUERY_STRING}
RewriteRule ^(.*)$ index.php [NC]
RewriteRule (,|;|<|>|'|`) /index.php [NC]



Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 30 Julio 2007, 10:46 am
En fin, una vez más intentáis poner soluciones a vuestros errores, ¿habéis probado a no cometerlos? Yo personalmente tan solo muestro la variable filtrada cuando tengo que imprimirla en la página web, anteriormente uso expresiones regulares para comprobar que la cadena usa caracteres permitidos...

born2kill, cambia tu forma de pensar a no tengo que cometer esos fallos...


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 30 Julio 2007, 23:02 pm
born2kill:
Código:
(\"|%22).*(\>|%3E|<|%3C).*
supongo que es para prevenir attribute splitting, como en:
Código
  1. <?php
  2. echo "<a href=\"{$_GET['entrada']}\">Link</a>";
  3. ?>
  4.  
se puede saltar simplemente no cerrando el atributo
?a=" onmouseover="alert(/xss/.source)"

Código:
(\<|%3C).*script.*(\>|%3E) 
se salta, igual no cerrando <script.. asi:
Código:
<script src=//sirdarckcat.net/cache_poisoning.js x

Código:
(javascript:).*(\;).*
no pones el ; al final..
Código
  1. javascript:alert("pwned")

Código:
(,|;|<|>|'|`)
la coma la puedes no usar llamando funciones desde funcion.apply, los ; puedes no usarlos, los "<" y ">" si los quitas, entonces para que son las primeras 2 reglas? XD, y las comillas, para ataques de XSS no son necesarias, puedes usar /texto/.source

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: wizache en 31 Julio 2007, 02:13 am
justamenteme acabo de topar con ese problema en mi pagina y utilice esta funcion, por lo pronto me parece funcional y ademas solo evita el javascript y no el html como por ejmplo la funcion htmlentities, seria cosa de ver si alguien la rompe:

http://quickwired.com/smallprojects/php_xss_filter_function.php (http://quickwired.com/smallprojects/php_xss_filter_function.php)

Saludos


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 31 Julio 2007, 03:17 am
justamenteme acabo de topar con ese problema en mi pagina y utilice esta funcion, por lo pronto me parece funcional y ademas solo evita el javascript y no el html como por ejmplo la funcion htmlentities, seria cosa de ver si alguien la rompe:

http://quickwired.com/smallprojects/php_xss_filter_function.php (http://quickwired.com/smallprojects/php_xss_filter_function.php)

Saludos

Pronto iva a publicar (desde el e-book Cross Site Scripting Attacks XSS Exploits and Defense 2007) esa función para que también la comentaran porque justamente ocupa expresiones regulares y ademas trata de tapar la mayoría de los hoyos. Aunque yo creo que sí es posible vulnerarla.

Tómense un poco de tiempo y analisen la siguiente lista.
Código:
Formas de codificar el caracter "<": 

<
%3C
&lt
&lt;
&LT
&LT;
&#60
&#060
&#0060
&#00060
&#000060
&#0000060
&#60;
&#060;
&#0060;
&#00060;
&#000060;
&#0000060;
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C


Título: Re: Código PHP AntiXSS
Publicado por: born2kill en 31 Julio 2007, 03:37 am
born2kill, cambia tu forma de pensar a no tengo que cometer esos fallos...

Haber, estamos analizando, como parar ataques XSS, o prevenirnos de ellos, esta claro que no se deben cometer esos fallos, pero estar prevenidos no viene mal.

Mi forma de pensar?...  :xD

born2kill:
Código:
(\"|%22).*(\>|%3E|<|%3C).*
supongo que es para prevenir attribute splitting, como en:
Código
  1. <?php
  2. echo "<a href=\"{$_GET['entrada']}\">Link</a>";
  3. ?>
  4.  
se puede saltar simplemente no cerrando el atributo
?a=" onmouseover="alert(/xss/.source)"

Código:
(\<|%3C).*script.*(\>|%3E) 
se salta, igual no cerrando <script.. asi:
Código:
<script src=//sirdarckcat.net/cache_poisoning.js x

Código:
(javascript:).*(\;).*
no pones el ; al final..
Código
  1. javascript:alert("pwned")

Código:
(,|;|<|>|'|`)
la coma la puedes no usar llamando funciones desde funcion.apply, los ; puedes no usarlos, los "<" y ">" si los quitas, entonces para que son las primeras 2 reglas? XD, y las comillas, para ataques de XSS no son necesarias, puedes usar /texto/.source
Saludos!!

Mhh.... Me dejaste pensando, bueno evidentemente solamente podriamos para ataques básico, tengo que encontrar alguna forma de mejorarlo.



La lista que publicaste esta bien interesante.


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 31 Julio 2007, 03:39 am
19.5: si sabes en que contextos se pueden usar los valores "codificados" de <?
solo cuando de lado del servidor se decodifica el caracter, esos "alias" son validos.. en un vector "normal", no se pueden usar.

El filtro de quickwired esta bastante bien, detiene muchos vectores.. habria que analizarlo con tiempo, para ver si se le escapo algo :P

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: <?BRoWLi?> en 31 Julio 2007, 03:57 am
cifrando los tags <> => &lt;&gt;, se solventa el problema  :rolleyes:


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 31 Julio 2007, 04:53 am
no siempre xD, los attribute breaking, no usan los tags < y > :P

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: <?BRoWLi?> en 31 Julio 2007, 05:15 am
Por el nombre será romper un atributo para meter otro, por ejemplo " onclick="javascript..., si es así bueno yo contaba con que ya se escapan las comillas simples y dobles, yo tengo el gpc ON y lo doy por echo siempre xD, si ese termino no tiene nada que ver con eso, me vendría de lujo una aclaración gracias!!  :D :D

Un saludo!!


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 31 Julio 2007, 05:20 am
:P las GPC no sirven para eso.. un ejemplo muy sencillo..

1.- Recibes link = [ http://m" onclick="javascript ]
2.- Lo guardas en base de datos..
INSERT blah DATA ('http://m\" onclick=\"javascript')
3.- En otra pagina, lo imprimes, y salen las comillas sin los \ :P

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: <?BRoWLi?> en 31 Julio 2007, 05:41 am
No entiendo :P, yo hablaba de insertar el código (" onclick="javascript()...) en un input por ejemplo un buscador, no te dejaría acabar el atributo value del input ya que procesa la comilla doble antes de interpretarla.

Por ejemplo quedaría algo asi como:

Código:
<input type="text" value="\" atributo=\"loquesea\"">

en caso de no añador los slashes, rompería el atributo... Por otra parte si subes las comillas escapadas a una base de datos, al imprimirla es como si nunca hubieses escapado las comillas porque se procesan dos veces, para eso \\\", esto por ejemplo a la hora de imprimir imprimiría solo una comilla "... pero \\\\\", esto imprimiría \"...

Te digo que nunca oí eso de attribute breaking, solo lo e intentado deducir, por si se me va el santo al cielo xDDD


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 31 Julio 2007, 07:18 am
Citar
en caso de no añador los slashes, rompería el atributo... Por otra parte si subes las comillas escapadas a una base de datos, al imprimirla es como si nunca hubieses escapado las comillas porque se procesan dos veces, para eso \\\", esto por ejemplo a la hora de imprimir imprimiría solo una comilla "... pero \\\\\", esto imprimiría \"...
Las magic quotes no escapan las cosas 2 veces jajajaja

Y en un buscador, con "GPC" on.. hay bug.. \" no detiene el atribute breaking..

-->Link enviado por MP<--

codigo fuente:
Código:
<input type=text name=q style="width: 166px" value="\" esto-es-un-atributo">
como puedes ver, el codigo DOM generado es:
Código:
<input name="q" style="width: 166px;" value="\" esto-es-un-atributo="" type="text">

Es decir, filtrar con slashes en codigo HTML no sirve de nada ;)

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: <?BRoWLi?> en 31 Julio 2007, 16:58 pm
Citar
Las magic quotes no escapan las cosas 2 veces jajajaja

Me refiero a imprimir \"... en mi pag por ejemplo tengo todos los datos en una base de datos, y esos datos los subo apartir de un archivo especie instalador, donde antes de subir procesa las magic quotes, \" es = a ", \\\" es = a " tambien, porque en realidad el procesado es doble al subir y al imprimir, por eso es que se escribe \\\\\", el primer filtrado es igual a \\\" y el segundo, es decir la descarga desde la base de datos y la impresión de los datos es igual a \", no que las magic quotes escapen nada dos veces, sino que son procesadas dos veces.

EDITO: si imprimes el texto a buscar despues de introducirlo en el buscador, cierto! rompe el atributo aun con el addslashes! muchas gracias por el dato tio!!

En tal caso:

1. No imprimir el dato a buscar en el input
2. htmlentities
3. <>" = &lt;&gt;&quot;

No se si con la tercera me equivoco.

un saludo!!


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 1 Agosto 2007, 02:03 am
A ver A ver... Eso se esta desviando un poco...
Me parecio interesante que en una misma página se pueda probar una función cómo la que hay en esta página:

http://quickwired.com/smallprojects/php_xss_filter_function.php

Podríamos, como dice Sirdarckcat, "ver" si algo se le escapó.
Además, hay muchas páginas que muestran variadas formas de hacer un XSS. De verdad eso tiene mucho que hablar.
Estadísticas dicen que 8 de cada 10 sufren de este tipo de ataques...


Título: Re: Código PHP AntiXSS
Publicado por: Azielito en 1 Agosto 2007, 19:25 pm
Yo tengo una funcion, y no se si aplicando esta ya estoy libre de XSS y RFI y esas cosas xD
Código
  1. # Funcion para limpiar caracte-
  2. # res que pudieran comprometer
  3. # al servidor y/o al usuario
  4. # By: Azielito
  5. function limpia($var){
  6. //$var = strip_tags($var);
  7. $malo = array("\\","\'","'","%",";",":","&","#"); // Aqui poner caracteres no permitidos
  8. $i=0;$o=count($malo);
  9. while($i<=$o){
  10. $var = str_replace($malo[$i],"",$var);
  11. $i++;
  12. }
  13. return $var;
  14. }
  15.  
  16. # Funcion que aplica la funcion anterior
  17. # para no tener que preocuparnos por
  18. # ataques de XSS o SQLi
  19. function LimpiarTodo($datos){
  20. if(is_array($datos)){
  21. $datos = array_map('limpia',$datos);
  22. }else{
  23. die("<span class=\"error\">La funcion <b>LimpiarTodo</b> debe contener un arreglo.</span>");
  24. }
  25. return $datos;
  26. }
  27.  
  28. // Solo limpio get y post, tambien podes limpiar las $_COOKIE, $_SESSION, $_REQUES y todas esas
  29. if($_POST){
  30. $_POST =& LimpiarTodo($_POST);
  31. }
  32. if($_GET){
  33. $_GET =& LimpiarTodo($_GET);
  34. }

Pos eso, se podria saltar esta 'preotccion' ?


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 1 Agosto 2007, 19:36 pm
Sí, pero así no vamos a avanzar nunca, creando funciones que ya existe y cometiendo los mismos errores una y otra vez... esperad, tengo una idea...

Citar
function fncEcho($str) {
echo $str;
}



Título: Re: Código PHP AntiXSS
Publicado por: Crack_X en 1 Agosto 2007, 19:41 pm
Azielito tu funcion hace casi lo mismo que la primera que publicaron a excepcion que no limpias "<" ni ">" ni un ".  Quieren evitar un sql injection?  Codifiquen todo en base64 y luego introduscanlo xD


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 1 Agosto 2007, 21:28 pm
Azielito tu funcion hace casi lo mismo que la primera que publicaron a excepcion que no limpias "<" ni ">" ni un ". Quieren evitar un sql injection? Codifiquen todo en base64 y luego introduscanlo xD
nahhhhhhhhhhhh eso tenia pensado hacer en warzone y no se entendia nada desde el phpmyadmin.. (aunque a estas alturas, igual no se entiende nada xD, pero las pruebas, rangos, y esas cosas aveces si hay que modificarlas desde ahi.. me da flojera mejorar el panel xD)


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 2 Agosto 2007, 00:38 am
Sí, pero así no vamos a avanzar nunca, creando funciones que ya existe y cometiendo los mismos errores una y otra vez... esperad, tengo una idea...

Citar
function fncEcho($str) {
echo $str;
}


eeeeh.. pero el echo no libra de un XSS :rolleyes:
Además no existen funciones ya creadas para todas las codificaciones existentes. Uuuhm... quisas el talón de aquiles no esta en bypassear el filtro de la función sino en "saltarse" la función misma... Puede ser, si existe algún bug relacionado con el núcleo de PHP. Es una idea que me surgio ahora...


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 2 Agosto 2007, 01:47 am
Parece que mi ironía fue difícil de captar...

Lo que realmente quería decir es que os dedicáis a reinventar lo inventado, o lo que es lo mismo, malgastar el tiempo...


Citar
Además no existen funciones ya creadas para todas las codificaciones existentes.

htmlentities() soporta ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, BIG5, GB2312, BIG5-HKSCS, Shift_JIS, EUC-JP, que más quieres, ¿braile?

Citar
quisas el talón de aquiles no esta en bypassear el filtro de la función sino en "saltarse" la función misma... Puede ser, si existe algún bug relacionado con el núcleo de PHP

Aquí no hay talón de aquiles, tan solo hay que concienciar al programador para que haga su trabajo correctamente, desprendiéndose de estos malos hábitos de crear funciones para corregir nuestros propios errores.

No se como te atreves a decir que el problema de los ataques XSS reside en el interior del núcleo de PHP...


Título: Re: Código PHP AntiXSS
Publicado por: Azielito en 2 Agosto 2007, 16:56 pm
Pero, cuando necesitas recuperar mas de 20 campos? xD y quieres que algunos caracteres puedan pasar pero otros no? [...]

es algo dificil de explicar >_<


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 3 Agosto 2007, 05:11 am
Parece que mi ironía fue difícil de captar...

Lo que realmente quería decir es que os dedicáis a reinventar lo inventado, o lo que es lo mismo, malgastar el tiempo...


Citar
Además no existen funciones ya creadas para todas las codificaciones existentes.

htmlentities() soporta ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, BIG5, GB2312, BIG5-HKSCS, Shift_JIS, EUC-JP, que más quieres, ¿braile?

Citar
quisas el talón de aquiles no esta en bypassear el filtro de la función sino en "saltarse" la función misma... Puede ser, si existe algún bug relacionado con el núcleo de PHP

Aquí no hay talón de aquiles, tan solo hay que concienciar al programador para que haga su trabajo correctamente, desprendiéndose de estos malos hábitos de crear funciones para corregir nuestros propios errores.

No se como te atreves a decir que el problema de los ataques XSS reside en el interior del núcleo de PHP...
Es cierto que los hábitos de programación se tienen que corregir. Pero aún así SIEMPRE habrán errores internos de la misma programación del lenguaje. Y sabes por qué? Porque fue creado por humanos...
No faltará el investigador que sea capáz de saltar htmlentities, por eso existe la necesidad de crear funciones propias para asegurarse en lo propio y no en lo ajeno.

Salu2!


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 3 Agosto 2007, 14:59 pm
Los fallos de los que tu hablas causan el desbordamiento del buffer, y si nos ponemos así pues creamos nuestro propio lenguaje por que lo que veo tienes miedo a usar las funciones nativas que trae PHP...


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 4 Agosto 2007, 02:43 am
Miedo? Quién hablo de miedo? Bueno... esto se esta yendo para otro lado...
Yo creo que siempre es mejor asegurarse de lo propio. Por eso mi interes en hacer una función propia y, ademas analizar el código de aquella ya publicada.

Repito, propongo estudiar la función anterior por si hubiera alguna falla. Y para las/los osadas/dos publicar alguna función que pretenda superar aquella. O la que publique en un principio ;D

Aveces las cosas mas complejas son las que traen mayores problemas...


Título: Re: Código PHP AntiXSS
Publicado por: born2kill en 4 Agosto 2007, 03:10 am
Repito, propongo estudiar la función anterior por si hubiera alguna falla. Y para las/los osadas/dos publicar alguna función que pretenda superar aquella. O la que publique en un principio ;D

Totalmente de acuerdo...


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 4 Agosto 2007, 03:37 am
Código
  1. <?php
  2. function limpia($var){
  3. $malo = array("\\","\'","'","%",";",":","&","#");
  4. $i=0;$o=count($malo);
  5. while($i<=$o){
  6. $var = str_replace($malo[$i],"",$var);
  7. $i++;
  8. }
  9. return $var;
  10. }
  11.  
  12. function fncTime($tmpStart, $tmpEnd) {
  13. $expStart = explode(" ", $tmpStart); $intStart = $expStart[1].$expStart[0];
  14. $expEnd = explode(" ", $tmpEnd); $intEnd = $expEnd[1].$expEnd[0];
  15. return $intEnd-$intStart;
  16. }
  17.  
  18. $string = "abcdefghijklmnñopkrstuvwkyz0123456789!\"#$%&'()*+,-./@?>=<;:";
  19.  
  20. $intStart = microtime(); $var =limpia($string); $intEnd = microtime();
  21. echo "limpia() ".fncTime($intStart,$intEnd)."<br><br>";
  22.  
  23. $intStart = microtime(); $var = htmlentities($string, ENT_QUOTES); $intEnd = microtime();
  24. echo "htmlentities() ".fncTime($intStart,$intEnd);
  25. ?>

Citar

   limpia() 0.00010871887207

   htmlentities() 2.86102294922E-5


En fin, sobran las palabras...


Título: Re: Código PHP AntiXSS
Publicado por: NewLog en 4 Agosto 2007, 16:34 pm
Llevo varios dias siguiendo este hilo y a dia de hoy tengo varias preguntas...

Primero de todo, he provado el htmlentities.. Y con estos códigos y está entrada me da una salida que no entiendo...

Código
  1. <FORM ACTION="CodigoAntiXSSRecepcion.php" METHOD="get">
  2.  
  3.   <INPUT TYPE="text" NAME="vuln">
  4. <BR><BR>
  5.   <INPUT TYPE="submit" VALUE="Enviar">
  6.  
  7. </FORM>

Esto es lo que le he introducido: (hola<>\\\"n\'-hla

Este es el código de recepcion:

Código
  1. <?php
  2.  
  3. $var = $_GET["vuln"];
  4. $var2 = htmlentities($var, ENT_QUOTES);
  5.  
  6. ?>
  7. <FORM>
  8. <BR>
  9. Has escrito: <?php echo $var2; ?>
  10. </FORM>


Y esta es la salida: (hola<>\\\\\\\"n\\\'-hla

No se me tendrían que eliminar tags como '<', '>', '\','&'??? Si no es así no sé para qué usar htmlentities...

Con el otro código me ha funcionado...el input era (hola<>\\\"n\'-hla& y el output ha sido: (hola<>"n-hla , con lo que me ha eliminado lo que tenía que eliminar.


Aquí va mi otra duda, se ha demostrado que el código de htmlentities es bastante más rápido, pero con el casero puedo evitar entradas como :

Código:
CHAR(83,69,76,69,67,84,32, 42,32,70,82,79,77,32,81,85,69,82,73,69,83)

Para evitar SQL injections.

O cadenas codeadas en hexadecimal o octal para evitar un RFI, no?

Por lo que he leido eso no lo puedes hacer con la función nativa.


Aviso: Soy un completo novato... Así que piedad si digo estupideces ^^


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 4 Agosto 2007, 16:45 pm
NewLog, revisa el código fuente del resultado que obtienes con tu código.

Citar
<FORM>
<BR>
Has escrito: (hola&lt;&gt;\\\\\\\\\\\\\\\&quot;n\\\\\\\&#039;-hla</FORM>

Para evitar el SQL Injection tan solo tendremos que colocar los parámetros entre comillas simples y filtrar la variable de entrada con htmlentities() o mysql_escape_string().

Y para evitar el RFI simplemente no hay que dejar en manos de una variable dinámica que archivo será el incrustado...


Título: Re: Código PHP AntiXSS
Publicado por: NewLog en 4 Agosto 2007, 16:58 pm
Mmmmm... ahora lo entiendo mejor! Ya he visto que el código fuente ha sido 'traducido'.

Así que htmlentities no tiene ningún error, no? Sólo dificulta el trabajo posterior con la variable, no? (como ha dicho Sidarckcat). Pero tengo entendido que con html_entity_decode() eso se soluciona en un plis, plas.

Así que realmente htmlentities es la clave. Después basta con no usar 'includes' para evitar RFI, y usar comillas simples y htmlentities otra vez para evitar Sql Injections.

Gracias por esta discusión ^^ !


Título: Re: Código PHP AntiXSS
Publicado por: yeikos en 4 Agosto 2007, 17:11 pm
Cuando dije lo del RFI me refería a esto:

Código
  1. <?php // MAL
  2. include("/modules/".$_GET['page']);
  3. ?>
  4.  
  5. <?php // BIEN
  6. switch ($_GET['page']) {
  7. case "main": include("/modules/main.php"); break;
  8. case "login": include("/modules/login.php"); break;
  9. case "register": include("/modules/register.php"); break;
  10. }
  11. ?>
  12.  


Título: Re: Código PHP AntiXSS
Publicado por: NewLog en 5 Agosto 2007, 02:01 am

Después basta con no usar 'includes' para evitar RFI


A eso me refería! Aunque gracias por poner cual seria la manera correcta!


Título: Re: Código PHP AntiXSS
Publicado por: oRTNZ en 5 Agosto 2007, 09:10 am
Si alguien logra vulneral
YO, tu web es vulnerable a xss http://piratas.com.es/ hi  :P,saludos


Título: Re: Código PHP AntiXSS
Publicado por: дٳŦ٭ en 5 Agosto 2007, 12:44 pm
NewLog, revisa el código fuente del resultado que obtienes con tu código.

Citar
<FORM>
<BR>
Has escrito: (hola&lt;&gt;\\\\\\\\\\\\\\\&quot;n\\\\\\\&#039;-hla</FORM>

Para evitar el SQL Injection tan solo tendremos que colocar los parámetros entre comillas simples y filtrar la variable de entrada con htmlentities() o mysql_escape_string().

Y para evitar el RFI simplemente no hay que dejar en manos de una variable dinámica que archivo será el incrustado...

Es mejor usar mysql_real_escape_string():

Citar
Esta función es idéntica a mysql_real_escape_string() con la excepción de que mysql_real_escape_string() recibe un gestor de conexión y escapa la cadena de acuerdo al juego de caracteres actual. mysql_escape_string() no recibe un argumento de conexión, y no hace caso al valor actual del juego de caracteres.

Bueno pedazo de code que se echaron hee.

Saludos


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 5 Agosto 2007, 18:11 pm
Código
  1. <?php
  2. function limpia($var){
  3. $malo = array("\\","\'","'","%",";",":","&","#");
  4. $i=0;$o=count($malo);
  5. while($i<=$o){
  6. $var = str_replace($malo[$i],"",$var);
  7. $i++;
  8. }
  9. return $var;
  10. }
  11.  
  12. function fncTime($tmpStart, $tmpEnd) {
  13. $expStart = explode(" ", $tmpStart); $intStart = $expStart[1].$expStart[0];
  14. $expEnd = explode(" ", $tmpEnd); $intEnd = $expEnd[1].$expEnd[0];
  15. return $intEnd-$intStart;
  16. }
  17.  
  18. $string = "abcdefghijklmnñopkrstuvwkyz0123456789!\"#$%&'()*+,-./@?>=<;:";
  19.  
  20. $intStart = microtime(); $var =limpia($string); $intEnd = microtime();
  21. echo "limpia() ".fncTime($intStart,$intEnd)."<br><br>";
  22.  
  23. $intStart = microtime(); $var = htmlentities($string, ENT_QUOTES); $intEnd = microtime();
  24. echo "htmlentities() ".fncTime($intStart,$intEnd);
  25. ?>

Citar

   limpia() 0.00010871887207

   htmlentities() 2.86102294922E-5


En fin, sobran las palabras...
Se demora menos por que el array que tiene limpia() es menor al que tiene htmlentities()...

Si alguien logra vulneral
YO, tu web es vulnerable a xss http://piratas.com.es/ hi  :P,saludos
Por qué lo dices? si quieres discutir algo publica el código.

Como bien decía Sirdarckcat, cuando conocemos el ataque, también conocemos la manera de defendernos.
Se me ocurrio hacer una página de prueba para testear la seguridad de las funciones. Pero ahora estoy bastante colapsado en el tiempo y me gustaría hacerla tranquilamente.

Para los que se animen lean este libro:

-->link de rapidshare removido, compren el libro xD<--
http://www.amazon.com/Cross-Site-Scripting-Attacks-Exploits/dp/1597491543

Ahí esta escrita la función que se publico anteriormente y analiza algunos tipos de ataques...

Saludos.


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 6 Agosto 2007, 05:29 am
Hey!, le voy a decir a RSnake que estas pirateando su libro xD, link removido.. si lo quieren comprenlo, o ganenselo :P el foro ha tenido problemas con Microsoft Press por links de estos.. y pues, por cortesia a robert hansen, quito el link de aqui.. el me conoce, y conoce este foro.. :¬¬

Saludos!!


Título: Re: Código PHP AntiXSS
Publicado por: 19.5 en 6 Agosto 2007, 05:51 am
Ups! Pido disculpas. No sabía de aquello.
En todo caso, es una buena inversión.

Apenas tenga un poco de tiempo me animare a testear este asunto...


Título: Re: Código PHP AntiXSS
Publicado por: Norant en 21 Octubre 2010, 23:52 pm
Código
  1. // Prevent any possible XSS attacks via $_GET.
  2. foreach ($_GET as $check_url) {
  3.    if ((eregi("<[^>]*script*\"?[^>]*>", $check_url)) || (eregi("<[^>]*object*\"?[^>]*>", $check_url)) ||
  4.        (eregi("<[^>]*iframe*\"?[^>]*>", $check_url)) || (eregi("<[^>]*applet*\"?[^>]*>", $check_url)) ||
  5.        (eregi("<[^>]*meta*\"?[^>]*>", $check_url)) || (eregi("<[^>]*style*\"?[^>]*>", $check_url)) ||
  6.        (eregi("<[^>]*form*\"?[^>]*>", $check_url)) || (eregi("\([^>]*\"?[^)]*\)", $check_url)) ||
  7.        (eregi("\"", $check_url))) {
  8. die ();
  9. }
  10. }
  11. unset($check_url);


Título: Re: Código PHP AntiXSS
Publicado por: sirdarckcat en 22 Octubre 2010, 17:36 pm
no vayan a usar ese codigo para proteger contra xss.. no los va a proteger.


Título: Re: Código PHP AntiXSS
Publicado por: tragantras en 24 Octubre 2010, 22:52 pm

Código:
(,|;|<|>|'|`)
la coma la puedes no usar llamando funciones desde funcion.apply, los ; puedes no usarlos, los "<" y ">" si los quitas, entonces para que son las primeras 2 reglas? XD, y las comillas, para ataques de XSS no son necesarias, puedes usar /texto/.source

Saludos!!

según he estado viendo,para usar el apply, igualemtne tienes que pasarle la referencia y luego los parámetros de la función

funcion.apply(this, parametros)

estoy equivocado?