Entonces, aquí hay un pedazo de código que encontré.
<?php
$name = $_GET['name'];
if (!empty($name)) {
$name = str_replace("<", "<", $name); //line 1
$name = str_replace(">", ">", $name); //line 2
$name = urldecode($name); //line 3
echo $name;
}
?>
Este código lo encontré en uno de los marcos de práctica de piratería ética llamados bWAPP en el nivel de seguridad 1. La solución potencial para evitar esta técnica es a URL encode
la cadena XSS dos veces.
Supongamos que mi cadena XSS es
<script>alert('XSS');</script> //checkpoint alpha
Entonces, codificarlo una vez debería darme
%3Cscript%3Ealert%28%27XSS%27%29%3C%2fscript%3E //checkpoint beta
PROBLEMA 1:
Si lo trazo hacia abajo, en la línea 1 y 2 no pasa nada. Pero en la línea 3 se decodifica. Y así, la cadena resultante que recupero se convierte en checkpoint alpha
. Entonces, cuando lo repito, debería aparecer una alerta.
CONTRADICCIÓN 1:
No ocurre nada de esto y acabo de mostrar checkpoint alpha
en texto claro.
PROBLEMA 2:
Cuando, lo doble codificando, (que es la solución potencial a este problema), obtengo,
%253Cscript%253Ealert%2528%2527XSS%2527%2529%253C%252fscript%253E
Ahora, esta declaración pasa nuevamente por las líneas 1 y 2, y al tropezar con la línea 3, se decodifica a checkpoint beta
y se hace eco.
CONTRADICCIÓN 2:
Cuando se hace eco, debería obtener checkpoint beta
en texto claro, pero de repente el navegador abre el cuadro de alerta con XSS funcionando perfectamente.
Soy nuevo en este campo y actualmente estoy intentando borrar mis conceptos básicos relacionados con el desarrollo web. Por favor, perdonen mi incorrecta declaración de formación. Gracias.