iniqua

1Sep/100

[Tool] XML-RPC Packet Generator

Hoy os queremos presentar una nueva herramienta desarrollada por uno de los componentes del blog. La herramienta en cuestión se llama RPC-client (http://code.google.com/p/rpc-client). Está desarrollada con mono y la podemos correr tanto en Windows como en Linux o MAC.

La herramienta ha sido concebida para crear, en línea de comandos, y de forma sencilla paquetes XML-RPC contra un servidor remoto.

Unas cuantas preguntas y respuestas rápidas:

  • P: ¿En concreto que es el XML-RPC y para qué sirve?
  • R: Es una forma de comunicarse con sistemas remotos y pedirles que hagan algo y nos envíen los resultados. Por ejemplo: le podríamos pedir al servidor 'X' que calculara la suma de dos números muy grandes y nos devolviera el resultado.
  • P: ¿Quién lo usa?
  • R: WordPress o Drupal, son dos claros ejemplos.
  • P: ¿Para qué lo usan?
  • R: Para ofrecer cierta funcionalidad como puede ser: Consulta de estadísticas remotas, acceder mediante el teléfono móvil, configuración remota…
  • P: ¿Para qué me puede servir a mí la herramienta que comentas?
  • R: Depende del uso que se le de. Nos podría servir para ejecutar ciertos exploits, extraer información del servicio o, si eres desarrollador, probar tu servicio web.

Si ejecutamos el programa nos aparece la siguiente pantalla:

Tenemos varias opciones útiles, como usuario y password, si el servidor web los requiere. Tiene un modo verbose que nos mostrará el paquete que enviará antes de hacerlo.

El parámetro "-M" indica el método, o función remota que queremos invocar. Siguiendo el ejemplo expuesto arriba (el de la suma de dos números) el valor de este parámetro podría ser "SumTwoBigNumbers".

El target debe de ser una URL donde se encuentre el servicio XML-RPC. En WordPress, por ejemplo, suele estar en: http://www.sitio.com/xmlrpc.php.

El parámetro -P indica los parámetros que le queremos pasar al método. Según el tipo que sean han de indicarse en un formato u otro. Los tipos disponibles los podemos encontrar en: http://en.wikipedia.org/wiki/XML-RPC.

Si queremos enviar dos parámetros. Unos tipo entero y otro tipo string tendríamos que escribir: -P integer@12!string@cadena.

Si es del tipo array, con tres parámetros: array@integer#23%integer#9%integer#12; y si es tipo struct: struct@ParamName#integer#2%ParamName2#string#value.

Existe un último tipo, llamado custom, que como su nombre indica nos permite crear parámetros a nuestro gusto. Su sintaxis es parecida a la anterior: custom@NonExistType1#value1% NonExistType2#value2. Esto nos produciría el siguiente código XML:

<NonExistType1>value1</NonExistType1><NonExistType2>value2</NonExistType2>

A pesar de que pueda parecer una sintaxis liosa es bastante ordenada y es muy fácil acostumbrarse a ella.

Vamos a explicar rápidamente cómo se usa con un ejemplo: Trataremos de ejecutar un exploit. Éste en concreto: http://www.securityfocus.com/bid/14088/exploit.

Vemos que este código no corresponde con ninguno de los predeterminados (integer, string…), por lo tanto es custom. Para generarlo escribimos lo siguiente:

Windows:

RPCClient.exe -t http://www.sitiovulnerable.com/xmlrpc.php -v -M test.method -P "custom@value#',")); phpinfo(); exit;/*"

Linux/MAC/*NIX:

Mono RPCClient.exe -t http://www.sitiovulnerable.com/xmlrpc.php -v -M test.method -P "custom@value#',")); phpinfo(); exit;/*"

Es muy importante recalcar la importancia de las comillas que están en color rojo, puesto que sin ellas la línea de comandos interpretaría lo que encierran y no las pasaría de forma íntegra como parámetro a rpc-client.

Comprobamos que hemos generado el código igual que el exploit exigía:

Una vez comprobado ya solo necesitamos un sitio web vulnerable J

PDF Printer    Enviar articulo en formato PDF a
9Jun/100

Visual Studio un IDE… ¿1..N?

Supongo que habréis dos tipos de personas leyendo este post (¡y que conste que el comentario no tiene que ver con el chiste!). Los que habréis pillado al vuelo de que irá y los que habréis pensado: ¿Qué se les habrá ocurrido ahora a esta gente de Iniqua.com?.

Para ser franco es una frikada. Sí, lo sé. Este post va de cómo con un solo IDE podemos programas con esos lenguajes de programación (de ahí lo de 1<->N :P ) que tal vez nunca nos hubiéramos imaginado que se pudiera. Vamos, lo que hace Eclipse o Netbeans pero con Visual Studio, que parece que es muy estricto y poco versátil.

No sé si a vosotros os pasa, pero cuando se llevan varios lenguajes en rueda es muy molesto tener que estar cambiando de uno a otro constantemente. Que si para mis scripts uso Python o Perl. Para web uso .Net, Java o php. O para entorno de escritorio uso .Net o Java. Es muy molesto tener que tener un editor para cada cosa. ¡Y no vale que me digáis que use Vim o Emacs!, que para cosas relativamente pequeñas está bien, pero para algo de más envergadura no es viable.

Si os gusta Visual Studio y estáis acostumbrados a él, ¿porqué no integrarlo todo?. Aquí os presentamos una serie de plugins con los que poder tener un todo en uno:

Plugin para python

Para python podemos encontrar un plugin que utiliza el intérprete IronPython. La instalación es muy sencilla y ofrece una integración fantástica, además de tener un autocompletado bastante bueno y tener depuración. Una captura de Plecost (www.iniqua.com/labs/plecost/) abierto con Visual Studio:

Podéis descargarlo en: http://ironpython.net/tools/

 

Plugin para php

El plugin disponible para php tiene una pega: Que no es gratuito. Si te ganas la vida con php la licencia vale muy poco (99$). El autocompletado tampoco está mal. Aquí una captura del fichero xmlrpc.php de WordPress:

 

Podéis descargarlo en: http://www.jcxsoftware.com/download.php

 

Plugin para java

Microsoft hizo su propia implementación de la máquina virtual de Java y podemos programas en J# que viene integrado con Visual Studio (depende de la edición), pero si queremos la máquina virtual de Sun (Oracle), la solución a adoptar no es un plugin como tal, es más bien un conector.

Nosotros programamos en .Net y el plugin se encargar de convertir el código generado por el MSIL de .net en bytecodes de java. Según la página web de los desarrolladores: "Code in .NET, Build for Java, Run on Open Systems". Como mínimo merece la pena echarle un vistazo, porque la idea es genial. El plugin se llama Grasshopper y lo podéis encontrar en: http://dev.mainsoft.com/Default.aspx?tabid=130

 

Por supuesto hay muchos más lenguajes. Pero los plugins descritos, y los lenguajes que integra el propio IDE, cubren los lenguajes más utilizados. Si sabéis tenéis experiencias con estos plugins (o con otros) esperamos vuestros comentarios.

Create PDF    Enviar articulo en formato PDF a
31May/102

Consultas a bases de datos 262 veces más rapidas

Un poco de teoría sobre buscadores

Hoy os queremos contar algo que probablemente os deje a muchos con la sensación de que os estamos mintiendo. Puede que el título del post sea algo populista, pero realmente es cierto, así que: ¿Por qué no ponerle un nombre llamativo? J.

Antes de continuar, decir que para que le saquéis más jugo al post deberíais de saber SQL, aunque sea de forma muy básica. Los ejemplos mostrados y todo lo aquí expuesto está hecho con MySQL, pero estar característica no exclusiva de SGBD. Otros gestores (MS SQL Server) también disponen de ella. Para hacer nuestra base de datos de ejemplo y lanzar las consultas hemos usado, por comodidad, MySQL Workbench 5.2 OSS.

Cuando acabéis de leer el post conseguiréis que una búsqueda que antes tardaba en ejecutarse 12 segundos, se ejecute en 0.032 segundos!!!. Como dirían en la teletienda: increíble, pero cierto. Y para muestra un botón:

Conseguirás pasar de esto:

A esto:

El que más o el que menos ha hecho alguna vez (o al menos lo ha usado) un típico buscador en una página web. Cuando escribes lo que quieres buscar, internamente se suele transformar en un consulta más o menos como sigue:

    SELECT campo1,campo2,…,campoN FROM Tabla1, Tabla2…, TablaN WHERE Campo1 LIKE 'VALOR DE ENTRADA';

Este es el ejemplo más sencillo de consulta que podemos encontrar, y menos eficiente, porque si escribes dos palabras irían dentro del mismo "LIKE". Por eso lo que se hace es separar cada valor de lo que escribamos y construir sentencias con múltiples condiciones:

    SELECT campo1,campo2,…,campoN FROM Tabla1, Tabla2…, TablaN WHERE Campo1 LIKE 'ENTRADA1' AND Campo1 LIKE 'ENTRADA2' … ;

La consulta se puede complicar todo lo que el programador quiera, al igual que el operador booleano entre condiciones puede ser "AND" u "OR", normalmente a criterio del programador.

Estas consultas, relativamente sencillas, tienen un coste que depende de la cantidad de información que contenga la base de datos.

La cosa empieza a complicarse cuando tenemos que hacer búsquedas en las que entran en juego diferentes tablas. Para los ejemplos vamos a tomar 2 tablas. Una con citas de un libro Creative Common (podéis encontrar el libro aquí: http://www.moisescabello.com/escritos/Armantia.pdf), y otra con refranes españoles (podéis descargarlo de aquí: http://geneura.ugr.es/~victor/refranero.shtml). Las tablas recibirán los nombres de "citas" y "refranes" respectivamente:

    SELECT * FROM iniqua.refranes as A INNER JOIN iniqua.citas as B

WHERE

Refran like '%VALOR1%' and Refran like '%VALOR2%' and Description like '%VALOR3%' or Description like '%VALOR4%';

Ésta consulta le cuesta un tiempo resolverla a la base de datos. Si la lanzamos buscando cualquier palabra (que sabemos está incluida), nos da un tiempo de búsqueda bastante alto:

Como decía es un tiempo muy alto para una base de datos que se encuentra en el sistema local y sin ningún otro servicio corriendo, aunque la búsqueda la hace entre millones de tuplas de información:

Resulta obvio el hecho de que si un usuario hace una búsqueda en nuestra web, por ejemplo, y tarde 15 segundos en devolverle la información lo más probable que murmulle algún "piropo" hacia nuestra familias y cierre la ventana del navegador. Hay que conseguir rebajar ese tiempo.

Los índices

Los índices son un tipo de dato especial que usan los motores de base de datos para tener acceso más rápido a ciertos campos de las tablas de las bases de datos. Hasta aquí nada nuevo. Normalmente los motores incluyen uno con la propia clave primaria de cada entidad, pero no siempre buscamos por la clave primaria, ¿verdad?.

Aquí es donde entra lo curioso de este post: En los tipos de índices. Vamos a aprender a usar el tipo de índice fulltext. Este índice está pensado para columnas de la base de datos que almacenen texto y sobre las que se vayan ha hacer búsquedas (como lo es el caso que expusimos más arriba).

El tipo de índice fulltext tiene muchas ventajas:

  • Búsquedas ultrarrápidas.
  • Las búsquedas son devueltas dependiendo del orden de relevancia.
  • Excluye palabras de uso común, que no suelen ser útiles en las búsquedas.
  • Excluye palabras que aparecen en más de la mitad de las filas
  • Búsquedas configurables y muy sencillas.

Como no es oro todo lo que reluce también hay que hacer mención al principal problema, que es el espacio. Toda base de datos, en mysql, tiene dos ficheros. Uno para los datos y otro para los índices. Cuando añades un índice del tipo fulltext el fichero de índices, normalmente mucho más pequeño que el de datos, pasa a ocupar prácticamente lo mismo que lo que ocupen las columnas con información que tienen este tipo de índice. Esto tendremos que tenerlo en cuenta, ya que si tenemos una base de datos de 200MB (guardado en una columna casi toda la información), realmente nos hará falta casi 400MB de espacio.

Podemos crear un índice haciendo uso de mysql-workbench, si nos apetece ponernos con SQL. Seleccionando la tabla y pulsando el botón derecho->Alter table:

Una vez aplicado los cambios ya podemos usar el índice.

Consultas usando el índice FullText.

Con este tipo de índice podemos encontrar varios tipos diferente de consultas:

  • Búsquedas en lenguaje natural:

    Son el tipo de búsquedas por defecto. Buscará el valor indicado en la columna que se le pase como parámetro. Si encuentra el valor en alguna de las columnas las mostrará como resultado.

  • Búsquedas booleanas:

    Probablemente sean las más parecidas a lo que escribimos algo en google. Con método de búsqueda indicas que quieres qué palabras quieres que estén en los resultados y cuáles no usando comodines, como "+", "-", "*", etc.

  • Búsquedas extendidas.

    Similares a las búsquedas naturales con una añadido. Hacen dos pasadas. Una primera con una búsqueda natural normal y otra segunda con las palabras más relevantes encontrada en la primera búsqueda. Te dirás, ¿y esto para qué me sirve a mi?. Es sencillo:

    Normalmente la gente asumimos, inconscientemente, que el buscador es un ser humano y que cuando escribamos en el cuadro de búsqueda la palabra "dase de datos" va a saber que queremos buscar entradas que estén relacionadas con las palabras: mysql, oracle, sql server, postgresql…, pero obviamente no es así.

    Imaginemos que tenemos una tabla con dos columnas. Una llamada "título" y otra "descripción". Supongamos la siguiente información almacenada:

Num

Título

Descripción

1

Libro de MySQL

Libro sobre una base de datos gratuita.

2

MySQL

Uno de los sistemas que implementa fulltext

3

Conectores de MySQL

Un conector para MySQL

4

Oracle

Sistema gestor de base de datos no gratuito.

 

Si hacemos una búsqueda normal en las dos columnas con las palabras "base de datos" obtendremos las filas 1 y 4. Pero si hacemos una búsqueda extendida, en la primera pasada el sistema encontrará la información de la columna título de las filas 1 y 4, cogerá las palabras más relevantes, que serán aquellas que más se repiten en todos los resultados (en este caso MySQL) y volverá ha hacer la búsqueda con estas palabras únicamente. Cuando hace la segunda pasada encontrará la fila 3, que se sumará a los resultados anteriores.

Como resultado final, con las palabras "bases de datos", obtendremos las filas: 1, 2 y 3.

Como podéis ver, esto proporciona mayor cantidad de aciertos a la hora de hacer búsquedas (o falsos positivos, depende como se mire).

Una vez sabido esto estamos en condiciones de escribir consultas, sabiendo lo que escribimos. La forma de escribir las sentencias SQL para tipo de consulta son las siguientes:

  • Búsquedas en lenguaje natural (este es el método por defecto):

    SELECT * FROM TABLA WHERE MATCH(columna1,columna2,…,columnaN) AGAINST('valor1,valor2,…,valorN');

  • Búsquedas booleanas:

    SELECT * FROM TABLA WHERE MATCH(columna1,columna2,…,columnaN) AGAINST('Cvalor1,Cvalor2,…,CvalorN' IN BOOLEAN MODE);

    Donde "C" es el modificador condicional.

  • Búsquedas extendidas:

    SELECT * FROM TABLA WHERE MATCH(columna1,columna2,…,columnaN) AGAINST('valor1,valor2,…,valorN' WITH QUERY EXPANSION);

Comprobemos (por fin!) el rendimiento de todo lo hemos contado. Comencemos con las búsquedas booleanas, que son las más parecidas a las que hacemos normalmente. Buscamos en nuestras tablas de ejemplo:

Como podemos ver, la cantidad de resultados devueltos son exactamente los mismos que los de la consulta que mostrábamos al comienzo del post, salvo que ésta tardo la friolera de 12,3 segundos!!!!!.

Hagamos cálculos. La fórmula para saber el incremento del rendimiento es: cantidad_origen/cantidad_aumentada, por tanto:


O lo que es lo mismo. Usando un índice fulltext la búsqueda es 262 veces más rápida!!.

Pero el rendimiento no es todo. También podríamos hacer una búsqueda con comodines (la lista completa de parámetros la podéis encontrar en http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html). Busquemos ahora las filas, no repetidas, que contengan las palabras "poco", pero no "refranero", en la tabla "refrán". Además queremos que nos muestre todas las palabras que comiencen por "mar" y que contenga la frase exacta "es menester" (recalcar que los espacios entre palabras es lo mismo que poner un "or" booleano). Escribiríamos lo siguiente:

Tener en cuenta de que la ventaja de este tipo de índices no solo es la velocidad. La capacidad de hacer búsquedas más exhaustivas también es una característica muy importante que podemos encontrar con este índice.

Próximamente escribiremos sobre cómo usar este índice con diversos ORM: LINQ, Hibernate.

Como siempre, ya sabéis. Dudas, comentarios, críticas (constructivas, por favor) o cualquier insulto vario dejar un comentario :P

Referencias

http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

http://www.databasejournal.com/sqletc/article.php/1578331/Using-Fulltext-Indexes-in-MySQL---Part-1.htm

http://www.databasejournal.com/features/mysql/article.php/1587371/Using-Fulltext-Indexes-in-MySQL---Part-2-Boolean-searches.htm

http://mysql-full-text.blogspot.com/

http://devzone.zend.com/node/view/id/1304

 

Create PDF    Enviar articulo en formato PDF a
16Mar/102

Google search: Zend version phpinfo()

filetype:php inurl:"/phpinfo.php" intext:"zend engine"

Create PDF    Enviar articulo en formato PDF a
Get Adobe Flash playerPlugin by wpburn.com wordpress themes