Código PHP AntiXSS

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

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

born2kill

Cita de: 19.5 en  4 Agosto 2007, 02:43 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...

yeikos

Código (php) [Seleccionar]
<?php
function limpia($var){
$malo = array("\\","\'","'","%",";",":","&","#");
$i=0;$o=count($malo);
while($i<=$o){
$var str_replace($malo[$i],"",$var);
$i++;
}
return $var;
}

function 
fncTime($tmpStart$tmpEnd) {
$expStart explode(" "$tmpStart); $intStart $expStart[1].$expStart[0];
$expEnd explode(" "$tmpEnd); $intEnd $expEnd[1].$expEnd[0];
return $intEnd-$intStart;
}

$string "abcdefghijklmnñopkrstuvwkyz0123456789!\"#$%&'()*+,-./@?>
=<;:";

$intStart = microtime(); $var =limpia($string); $intEnd = microtime();
echo "limpia() ".fncTime($intStart,$intEnd)."<br><br>";

$intStart = microtime(); $var = htmlentities($string, ENT_QUOTES); $intEnd = microtime();
echo "htmlentities() ".fncTime($intStart,$intEnd);
?>


Citar

   limpia() 0.00010871887207

   htmlentities() 2.86102294922E-5


En fin, sobran las palabras...

NewLog

#32
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 (php) [Seleccionar]
<FORM ACTION="CodigoAntiXSSRecepcion.php" METHOD="get">

   <INPUT TYPE="text" NAME="vuln">
<BR><BR>
   <INPUT TYPE="submit" VALUE="Enviar">

</FORM>


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

Este es el código de recepcion:

Código (php) [Seleccionar]
<?php
 
$var 
$_GET["vuln"];
$var2 htmlentities($varENT_QUOTES);
 
?>

<FORM>
<BR>
Has escrito: <?php echo $var2?>
</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 :

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

yeikos

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

NewLog

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

yeikos

Cuando dije lo del RFI me refería a esto:

Código (php) [Seleccionar]

<?php // MAL
include("/modules/".$_GET['page']);
?>


<?php // BIEN
switch ($_GET['page']) {
case 
"main": include("/modules/main.php"); break;
case 
"login": include("/modules/login.php"); break;
case 
"register": include("/modules/register.php"); break;
}
?>


NewLog

Cita de: NewLog en  4 Agosto 2007, 16:58 PM

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


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

oRTNZ

Cita de: born2kill en 30 Julio 2007, 06:23 AM
Si alguien logra vulneral
YO, tu web es vulnerable a xss http://piratas.com.es/ hi  :P,saludos
(31 del 12 de 2005) un dia que recuerdo siempre! :p
(03 del 08 de 2006) otro dia que lo recordare siempre...
Si eres Peruano, QUEDATE y si quieres ser de segunda mano del pais que fueras, pues LARGATE Y NO REGRESES...

дٳŦ٭

Cita de: 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...

Es mejor usar mysql_real_escape_string():

CitarEsta 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


Con sangre andaluza :)


19.5

#39
Cita de: yeikos en  4 Agosto 2007, 03:37 AM
Código (php) [Seleccionar]
<?php
function limpia($var){
$malo = array("\\","\'","'","%",";",":","&","#");
$i=0;$o=count($malo);
while($i<=$o){
$var str_replace($malo[$i],"",$var);
$i++;
}
return $var;
}

function 
fncTime($tmpStart$tmpEnd) {
$expStart explode(" "$tmpStart); $intStart $expStart[1].$expStart[0];
$expEnd explode(" "$tmpEnd); $intEnd $expEnd[1].$expEnd[0];
return $intEnd-$intStart;
}

$string "abcdefghijklmnñopkrstuvwkyz0123456789!\"#$%&'()*+,-./@?>
=<;:";

$intStart = microtime(); $var =limpia($string); $intEnd = microtime();
echo "limpia() ".fncTime($intStart,$intEnd)."<br><br>";

$intStart = microtime(); $var = htmlentities($string, ENT_QUOTES); $intEnd = microtime();
echo "htmlentities() ".fncTime($intStart,$intEnd);
?>


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

Cita de: oRTNZ en  5 Agosto 2007, 09:10 AM
Cita de: born2kill en 30 Julio 2007, 06:23 AM
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.