[Resuelto] Tengo un problema descargando un .txt de un fuente.

Iniciado por @XSStringManolo, 8 Septiembre 2019, 07:53 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

http://stringmanolo.byethost12.com/an.php

Tengo un problemón.

Lo que intento hacer:
Tengo en la variable $SC el SourceCode de google.es
Estoy mostrando el source en la web e intento implementar un link para que el usuario se lo descarge.
Se me ocurrio meterlo en un archivo externo hacer un echo y descargar el archivo como .txt
El archivo se descarga correctamente.

Lo que sucede: Al abrir el archivo dentro me encuento el código fuente del aes.js
En el hosting que utilizo, muy de vez en cuando aparece este código fuente de aes.js y otras veces el mío.
Código (javascript) [Seleccionar]
/*
* aes.js: implements AES - Advanced Encryption Standard
* from the SlowAES project, http://code.google.com/p/slowaes/
*
* Copyright (c) 2008 Josh Davis ( http://www.josh-davis.org ),
* Mark Percival ( http://mpercival.com ),
*
* Ported from C code written by Laurent Haan ( http://www.progressive-coding.com )
*
* Licensed under the Apache License, Version 2.0
* http://www.apache.org/licenses/
*/

var slowAES = {
/*
* START AES SECTION
*/
aes:{
// structure of valid key sizes
keySize:{
SIZE_128:16,
SIZE_192:24,
SIZE_256:32
},

// Rijndael S-box
sbox:[
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x8...


Código (php) [Seleccionar]
<?php 
header
("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"source-code.txt\""); 
echo 
$SC;
?>


Código (php) [Seleccionar]
<?php
echo "$SC;
?>

</p>
</div>
<a href="php/download.php">Download Source Code!</a>
<p>
<h4>Links</h4>
<?php






Mod: Obligatorio el uso de etiquetas GeSHi.

EdePC

Saludos,

- Revisando mi apartado Network de mi Chrome Developer Tools, veo que algunas veces se cambia tu página an.php por otra que pone una cookie y redirige de nuevo a tu página an.php:

Código (javascript) [Seleccionar]
<html>
  <body>
    <script type="text/javascript" src="/aes.js"></script>
    <script>
      function toNumbers(d) {
        var e = [];
        d.replace(/(..)/g, function(d) {
          e.push(parseInt(d, 16))
        });
        return e
      }
      function toHex() {
        for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++)
          e += (16 > d[f] ? "0" : "") + d[f].toString(16);
        return e.toLowerCase()
      }
      var a = toNumbers("f655ba9d09a102d4968c63579db590b4")
        , b = toNumbers("98344c2eee86c4994890592585b49f80")
        , c = toNumbers("b7c84c9bff7ec4d94f982be3132cba49");
      document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
      location.href = "http://stringmanolo.byethost12.com/an.php?i=3";
    </script>
    <noscript>This site requires javascript to work, please enable javascript in your browser or use a browser with javascript support</noscript>
  </body>
</html>


- Luego, este mismo se inserta como contenido de prism.js, no se si lo insertas tu manualmente o como se hará... pero al final me da error la mayoría de las veces y no se formatea el código fuente de google.es

- Supongo que ese redireccionamiento lo pone tu Hosting

@XSStringManolo

Exacto, lo pone el hosting.

Tiene el src="/aes.js" y me lo imprime. Alguna idea de como podría hacer esa descarga?

Se encuentra el "/aes.js" en el prism.js? El prism.js si que lo metí yo para hacer highlighting del código fuente, el prism.js son unos 20k de tamaño. El aes.js son 33k. El prism.js tiene un módulo por ahí para hacer la descarga, copiar código al portapapeles pero no me está resultando muy realiable. Ando un browser patata para asegurarme que programo cosas compatibles con casi todo lo usual.

No tengo ni idea de que otra forma podría hacer la descarga. Ya probé de varias y todas pecan de lo mismo. Si sabeis de alguna dpm, si no estrenaré la api de pastebin que la tengo pendiente, a ver si "mágicamente" no envio el aes.js en lugar del contenido de la variable.

MinusFour

Tu mismo lo has dicho que es tu hosting, no tiene nada que ver prism.js. Es una medida de seguridad de byethost.

@XSStringManolo

Cita de: MinusFour en  8 Septiembre 2019, 17:10 PM
Tu mismo lo has dicho que es tu hosting, no tiene nada que ver prism.js. Es una medida de seguridad de byethost.
Se os ocurre como saltársela? Algún workaround? Llevo unas cuantas horas intentándolo de varias maneras y no lo consigo de ninguna.
En la Api de pastebin parace que ponen límite de lo que puedes subir con cuenta gratuita. Igual alguna otra Api?

MinusFour

Si puedes establecer la cookie antes de hacer la petición debería funcionar. Pero para eso vas a necesitar precargar la URL, extraer el secreto, llave e IV (las variables, a, b, c) y usar el slowaes para construir la cookie.

Tal y como lo hace ese script.

O puedes simplemente buscarte otro host que no tenga una protección así.

@XSStringManolo

Creo que ya conseguí hacerlo fucionar. Aún tengo que testearlo para asegurarme que no se vuelve a descargar el aes.js. Básicamente scrapeo desde la página de download.php antes de setear el archivo como .txt lo que obliga que sea la página precargada antes de que se pueda cargar. O eso creo, llevo horas probando de distintas maneras. Ahora tengo el problema de que scrapeo 2 veces el mismo sitio, no creo que influya en nada a menos que el sitio sea muy pesado. Prefiero no hablar antes de tiempo que la lata que me está dando algo tan sencillo... Con suerte me quito lo de las descargas de encima.
http://stringmanolo.byethost12.com/au.php

EdePC

- Yo lo he implementado guardando la variable en la sesión, y aparte usado prettify y beautify para que se vea mejor el código que muestra la web:

Código (php-brief) [Seleccionar]
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-css.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-html.js"></script>

<a href="download.php">Descargar</a>
<pre class="prettyprint" id="srcode">
  <?php
    session_start
();
    
$content file_get_contents("https://www.google.es/");
    
$_SESSION["content"] = $content;
    echo 
str_replace"<""&lt;"utf8_encode($content) );
  
?>

</pre>

<script>
  srcode = document.getElementById("srcode");
  srcode.innerText = html_beautify(srcode.innerText, {indent_size: 2});
</script>


download.php
Código (php-brief) [Seleccionar]
<?php
  session_start
();
  
header('Content-Disposition: attachment; filename="google.txt"');
  echo 
$_SESSION['content'];
?>

@XSStringManolo

No conocía esas libs. Beautify formatea el código? Voy a utilizarlo entonces. Vi imágenes del pretify y no me llama mucho, supongo que es cuestión de gustos. También tengo que revisar el Geshi que usa el foro, igual con css encaja guay en mi sitio.
Lo más importante es la funcionalidad que le quiero implementar al extraer todos los elememtos interesantes del código y organizarlos. Pico y pala.  :-\

MinusFour

Cita de: EdePC en  8 Septiembre 2019, 19:46 PM
- Yo lo he implementado guardando la variable en la sesión, y aparte usado prettify y beautify para que se vea mejor el código que muestra la web:

Código (php-brief) [Seleccionar]
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-css.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.10.2/beautify-html.js"></script>

<a href="download.php">Descargar</a>
<pre class="prettyprint" id="srcode">
  <?php
    session_start
();
    
$content file_get_contents("https://www.google.es/");
    
$_SESSION["content"] = $content;
    echo 
str_replace"<""&lt;"utf8_encode($content) );
  
?>

</pre>

<script>
  srcode = document.getElementById("srcode");
  srcode.innerText = html_beautify(srcode.innerText, {indent_size: 2});
</script>


download.php
Código (php-brief) [Seleccionar]
<?php
  session_start
();
  
header('Content-Disposition: attachment; filename="google.txt"');
  echo 
$_SESSION['content'];
?>


Hasta donde yo tengo entendido de esta forma debería ser el mismo problema. Byethost usa este mecanismo:



https://kyprizel.github.io/testcookie-nginx-module/

Lo que significa que si la petición no pasa del challenge por el reverse proxy, nunca llega a pegar a el servidor web. Si lo pones en una sesión o si lo pones en una cookie, etc, no debería importar, porque la petición nunca llega al servidor en el que estás trabajando hasta que pasas el challenge. La pregunta es, que tan a menudo ocurre el challenge. La cookie expira hasta el 2037 así que no estoy seguro cuando se vuelve a presentar el challenge.

Si ya estás imprimiendo todo el código del sitio en esa página, puedes simplemente recoger el código del div y guardarlo en un archivo.