RSS |

Blog de Omar

Just another WordPress weblog

Advertisement

No sólo se inyecta SQL: PHP Code Injection

Si se han tomado la molestia de revisar el Top Ten de OWASP 2010 habrán notado que en la cúspide de esa concisa lista se encuentra el término “A1.- Inyecciones” y lejos de pensar que sólo existen las inyecciones del tipo SQL, lo cual no es cierto, hoy vamos a explicar y revisar las inyecciones del tipo PHP.

Lo cierto es que hace poco me topé con una página web con este tipo de vulnerabilidad, así que me he animado a explicar un poco como funciona esto. Por cierto en la lista candidata para el Top Ten del OWASP 2013 las vulnerabilidades del tipo Inyecciones sigue siendo la primera.

image

La historia es así: me contrataron para hacer la revisión de una página web (un Ethical Hacking), inicié revisando los formularios, los parámetros que se envían entre páginas, no suelo ponerle demasiada atención al XSS a menos que sean persistentes (no saben lo difícil que es explicar y que logren entender el riesgo de un XSS reflejado sobre una página web), empecé a buscar SQL Injection y que creen? si pensaste que sí, estas equivocado, nada!! no encontré nada.

Allí estaba yo… tirado en mi cama como una ballena varada en la orilla del mar pero no suplicando porque me regresen al agua sino preocupado por mostrar alguna vulnerabilidad que deje satisfecho a las personas que me habían contratado y es que cuando sólo les muestras XSS reflejado … te miran con cara de pocos amigos, como diciendo: “¿para esto te he pagado? no jodas pues!!!”.

Para este post voy a simular lo más posible la vulnerabilidad que encontré pero en mi aplicación web y obviamente no en la verdadera página vulnerable, ¿los motivos? no me quiero meter en problemas legales.
Aquí muestro la secuencia del ataque, espero les guste:

  1. Browseando encontré este formulario, no encontré inyecciones del tipo SQL se enviaba el comentario pero advertí que no se usaban los clásicos botones para “Enviar” o “Cancelar” el comentario del formulario sino que se utilizaban imágenes para realizar la misma función. Lo extraño era que para que las imágenes enviaran el formulario y cumplieran funciones distintas en realidad habían dos (02) formularios embebidos.

    image

  2. Revisé el código HTML y encontré los dos formularios, además encontré un campo invisible que también formaba parte del segundo formulario. Tranquilos en la siguiente imagen se ve y explico mejor esto para que todos los logren entender.

    image

  3. Como ya les comenté líneas arriba no encontré inyecciones del tipo SQL (una lástima realmente), así que decidí revisar las variables que se pasaban por el formulario cuando alguien decidía cancelar su comentario. Para analizar las variables que se pasaban en el formulario (hacia la misma página web si es que han notado el ACTION en el formulario) me apoyé del plugin de Firefox, TAMPER DATA. Aquí les muestro lo que me mostró el TAMPER cuando cancelaba el comentario, es decir cuando le daba click en la “X” del formulario.

    image

    Lo curioso ocurrió cuando advertí que al enviar el parámetro ELIMINAR cuyo valor era “eliminado”, aparecía encima del formulario un mensaje que decía que mi comentario había sido eliminado, un momento…. “ELIMINADO” es el valor de la variable, verdad? entonces… ¿qué pasa si modifico con el TAMPER el valor de esa parámetro? quizás sea sólo una coincidencia o de pronto algún STRING toma ese mismo valor y lo concatena.

    image

    La suposición era cierta, el parámetro “ELIMINAR” envía su valor a la página web y luego alguna variable toma ese valor y lo concatena con alguna cadena para mostrar el mensaje encima del formulario.

  4. Ahora toca entender un poco del lenguaje de programación PHP, vamos a tratar de ir suponiendo como el programador de la APP ha escrito el código. Antes de continuar debo aclarar que este punto (o sea el punto 4) no es un análisis que hice cuando realicé en verdadero Ethical sobre la página web, ya mas o menos sabía que debía colocar como valor del parámetro enviado (quizás sea algo de práctica y porque ya antes había visto esta vulnerabilidad y toca ser prácticos) y como este blog está dedicado a explicar como es que funcionan las cosas vamos a explayarnos un poco. Si quieren sólo ver como funciona el ataque sin entender ni papa pueden ir a otros blogs donde se jactan de lanzar un ataque sin explicar como funciona y al que tiene el atrevimiento de preguntar le terminan lanzando puntiagudos adjetivos como “lammer” o “script kiddies”, en fin….. esa gente son un caso, aquí vamos.

    image

    Entonces…. que pasaría si modificamos el valor de la variable $eliminar y lo ponemos algo más interesante como para ver que pasa con el código PHP. Podríamos poner algo así:

    image

    Hemos modificado la variable $eliminar y lo hemos con modificado convenientemente para que no genere ningún error de sintaxis, si se dan cuenta hemos colocado estratégicamente las comillas, los puntos y comas (;) y hasta agregamos una variable adicional para que se concatene con el resto del STRING. Perfecto!!! somos muy hackers!! sólo que si fuera así NO funcionaria. ¿por qué? sigue leyendo este post para enterarte el motivo. La verdadera salida en la web sería de la siguiente manera:

    image

    Si han logrado notar lo único que está ocurriendo es que se está concatenando como una cadena y se está haciendo un ECHO de la misma, nada mas y no se está ejecutando la función PRINT de PHP. Así que… lamentablemente la suposición no es correcta y así NO lo ha hecho el programador.


    ¿Entonces cómo lo ha hecho el programador?

    Pues toda la explicación anterior ha servido para entender como es que se hubiera podido concatenar cadenas con un parámetro modificado por un atacante, es decir, la explicación superior sólo sirvió para que se den una idea de como es el ataque realmente. Ahora si vamos a explicar como es que realmente el programador escribió el código, el programador escribió así realmente:

    image

    La función EVAL( ) de PHP está explicada en la página oficial de documentación del lenguaje: AQUÍ, y como verán permite que se ejecute automáticamente el valor de la variable sin necesidad de concatenar cadenas con puntos (.), obviamente usar la función EVAL( ) tiene sus riesgos y muchas veces es usado para obtener un RETURN del tipo NULL o FALSE y al parecer el programador la utilizó con ese propósito, si quieres entender más sobre la función EVAL( ) revisa estos dos links:

    - Aquí un blog donde lo explican paso por paso, muy detallado y muy didáctico: AQUÍ
    - En la página del proyecto OWASP también está explicado pero muy superficialmente, de igual forma conviene verlo: AQUI


    Importante:

    Sin la función EVAL( ) la inyección de código PHP no hubiera sido posible.

    Con el código que realmente escribió el programador, el resultado de la página web al modificar la variable $eliminar y colocar la función PRINT sería el siguiente:

    image

  5. Interactuando con el Sistema Operativo y CURL
    Ahora que ya sabemos como funciona la inyección de código PHP vamos interactuar con el Sistema Operativo (en este caso un Linux Fedora 14) colocando comandos que se ejecuten sobre el sistema. Básicamente usaremos la función EXEC ( ) que nos permitirá ejecutar comandos a nivel del sistema y lo mezclaremos con la función PRINT ( ) para que sean mostrados como resultado en la página cargada. Luego automatizaremos el ataque con un script que he desarrollado en PHP con CURL y que todo sea más sencillo.

    image

    Por ejemplo aquí hemos ejecutado el comando “WHOAMI” y nos ha devuelto como resultado “APACHE”, si prueban ejecutando otros comandos verán que les devuelve el resultado siempre y cuando el usuario Apache tenga los privilegios para ejecutarlo, sin embargo, hay un pequeño detalle con esto:

    A) Si el comando que ejecutamos devuelve más de una línea como resultado, por ejemplo, el comando “LS /ETC/” sólo se imprime en la pantalla la primera línea del resultado y no todo el listado del resultado.
    B) Que flojera estar ejecutando comando por comando con el TAMPER DATA, no terminaríamos nunca con lo que quisiéramos logra, así que toca automatizar el ataque con un SCRIPT.

  6. Automatizando el Ataque con CURL
    Desarrollé un pequeño script que automatiza el ataque y me permite colocar el comando que quiero ejecutar de manera sencilla, obviamente tocaría customizar el script para algún otro caso particular. Les comparto el script para que puedan revisarlo ya que no está nada complicado.

 

Ahora que ya he automatizado el ataque puedo hacer muchas cosas más con esta vulnerabilidad pero eso lo estoy haciendo en el videotutorial que voy a colgar mañana (al menos eso espero), cosas como: Ejecutar comandos en la base de datos y apoderarme del servidor jejeje.

Saludos,

 

Popularity: 18% [?]

Post Relacionados

  • No Related Posts
Owned al Palomo.com

Owned al Palomo.com

Diciembre 28, 2012 | 4 Comments

Hacked by @CMontoro

anonymous-tyler

Somos Anonymous, somos legión, no perdonamos, no olvidamos….. Espéranos PALOMO!! vamos por ti más abajo.

        

Por enseñar técnicas de hacking sin cobrar, por enseñar que el hacking no es un acto de magia sino de conocimiento y sobre todo por no escribir continuamente en el blog y desaparecerte algunos meses de Internet; Anonymous ha decidido lanzar su operación “Feliz día de los Inocentes” y vulnerar sin razón alguna la página del Palomo.com

     

Tranquilos…. nadie nos ha hackeado así que… FELIZ DÍA DE LOS INOCENTES, espero hayan entendido la broma y gracias a mi amigo Carlitos por permitir que ponga su nombre como autor intelectual de este autohacking, @CMontoro.

fotolimahack2012

Saludos,

Popularity: 72% [?]

Post Relacionados

Remote File Inclusion (RFI): Vieja pero aun vigente

rfi

Hace unas 02 semanas aprovechando que no tenía nada importante que hacer me puse a analizar la seguridad de una página web de una empresa peruana, sólo porque quise, ni mas ni menos, sólo me tiré en la cama como una ballena recién varada en la orilla de una playa y comencé mi faena.

Debo reconocer que la página debe haber invertido en un buen diseñador gráfico – que debe haber cobrado un buen dinero dicho sea de paso – pero definitivamente no es un buen programador y ha despilfarrado código PHP sin tener la mas mínima idea de conceptos de seguridad, dando origen a una pelotudez bastante gastada y una épica vulnerabilidad web, RFI.

Si yo fuera el que lo contrató lo cogería del cogote y le pediría un reembolso de mi dinero con algún tipo de subsanación por los posibles daños y perjuicios ocasionados (ojala nadie haya explotado la vulnerabilidad), bueno al verificar la gravedad de la vulnerabilidad mi mirada se quedó clavada en la pantalla y no podía creer todo lo que estaba encontrando, en fin…. si fuera uno de esos disque Anonymous hubiera inventado alguna triquiñuela estúpida para publicar la información allí encontrada o hubiera hecho un defacement de la página web pero…. hacer eso hubiera opacado este post y obviamente yo no pienso igual que esos señores.

Bueno aquí les dejo el video tutorial que realicé sobre Remote File Inclusion, la presentación y recursos utilizados en el video. Saludos.

  • Descargar la presentación: [AQUÍ]
  • Descargar los SCRIPTs utilizados en el video: [AQUÍ] – si usas Windows seguro tu antivirus lo detectará como virus.

Popularity: 33% [?]

Post Relacionados

Estuvimos en LimaHack 2012: Retomando el blog

Yo sé, yo sé, lo admito …. han pasado varios meses desde que escribí mi último post y sólo puedo excusarme en que he tenido muchas cosas que hacer:

  • La Maestría, que absorbe gran parte de mi tiempo
  • Los cursos de seguridad dictados, he dictado 03 cursos que hicieron que llegara muy tarde a mi casa
  • Y finalmente….. el trabajo de todos los días.

Bueno, lejos de ser una excusa valida, sólo me queda retomar la actividad del blog. Me alegra mucho cuando me encuentro con personas que me dicen que me siguen desde la primera vez que expuse en LimaHack (allá por el 2011) y que hasta ahora siguen mis charlas hasta el LimaHack 2012, muchas gracias a todos.

La presentación LimaHack 2012

Como se los prometí a todas las personas que estuvieron en mi charla y se me acercaron al finalizar la misma, aquí les dejo la presentación del evento.

Evento: LimaHack 2012
Fecha: 03/11/2012
Expositor: Omar Palomino H. (este pechito, aunque ahora todo el mundo le dice “EL Palomo”)
Tema: Android Mobile Hacking
Recursos en la web (el APK y su funcionamiento): http://www.el-palomo.com/limahack/README-elpalomo_limahack.html

Resumen de la presentación:

  • ¿Por qué Android?
  • Atacando desde Android: Anti y Dsploit tools
  • Atacando la red: Firesheep
  • Análisis de seguridad en WhatsApp
  • Metasploit: Atacando Android
  • Ataques de códigos USSD
  • Analizando la seguridad de Google Play y decompiling APK files con AGNITO

Descargar la presentación [AQUÍ]

image1

image2

 

Popularity: 25% [?]

Post Relacionados

INTRODUCCIÓN AL ANDROID EN EL PALOMO.COM

Por: BILLY GRADOS,

Android Developer en Devos Inc. (https://www.facebook.com/DEVOS.Inc) ,

desarrollador de Metro de Lima (by BGL) (https://play.google.com/store/apps/details?id=me.metro.bgl)

  1. INTRO
  2. DESARROLLO APPS
    1. SPEC
    2. SCREENS
    3. DESIGN
    4. CODE
    5. CODE WEB / SERVER
    6. DEPLOY
    7. TEST
  3. CONSEJOS
  1. INTRO

  2. Primero, dar el Agradecimiento a Omar PH, Ing. Sist., futuro Mg. Gestión TI, C|EH, Security +, ITIL v3., CSM (¿certified security master?) y otofílico, por este espacio de compartir el mundo móvil desde una aplicación rápida y compacta con líneas de código para dar un vistazo al desarrollo en android.

    Segundo, si quieres enterarte del Mundo Móvil y tecnología móviles,

    DALE ME GUSTA a la página de Devos Inc (https://www.facebook.com/DEVOS.Inc).

    ¿Qué es el mundo móvil?

    Si tienes un smartphone, si usas whatsapp, si escuchaste de instagram, foursquare, angrybirds, o las infinidades de aplicaciones para celulares con android, iOs, BlackBerry, Windows Phone, y más, entonces, sabes que esa revolución que empezó con un Walkman de Sony, continúa hacia sorprendentes tendencias como DNI y dinero electrónico, e incluso Google Glass. Toda tecnología que es portátil, que se mueve o puede ser llevada fácilmente contigo, está cambiando la forma como vemos el mundo. El mundo digital ya no está a la espera de nosotros desde una cabina de internet o una laptop, sino que está segundo a segundo con nosotros desde cualquier espacio donde llevemos como mínimo un Smartphone.

  3. DESARROLLO APPS

    Para gusto de muchos, no existe una lámpara mágica que fabrique aplicaciones móviles. Para solucionar problemas, existimos nosotros. Y con ingenio, y mucha perseverancia se ha llegado inclusive a curiosear por Marte, y desentrañar el genoma humano.

    Los que somos escritores para no humanos (me incluyo), lo hacemos teniendo en mente que cada línea de código en conjunto FACILITEN la vida de los usuarios para quienes construimos las aplicaciones. Muchas veces tan solo bastará un botón para obtener el reporte que antes tardaba días, o dar clic bastará para comprar la última oferta insuperable de un sitio de promociones y descuentos, debitándolo de nuestra cuenta bancaria.

    . Usaremos: Eclipse IDE Indigo corriendo en un Windows 7, Android SDK (http://developer.android.com/index.html). Advertimos: se expondrán los siguientes conceptos considerando que al menos se ha revisado y ejecutado satisfactoriamente el tutorial de construir tu primera aplicación android (http://developer.android.com/training/basics/firstapp/index.html)

    Descargar el código fuente.

    SOURCE: source.zip

    1. SPEC

      Hoy construiremos una aplicación compacta para:

      • Enviar los datos desde un formulario del teléfono inteligente usando Android hacia el sitio web de reservaciones.
      • Se simulará una aplicación para la empresa ficticia El Palomo ubicada en Estados Unidos, la cual se dedica al envío de movilidad (taxis) para el recojo de pasajeros (pickup) y traslado hacia otro punto (dropoff).
    2. SCREENS

      La idea de la aplicación es permitir a los usuarios reservar el envío de un taxi. Son cuatro opciones: express ride (cuando se reserva para los siguiente minutos), point to point (cuando se reserva para una determinada hora), y los relacionados al aeropuerto donde se indica de dónde se recogerá al pasajero o hacia qué aeropuerto quiere ir.

      • Pantalla principal
      • screen1

      • Pantalla principal (orientación horizontal)
      • screen2

      • Formulario
      • screen3

    3. DESIGN

      Para iniciar a programar podemos seguir los siguientes pasos:

      • main.xml: pantalla principal con las opciones principales de la aplicación
      • header.xml y footer.xml: será el encabezado y pie de página que se repetirán en las dos pantallas
      • form_layout.xml: la pantalla con el formulario.
    4. Encender

      Crear un nuevo proyecto en Eclipse, recordar que se sigue la siguiente estructura:

      estructura1estructura2estructura3 .
      .
      src: Carpeta con las clases java que darán vida a la aplicación..
      .
      .
      .
      .
      .
      .
      .
      .
      libs: Librerías para usar Fragments, y la inyección de dependencia para ahorrarnos unas líneas de código.

      .
      .
      res: RECURSOS:

      • Drawable con los xml de las formas y fondos a usar para los botones y scrollbar
        .
        .
        .
      • Layout: Aquí están las pantallas
        .
        .
        .
        .
      • Layout-land: Aquí la pantalla pero para posición horizontal
        .
        .
      • Values: Un conjunto de valores como arreglos, listado con colores, dimensiones, cadenas de texto y estilos.
        .
        .AndroidManifest.xml: Archivo donde inicia toda la configuración del proyecto android.

      Arrancar

      Con una estructura clara, arrancamos con las pantallas:

      Se usa include para incluir header.xml y footer.xml

      spinner es el componente que permite seleccionar una de las opciones de pasajeros.

      View se usa como separador.

      Como la aplicación está pensada para adaptarse a varios idiomas se aconseja separar en un archivo de cadenas de texto (strings.xml) todas las palabras y frases. Conforme se necesite las incluimos y las usamos en las pantallas.

      Lo mismo aplica para colores que reusaremos y podemos centralizar en un archivo (colors.xml) para cambiar rápidamente en todas las pantallas donde se use. Lo mismo aplica con las dimensiones (dimen.xml). También el listado de opciones de pasajeros (arrays.xml).

      Los estilos personalizados se manejan en styles.xml y que se enlaza con la aplicación gracias al AndroidManifest.xml

      <application
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/ElPalomoTheme" >

      ahí se incluye qué ícono servirá para lanzar la aplicación (android:icon) y que se mostrará al lado de las demás aplicaciones.

      El Activity (que viene a ser como el controlador principal a usarse) a iniciar se declara usando el <intent-filter>. Todos los Activity tienen que ser declarados.

      Manejar y Apagar

      Manejar y apagar lo veremos a continuación.

    5. CODE

      ElPalomoReservationsActivity.java

      Activity principal donde inicia la aplicación.  Usamos el Annotation @InjectView para inyectar y tener una referencia a los elementos de la vista / pantalla R.layout.main

      Inmediatamente después de establecido el contenido de la pantalla ocurrirá la inyección de dependencia y podremos fácilmente sin usar findViewById

      Indicamos que los botones tendrán como listener al activity que hereda de RoboActivity he implementa a OnClickListener.

      Y finalmente cuando se reciba el evento clic gracias al listener declarado que es este Activity, nos permitirá ir al siguiente Activity.

      Usamos la la clase ControladorReservations como una clase singleton para disponer de información a través de toda la aplicación en memoria.

      FormActivity.java

      A diferencia del anterior este implementa validaciones de campos requeridos en el botón send.

         progress = new ProgressDialog(this);
         progress.setMessage(getString(R.string.sending));
         progress.show();
         new InternetRequestTask().execute();

      Esas líneas hacen que se ejecute la Tarea InternetRequestTask que será un hilo en background que enviará a la internet el formulario.

      InternetRequestTask extends AsyncTask dentro de FormActivity.java

      • doInBackground

      Usa la clase Util que empaqueta la implementación para el envío a Internet.

      return Util.openUrl(

      getString(R.string.url),

      httpMethod,

      param);

      getString(R.string.url) permite obtener la dirección url que se encuentra en el archivo de strings.

      httpMethod será POST.

      La variable param es un empaquetado de pares de Strings (Bundle).

      • onProgressUpdate

      Se usa en caso tengamos un progress dialog que se actualiza según el valor recibido.

      • onPostExecute

      Ejecuta un método de la clase padre FormActivity que mostrará al usuario que el formulario se envió correctamente.  Se cierra el diálogo, y se finaliza el Activity para pasar al Activity que lo llamó, o sea, ElPalomoReservationsActivity

      ControladorReservations.java

      Una clase que puede usarse para servir de control y de una capa lógica que actualmente solo se usar para saber qué botón se presionó.

      TimePickerFragment.java y CustomTimePickerDialog.java

      Las dos clases anteriores permiten que aparezca el timepicker. Primero como un fragment diálogo y luego como un diálogo personalizado. Estas clases fueron tomadas de http://developer.android.com/guide/topics/ui/controls/pickers.html

      Se adaptó para usar un intervalo de 15 minutos (TIME_PICKER_INTERVAL)

      Util.java

      Contiene parte de la clase del SDK de Facebook para android usada para la conectividad a internet.

    6. CODE WEB / SERVER

    7. android_reservations_service.php

      El archivo responsable de guardar los datos y responder a la aplicación móvil (cliente) enviará como respuesta Reservation sent lo cual se verá al finalizar progress dialog.

    8. DEPLOY

    9. Usar un servidor donde se ejecute PHP, incluir el archivo php y configurar la dirección correctamente en el strings.xml.

      (Recordar dar permisos a los archivos o directorio donde se creará el archivo reservations.txt)

    10. TEST

    11. Véase demo (http://www.youtube.com/watch?v=J3KVc_haLCA)

  4. CONSEJOS

  • Perseverancia como todo en la vida.
  • Tener una perspectiva clara de los requerimientos y ordenar el trabajo: Requerimientos, Diseño (arquitectura de la aplicación y diseño de pantallas), Programar desde las pantallas hasta la funcionalidad
  • Probar y anticiparse a los cambios. Jugar con implementar nuevas funcionalidades y proponerse retos de cómo quedaría mejor y completarlos.

Popularity: 36% [?]

Post Relacionados

  • No Related Posts