From d46ada991804244c1ce9dc3ae1a370fce90ff004 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 4 Feb 2025 22:43:07 +0000 Subject: [PATCH] Translated ['src/pentesting-web/xss-cross-site-scripting/README.md'] to --- .../xss-cross-site-scripting/README.md | 98 ++++++++++++------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 3b6546d05..db3398495 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -23,11 +23,11 @@ 3. ¿Tu entrada está en literales de plantilla \`\`? 4. ¿Puedes eludir protecciones? 4. Función de Javascript **siendo ejecutada** -1. Puedes indicar el nombre de la función a ejecutar. ej.: `?callback=alert(1)` -4. Si está **utilizado**: +1. Puedes indicar el nombre de la función a ejecutar. p.ej.: `?callback=alert(1)` +4. Si **utilizado**: 1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es utilizada por algún sink.** -Cuando trabajes en un XSS complejo, podría ser interesante saber sobre: +Al trabajar en un XSS complejo, podría ser interesante saber sobre: {{#ref}} debugging-client-side-js.md @@ -57,7 +57,7 @@ Si tu entrada está reflejada dentro del valor del atributo de una etiqueta, pod 1. **Escapar del atributo y de la etiqueta** (entonces estarás en el HTML crudo) y crear una nueva etiqueta HTML para abusar: `">` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="` 3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`** -4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="`** +4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="** Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase: ```html @@ -124,7 +124,36 @@ some-same-origin-method-execution.md ### DOM -Hay **código JS** que está utilizando **inseguramente** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría +Hay **código JS** que está utilizando **inseguramente** algunos **datos controlados por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario. + +{{#ref}} +dom-xss.md +{{#endref}} + +### **Universal XSS** + +Este tipo de XSS se puede encontrar **en cualquier lugar**. No dependen solo de la explotación del 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.\ +Algunos **ejemplos**: + +{{#ref}} +server-side-xss-dynamic-pdf.md +{{#endref}} + +{{#ref}} +../../network-services-pentesting/pentesting-web/electron-desktop-apps/ +{{#endref}} + +## Bypass de WAF codificando imagen + +![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../images/EauBb2EX0AERaNK (1).jpg>) + +## Inyectando dentro de HTML crudo + +Cuando tu entrada 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 verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\ +Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ +_**Nota: Un comentario HTML se puede cerrar usando\*\*\*\*\*\***\***\*`-->`\*\***\***\*o \*\*\*\*\*\***`--!>`\*\*_ + +En este caso y si no se utiliza ninguna lista negra/blanca, podrías usar cargas útiles como: ```html This is a 1 line comment, but "-->" must to be at the beggining of the first line ``` -**Saltos de línea de JavaScript (del** [**truco de saltos de línea de JavaScript**](#javascript-new-lines) **)** +**Saltos de línea de JavaScript (del** [**truco de salto de línea de JavaScript**](#javascript-new-lines) **)** ```javascript //Javascript interpret as new line these chars: String.fromCharCode(10) @@ -595,7 +624,7 @@ console.log(arguments); btt`${'arg1'}${'arg2'}${'arg3'}` //It's possible to construct a function and call it -Function`x${'alert(1337)'}x``` +Function`x${'alert(1337)'}x` // .replace can use regexes and call a function if something is found "a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a," @@ -643,6 +672,7 @@ try{throw onerror=alert}catch{throw 1} 'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval} 'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval} // The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol. + ``` - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) @@ -719,11 +749,11 @@ dom-xss.md Allí encontrarás una **explicación detallada de qué son las vulnerabilidades DOM, cómo se provocan y cómo explotarlas**.\ Además, no olvides que **al final del post mencionado** puedes encontrar una explicación sobre [**ataques de DOM Clobbering**](dom-xss.md#dom-clobbering). -### Mejorando Self-XSS +### Mejora de Self-XSS ### Cookie XSS -Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing: +Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los que son vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing: {{#ref}} ../hacking-with-cookies/cookie-tossing.md @@ -737,7 +767,7 @@ Quizás un usuario pueda compartir su perfil con el administrador y si el self X ### Reflejo de Sesión -Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda, para que el administrador te ayude, verá lo que tú estás viendo en tu sesión pero desde su sesión. +Si encuentras algún self XSS y la página web tiene un **reflejo de sesión para administradores**, por ejemplo, permitiendo a los clientes pedir ayuda y para que el administrador te ayude, él verá lo que tú estás viendo en tu sesión pero desde su sesión. Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cookies/sesión. @@ -753,7 +783,7 @@ Podrías verificar si los **valores reflejados** están siendo **normalizados en ``` ### Ruby-On-Rails bypass -Debido a la **asignación masiva de RoR**, se insertan comillas en el HTML y luego se elude la restricción de comillas y se pueden agregar campos adicionales (onfocus) dentro de la etiqueta.\ +Debido a **RoR mass assignment**, se insertan comillas en el HTML y luego se elude la restricción de comillas y se pueden agregar campos adicionales (onfocus) dentro de la etiqueta.\ Ejemplo de formulario ([de este informe](https://hackerone.com/reports/709336)), si envías la carga útil: ``` contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa @@ -871,7 +901,7 @@ import { partition } from "lodash" ``` Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/yaca/tree/master/solution) para reasignar una biblioteca a eval para abusar de que puede desencadenar XSS. -- [**reglasdespeculación**](https://github.com/WICG/nav-speculation)**:** Esta función es principalmente para resolver algunos problemas causados por la pre-renderización. Funciona así: +- [**reglasdespeculación**](https://github.com/WICG/nav-speculation)**:** Esta función está principalmente destinada a resolver algunos problemas causados por la pre-renderización. Funciona así: ```html ``` -### Tipos de Contenido Web para XSS +### Web Content-Types to XSS -(De [**aquí**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Los siguientes tipos de contenido pueden ejecutar XSS en todos los navegadores: +(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Los siguientes tipos de contenido pueden ejecutar XSS en todos los navegadores: - text/html - application/xhtml+xml - application/xml - text/xml - image/svg+xml -- text/plain (?? no está en la lista, pero creo que lo vi en un CTF) -- application/rss+xml (desactivado) -- application/atom+xml (desactivado) +- text/plain (?? no está en la lista pero creo que lo vi en un CTF) +- application/rss+xml (off) +- application/atom+xml (off) En otros navegadores, otros **`Content-Types`** pueden ser utilizados para ejecutar JS arbitrario, consulta: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) -### Tipo de Contenido xml +### xml Content Type Si la página está devolviendo un tipo de contenido text/xml, es posible indicar un espacio de nombres y ejecutar JS arbitrario: ```xml @@ -1027,7 +1057,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) -- Más sofistificado 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) +- 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) @@ -1376,7 +1406,7 @@ changeReq.send('csrf='+token+'&email=test@test.com') }; ``` -### Robando mensajes de PostMessage +### Robo de mensajes PostMessage ```html