XSS en el software wiki grande

-1

Encontré un XSS vuln en un gran software wiki. Aquí está el código vuln:

<?php
/**
 * Mock load.php with pre-defined test modules.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @file
 * @package MediaWiki
 * @author Lupo
 * @since 1.20
 */
header( 'Content-Type: text/javascript; charset=utf-8' );

$moduleImplementations = [
    'testUsesMissing' => "
mw.loader.implement( 'testUsesMissing', function () {
    mw.loader.testFail( 'Module usesMissing script should not run.' );
}, {}, {});
",

    'testUsesNestedMissing' => "
mw.loader.implement( 'testUsesNestedMissing', function () {
    mw.loader.testFail('Module testUsesNestedMissing script should not run.' );
}, {}, {});
",

    'testSkipped' => "
mw.loader.implement( 'testSkipped', function () {
    mw.loader.testFail( false, 'Module testSkipped was supposed to be skipped.' );
}, {}, {});
",

    'testNotSkipped' => "
mw.loader.implement( 'testNotSkipped', function () {}, {}, {});
",

    'testUsesSkippable' => "
mw.loader.implement( 'testUsesSkippable', function () {}, {}, {});
",

    'testUrlInc' => "
mw.loader.implement( 'testUrlInc', function () {} );
",
    'testUrlInc.a' => "
mw.loader.implement( 'testUrlInc.a', function () {} );
",
    'testUrlInc.b' => "
mw.loader.implement( 'testUrlInc.b', function () {} );
",
    'testUrlOrder' => "
mw.loader.implement( 'testUrlOrder', function () {} );
",
    'testUrlOrder.a' => "
mw.loader.implement( 'testUrlOrder.a', function () {} );
",
    'testUrlOrder.b' => "
mw.loader.implement( 'testUrlOrder.b', function () {} );
",
];

$response = '';

// Does not support the full behaviour of ResourceLoaderContext::expandModuleNames(),
// Only supports dotless module names joined by comma,
// with the exception of the hardcoded cases for testUrl*.
if ( isset( $_GET['modules'] ) ) {
    if ( $_GET['modules'] === 'testUrlInc,testUrlIncDump|testUrlInc.a,b' ) {
        $modules = [ 'testUrlInc', 'testUrlIncDump', 'testUrlInc.a', 'testUrlInc.b' ];
    } elseif ( $_GET['modules'] === 'testUrlOrder,testUrlOrderDump|testUrlOrder.a,b' ) {
        $modules = [ 'testUrlOrder', 'testUrlOrderDump', 'testUrlOrder.a', 'testUrlOrder.b' ];
    } else {
        $modules = explode( ',', $_GET['modules'] );
    }
    foreach ( $modules as $module ) {
        if ( isset( $moduleImplementations[$module] ) ) {
            $response .= $moduleImplementations[$module];
        } elseif ( preg_match( '/^test.*Dump$/', $module ) === 1 ) {
            $queryModules = $_GET['modules'];
            $queryVersion = isset( $_GET['version'] ) ? strval( $_GET['version'] ) : null;
            $response .= 'mw.loader.implement( ' . json_encode( $module )
                . ', function ( $, jQuery, require, module ) {'
                . 'module.exports.query = { '
                . 'modules: ' . json_encode( $queryModules ) . ','
                . 'version: ' . json_encode( $queryVersion )
                . ' };'
                . '} );';
        } else {
            // Default
            $response .= 'mw.loader.state(' . json_encode( $module ) . ', "missing" );' . "\n";
        }
    }
}

echo $response;

La salida de $_GET["modules"] no se filtra. ¿Puedes decirme si este XSS es vulnerable y también peligroso para ti?

    
pregunta Robert Beran 19.07.2018 - 15:12
fuente

3 respuestas

4

Esto no parece peligroso ya que el tipo de contenido no es HTML:

header( 'Content-Type: text/javascript; charset=utf-8' );

Para detalles específicos sobre XSS y el tipo de contenido text/javascript vea, por ejemplo, XSS reflexivo en códigos de script con tipo de contenido" text / javascript ".

Como nota aparte, sugeriría anonimizar el código en el futuro o no hacer una pregunta de este tipo en un foro público. La divulgación completa sin ponerse en contacto con el proveedor primero es una forma incorrecta.

    
respondido por el tim 19.07.2018 - 15:25
fuente
2

Como referencia, el archivo en cuestión es enlace

Está parcialmente protegido con un 'Deny from all' .htaccess en la raíz del directorio de prueba enlace

Deny from all
    
respondido por el Sam Reed 20.07.2018 - 17:12
fuente
0

Si leí este código correctamente, está listando los módulos instalados en el servidor web. Esta es una vulnerabilidad, pero tendría que ser el administrador del servidor y tener un módulo con un nombre como <script>alert('xss');</script> .

Sin embargo, ¿es un XSS? OWASP define XSS como:

"Los ataques de secuencias de comandos entre sitios (XSS) son un tipo de inyección en la que se inyectan secuencias de comandos maliciosas en sitios web de otro modo benignos y de confianza. Los ataques XSS se producen cuando un atacante utiliza una aplicación web para enviar códigos maliciosos, generalmente en el formulario de un script del lado del navegador, a un usuario final diferente. Las fallas que permiten que estos ataques tengan éxito están bastante extendidas y ocurren en cualquier lugar donde una aplicación web utiliza la entrada de un usuario dentro de la salida que genera sin validarla o codificarla ". enlace

Dado que este ataque sería de un usuario autenticado en el sistema operativo, no sería un XSS.

    
respondido por el Joe M 19.07.2018 - 17:36
fuente

Lea otras preguntas en las etiquetas