Oracle Blind SQL Injection en Order By
Hoy quería comentar un caso curioso que me he encontrado recientemente durante un pentest de una aplicación web. La aplicación en cuestión es muy grande, con muchísimos menús, submenús, cantidad de roles, checkboxes y dropdown menus que muestran diferentes páginas en función de los valores que tengan… Vamos, una cosa incómoda de manejar y con muchos campos donde intentar inyectar basurilla. Y además, no está permitido el uso de herramientas automáticas (requisitos del cliente).
Lo más habitual suele ser que una web sea vulnerable a SQL injection en todos los campos del mismo tipo, o del mismo formulario, existiendo siempre la posibilidad de que un cambio de desarrollador o un parche a posteriori deje un agujero que no estaba previamente. La aplicación de la que os hablo hoy es de este tipo, una aplicación antigua que ha pasado por las manos de varios desarrolladores y sobre la que se han aplicado parches y añadido nuevas funcionalidades con el paso del tiempo. Pues allá que iba yo auditando la susodicha, llevando recorrido ya más de un 75% de la web sin haber sido capaz de encontrar ningún SQLi. Y fue en aquel preciso momento, desvanecida ya toda esperanza, cuando Isildur, Hijo del Rey recurrió a la espada de su padre… cuando me topé con la típica tabla que se puede ordenar clickando en los encabezados de las columnas. Algo muy parecido a esto:
Si echamos un vistazo a lo que sucede cuando hacemos click en “1 Year”, lo que nos mostrará Burp nos parecerá bastante sospechoso, y será muy parecido a lo siguiente:
Llegados a este punto, no queda más remedio que intentar una inyección en esos parámetros, a pesar de que existían otras tablas de la aplicación con aspecto idéntico, e idénticos nombres de parámetros que no eran inyectables. Para llevar a cabo esta tarea hay que tener en cuenta un par de peculiaridades sobre las inyecciones en cláusulas Order By, y en Oracle. A saber:
- No es necesario el uso de comillas: En la cláusula Order By se colocan directamente los nombres de las columnas de la tabla sin necesidad de comillas, por lo que no hará falta para la inyección cerrar comillas previamente abiertas.
- No está permitido el uso de UNION: SQL no permite el uso de UNION en la cláusula Order By (tampoco tendría mucho sentido), por lo que no podremos usar ésta técnica para extraer información.
- Oracle no permite SELECT sin su correspondiente FROM, por lo que para seleccionar consultas se ha de utilizar la tabla dummy llamada dual.
- Lo mismo da ordenar por una columna por nombre (ORDER BY Year) que por posición (ORDER BY 1).
Esto provoca que muchos programadores piensen que no es posible inyectar en cláusulas ORDER BY, y descuidan la debida validación de la entrada de usuario para estos casos. Como siempre, lo primero que a uno se le ocurre es meter unas comillas, y ver si la aplicación responde con un error maravilloso denotando que es vulnerable (y facilitando la posterior extracción de datos, ya que no podremos usar UNION). Por desgracia (para mí), las comillas simplemente devolvían la tabla ordenada de la misma forma que se muestra en la primera imagen, es decir, sin orden aparente. El mismo resultado se produce si en lugar de “Year”, utilizamos como valor “España” o “Manolito”. Hasta aquí podría parecer que no es vulnerable, y que quizá el JSP de la página haga un “switch” y cree la query a la base de datos sin los valores que estamos manipulando. En ese caso, sería posible que la rama default del switch hiciera la query sin ordenar, algo así:
switch (Sort_by){
case "Year":
query+="ORDER BY Year;";
break;
case "Month":
query+="ORDER BY Month;";
break;
default:
query+=";"
break;
}
Por suerte para nosotros, no es el caso. Lo era en ésta misma aplicación, en tablas anteriores, pero se les olvidó una; y con una basta. La pista la da que si en lugar de SortBy=”Year”, enviamos SortBy=1, la tabla se ordena como esperamos, por lo que o el switch cubre muchos casos, o aquí tenemos algo para jugar.
Si repasamos un poco nuestro escenario, tenemos una inyección ciega en un campo ORDER BY en Oracle. Al ser un caso de blind SQLi, no nos queda más remedio que tratar de construir algún tipo de lógica binaria para diferenciar aciertos de errores en las consultas. Probablemente, lo primero que os venga a la cabeza sea construir una consulta que ordene por la primera columna si el resultado es True, y por la segunda si es False. Como ejemplo, vamos a construir dicha query para obtener el primer caracter del usuario con el que corre la instancia de Oracle. Paso a paso:
Select user from dual -- Obtiene el usuario de la instancia de Oracle, utilizando la dummy table dual. case WHEN (1=1) THEN 1 ELSE 2 END -- Devuelve 1 si (1=1) es True, y 2 en otro caso. ascii(substr(user,1,1)) -- Devuelve el valor ascii del primer caracter de "user" Sort_by=(SELECT case WHEN ascii(substr(user,1,1))=80 then 1 else 2 end from (SELECT user from dual)) -- Obtiene el usuario de la tabla dummy dual. De ese string, saca el primer caracter y lo convierte a ascii. Si ese valor es igual a 80, devuelve 1 (ordenando por la primera columna) y si no, devuelve 2 (ordenando por la segunda).
También se podría haber hecho la query de la siguiente forma (por si a alguien le es más fácil de ver):
(case WHEN ascii(substr(SELECT user FROM dual,1,1))=80 then 1 else 2 end)
Conseguido esto sólo queda iterar por los valores de la tabla ascii para conseguir el nombre completo del usuario, o usar la misma idea para obtener las tablas, bases de datos o contenido de las mismas.
Hay dos conclusiones que extraer de esta pequeña entrada. La primera, que a pesar de que parezca que no se va a encontrar un fallo en una aplicación, hay que seguir probando todos los campos hasta el final, porque puede haber sorpresas. La segunda, que las inyecciones en ORDER BY, no sólo son posibles, sino que son muy efectivas, porque habitualmente no están filtradas por los desarrolladores.
Cualquier cosa, me encantará un comentario.
Salud
Achievement Unlocked: SANS GIAC GPEN
Quería poner una pequeña actualización para comentar que hoy hice el examen del GPEN y que ya estoy oficialmente certificado por GIAC. He estado apurando la fecha hasta el último día (sí, me gusta vivir al límite) porque con el cambio de trabajo y residencia se me complicaron las cosas. El centro estaba un poco en ruinas y hacía algo de frío, pero posiblemente es porque se estaban instalando en la nueva oficina. Además, me quedaba a tres horas en coche (sigh).
Sobre el examen, decir que sigue la tónica de los test de prácticas, pero apenas se repite ninguna pregunta. El nivel de dificultad es similar, aunque hay que sumarle obviamente la presión del examen “real”. El examen es “open book”, lo que quiere decir que puedes llevar los libros, y cualquier otro apunte que creas que puede serte útil. Cabe decir que, a pesar de que se tienen tan sólo 4 horas para responder 150 preguntas, con un buen índice que te permita encontrar rápidamente las preguntas que no tienes claras, sobra tiempo para completarlo sin prisas.
Dicho esto, obtuve un resultado del 95,33%, más que suficiente para aprobar y sentirme orgulloso del resultado. No habría podido obtener éste resultado tan positivo si no hubiera sido por la excelente labor de Mentor que hicieron Jose Selvi y Rafa Alfaro durante las semanas que duró el curso en Madrid. Los dos dieron unas clases estupendas, se lo curraron muchísimo con el CTF del final y con las explicaciones, además de dar un gran soporte durante el curso.
A tenor del curso, y del contenido de la certificación, estoy muy satisfecho con el temario y creo que es realmente útil para el trabajo diario. El apartado de leyes queda un poco fuera de lugar, pero por lo demás merece la pena, sobretodo si no tienes muchos años de experiencia como pentester. Aún así, creo que incluso la gente con más experiencia podría aprender algún truquillo nuevo. Y aunque no es ni de lejos lo más interesante, debo admitir que la parte sobre la escritura de informes me ha resultado útil.
Por último, darle las gracias a Miguel López, compañero durante el curso, que amablemente me cedió uno de sus tests de prácticas. Si todo va como está previsto, creo que me apuntaré al GXPN en algún momento de 2012. Quería cerrar el post con una promesa: actualizar más a menudo este año
¡Salud!
XPath Injection Primer
Edit: He publicado una segunda parte de este tema aquí.
Estos días he preparado una presentación introductoria (en inglés) sobre XPath Injection para dar como formación interna en la empresa, ya que hay gente nueva que no tiene mucha experiencia. No cubre aspectos avanzados pero sí que comienza con una introducción sobre XML y sobre XPath, para después entrar en el tema de XPath Injection. Quizá para la próxima incluya Blind XPath injection y algunos truquillos más, pero por el momento os dejo el powerpoint introductorio que para aquellos que no sepan mucho del tema les vendrá bien.
Para descargarlo podéis pinchar aquí.
¡Salud!
Emprender: Madrid Startup Weekend
Durante el fin de semana he tenido la suerte de participar en el Madrid Startup Weekend que se celebró en el centro Madrid On Rails. El evento estuvo bastante bien. El catering y la WiFi son aspectos a mejorar para futuras ediciones, así como la cobertura para Vodafone en el “zulo” ese donde estábamos metidos, que era bastante pobre. Se presentaron treintaitantos proyectos, de los cuales 9 comenzaron su desarrollo, aunque sólo 8 llegaron a presentarse al jurado final.
La valoración final que hicieron los inversores me produce cierta suspicacia y creo que está condicionada por el hecho de que elegir un ganador no implicaba que ellos tuvieran que poner dinero de su bolsillo en dichos proyectos, ya que sin desprestigiar ninguna idea (que de hecho eran buenas), el modelo de negocio que tenían algunas de ellas era endeble, cuando no inexistente.
El proyecto que presentamos Salva y yo fue JoinJoin, que obtuvo varios premios. Long story short, se trata de una aplicación para mejorar el networking en conferencias y eventos. Puesto que uno de los premios que obtuvimos fue una incubación en Link2Start que comienza el año próximo es probable que continuemos con el desarrollo de la idea, a ver si nos hacemos ricos de una vez.
Pero lo más importante es que extraje algunas conclusiones sobre el emprendimiento que me gustaría dejar aquí plasmadas. Muchas de estas ideas vienen reforzadas por el evento de ASECAM, también para emprendedores, del mes pasado. Algunas pueden sonar a coña, otras pueden ser discutibles. Como ya he dicho son apreciaciones personales y para gustos colores. (El orden es casi tan irrelevante como el contenido)
- Una persona no puede considerarse emprendedor si no posee dos de los siguientes dispositivos: IPhone, IPad, Macbook. Sí amigos, en los eventos para emprendedores los dispositivos de Apple crecen como las setas en un rincón húmedo y oscuro. Si vas con Android molas, pero no tanto.
- El perfil tecnológico no es el centro del emprendimiento. Es más, es totalmente prescindible. Voy a tratar de explicar este punto, porque seguramente será comprometido. Por lo que he podido ver en ambas ocasiones, son los perfiles de marketing/ADE/negocio los que están mejor preparados para la creación de startups tecnológicas. Un ingeniero informático por lo general no dispone de conocimientos sobre contabilidad, balances, planes de negocio, planes de expansión y márketing, publicidad, ventas… Y amigos, un negocio es ventas. Si no hay ventas, no hay negocio. Un tipo de márketing puede montar un bussines plan medio decente sobre la idea, planificar costes, estrategias de comunicación y expansión, previsiones de financiación, ingresos… Con todo esto, puede obtener una visión más o menos acertada acerca de la viabilidad del proyecto. Una vez que suponen que el negocio es viable es cuando recurrirán al ingeniero, pero en este momento el ingeniero no se incorporará en igualdad de condiciones. No será un socio, si no un asalariado. Por mi experiencia, un ingeniero tiene una idea y se basa en afirmaciones personales y subjetivas sobre su viabilidad. Desde mi punto de vista, tiene muchas más posibilidades de desarrollar algo que no tuvo futuro desde el minuto cero. Es más, aunque de con algo que puede funcionar, probablemente su enfoque técnico no le saque todo el jugo posible a la parte de ventas y presentación, impidiéndole conseguir financiación o llegar al mercado adecuado.
- Plan de negocio y mock ups; no desarrolles. Para analizar la viabilidad de un negocio y como primera fase del mismo no hay que comenzar por desarrollar un prototipo (¡error!), si no por hacer un plan de negocio. Lo importante no es tanto el producto si no el mercado al que va dirigido, el por qué te van a pagar por él, quién es el usuario y quién es el cliente, cómo vas a llegar a ese mercado, qué financiación necesitas… La parte del producto estará cubierta con unos diseños en photoshop que muestren un poco el aspecto gráfico del desarrollo en cuestión.
- El emprendimiento tecnológico es cosa de hombres. A pesar de que van apareciendo mujeres, la gran mayoría son todavía perfiles masculinos.
- El sacrificio extremo mola. Historias de terror, casos que acongojarían a Freddy y Jason circulan entre los emprendedores. Meses con 4 horas de sueño, casas hipotecadas, años trabajando sin sueldo y viviendo a una nómina de la ruina, madres de familia que se van a los States y dejan tirado a su marido y sus hijos… Todo con tal de emprender, de llevar a cabo tu idea. Para sacar algo adelante hay que sacrificarse, pasar horas sin dormir, ganar menos dinero, y quizá renunciar a parte (o toda) tu vida social un tiempo, pero ojo, que no se te vaya de las manos. Primero tú, luego tu idea.
Esto ha sido todo por hoy. Cuando vuelva a sacar algo de tiempo nos leemos por aquí de nuevo.
Manifiesto por una Red Neutral
Los ciudadanos y las empresas usuarias de Internet adheridas a este texto manifestamos:
1. Que Internet es una Red Neutral por diseño, desde su creación hasta su actual implementación, en la que la información fluye de manera libre, sin discriminación alguna en función de origen, destino, protocolo o contenido.
2. Que las empresas, emprendedores y usuarios de Internet han podido crear servicios y productos en esa Red Neutral sin necesidad de autorizaciones ni acuerdos previos, dando lugar a una barrera de entrada prácticamente inexistente que ha permitido la explosión creativa, de innovación y de servicios que define el estado de la red actual.
3. Que todos los usuarios, emprendedores y empresas de Internet han podido definir y ofrecer sus servicios en condiciones de igualdad llevando el concepto de la libre competencia hasta extremos nunca antes conocidos.
4. Que Internet es el vehículo de libre expresión, libre información y desarrollo social más importante con el que cuentan ciudadanos y empresas. Su naturaleza no debe ser puesta en riesgo bajo ningún concepto.
5. Que para posibilitar esa Red Neutral las operadoras deben transportar paquetes de datos de manera neutral sin erigirse en “aduaneros” del tráfico y sin favorecer o perjudicar a unos contenidos por encima de otros.
6. Que la gestión del tráfico en situaciones puntuales y excepcionales de saturación de las redes debe acometerse de forma transparente, de acuerdo a criterios homogéneos de interés público y no discriminatorios ni comerciales.
7. Que dicha restricción excepcional del tráfico por parte de las operadoras no puede convertirse en una alternativa sostenida a la inversión en redes.
8. Que dicha Red Neutral se ve amenazada por operadoras interesadas en llegar a acuerdos comerciales por los que se privilegie o degrade el contenido según su relación comercial con la operadora.
9. Que algunos operadores del mercado quieren “redefinir” la Red Neutral para manejarla de acuerdo con sus intereses, y esa pretensión debe ser evitada; la definición de las reglas fundamentales del funcionamiento de Internet debe basarse en el interés de quienes la usan, no de quienes la proveen.
10. Que la respuesta ante esta amenaza para la red no puede ser la inacción: no hacer nada equivale a permitir que intereses privados puedan de facto llevar a cabo prácticas que afectan a las libertades fundamentales de los ciudadanos y la capacidad de las empresas para competir en igualdad de condiciones.
11. Que es preciso y urgente instar al Gobierno a proteger de manera clara e inequívoca la Red Neutral, con el fin de proteger el valor de Internet de cara al desarrollo de una economía más productiva, moderna, eficiente y libre de injerencias e intromisiones indebidas. Para ello es preciso que cualquier moción que se apruebe vincule de manera indisoluble la definición de Red Neutral en el contenido de la futura ley que se promueve, y no condicione su aplicación a cuestiones que poco tienen que ver con ésta.
La Red Neutral es un concepto claro y definido en el ámbito académico, donde no suscita debate: los ciudadanos y las empresas tienen derecho a que el tráfico de datos recibido o generado no sea manipulado, tergiversado, impedido, desviado, priorizado o retrasado en función del tipo de contenido, del protocolo o aplicación utilizado, del origen o destino de la comunicación ni de cualquier otra consideración ajena a la de su propia voluntad. Ese tráfico se tratará como una comunicación privada y exclusivamente bajo mandato judicial podrá ser espiado, trazado, archivado o analizado en su contenido, como correspondencia privada que es en realidad.
Europa, y España en particular, se encuentran en medio de una crisis económica tan importante que obligará al cambio radical de su modelo productivo, y a un mejor aprovechamiento de la creatividad de sus ciudadanos. La Red Neutral es crucial a la hora de preservar un ecosistema que favorezca la competencia e innovación para la creación de los innumerables productos y servicios que quedan por inventar y descubrir. La capacidad de trabajar en red, de manera colaborativa, y en mercados conectados, afectará a todos los sectores y todas las empresas de nuestro país, lo que convierte a Internet en un factor clave actual y futuro en nuestro desarrollo económico y social, determinando en gran medida el nivel de competitividad del país. De ahí nuestra profunda preocupación por la preservación de la Red Neutral. Por eso instamos con urgencia al Gobierno español a ser proactivo en el contexto europeo y a legislar de manera clara e inequívoca en ese sentido.
Linux Cracking Series (LCS): lincrackme3
¡Buenas! Este lunes festivo he aprovechado y os traigo la nueva entrega de la LCS (Linux Cracking Series) con lincrackme3. El anterior ha recibido ya varias soluciones en crackmes.de, pero aún dejaré unos días antes de publicar la mía (con el código fuente y las explicaciones). También comentaré las más interesantes de las que se han publicado allí.
Los que no consiguierais solucionar el anterior, no os preocupéis, intentad este, y en unos días trataré de tener la explicación del anterior, que os servirá como base para abordar el nuevo. También podéis preguntarme vuestras dudas directamente.
Lincrackme3 es algo más difícil que lincrackme2, obviamente. Incluye técnicas anti depuración, anti desensamblado y también algún truco para que el análisis del flujo de código no sea tan sencillo. Aún así, creo que no es demasiado complicado, y que está al alcance de casi todo el que le dedique un rato.
Lincrackme 3
El objetivo de este crackme es encontrar las técnicas de anti depuración y anti desensamblado, entenderlas y averiguar cómo sortearlas. Una vez conseguido, tendréis que comprender cómo se comprueban las claves para encontrar varias claves válidas (idealmente, programad un sencillo keygen y me haréis feliz). El .tgz incluye una versión para 32 bits y una versión para 64 bits. La versión de 32 debería funcionar en ambos sistemas, pero por si acaso, he decidido crear las dos.
Objetivo: Obtener las claves válidas (escribir un keygen para sobresaliente). Encontrar las protecciones y sortearlas.
Nivel: 3 (Getting harder) según clasificación de crackmes.de
Plataforma: GNU/Linux 32 y 64 bits
Reglas: Parchear el binario no está permitido, salvo para saltarse alguna protección anti depuración o desensamblado. El objetivo no es imprimir el mensaje de clave correcta, si no obtener las claves válidas. Las herramientas a utilizar, así como la plataforma son completamente libres.
Podéis descargar el crackme aquí y también en mi página de crackmes.de (en cuanto lo aprueben, yo siempre os lo traigo en primicia
. Como siempre, os animo a que lo intentéis, y si os quedáis atascados en algún punto podéis contactarme en los comentarios (si no da pistas al resto) o bien por email (lo tenéis en About). Prometo ayudaros y daros las pistas necesarias para que disfrutéis del reto
Eso sí, para que todos puedan disfrutarlo, no pongáis las claves en los comentarios, por favor.
Pasado un tiempo prudencial publicaré mi solución a este reto (código, imágenes…) y comentaré las más interesantes de entre las que reciba, así que ya sabéis, ¡espero vuestras soluciones!
Noconname Día 2
Hoy el día prometía más fuerte que ayer, o al menos a mí me lo parece, aunque para gustos ya se sabe. Por desgracia la noche de ayer no terminó tarde, aunque lo pasé genial. Lo siento por los que compartieron cena conmigo, la próxima vez trataré de no hacer méritos para que nos escupan en la comida, lo prometo. Nos recogimos temprano (salvo dab y revskills que se fueron de parranda mano a mano) para descansar y poder madrugar al día siguiente. La primera charla, la de Jose Selvi, sobre IP fragmentation overlapping ha sido magnífica, con esa manera que tiene Jose de explicar los contenidos y transmitir conceptos complejos a un nivel que todo el mundo es capaz de entender. Después una de las charlas con mejor contenido, Reversing for goods de Pancake, con muchas buenas ideas para solucionar vulnerabilidades en binarios utilizando, como no, su radare2
. Después un pequeño descanso que nos vino muy bien a la mayoría, y que permitió recuperar energías y también un pequeño “pwnage” analógico del portátil de dab.
La comida, como no no podía ser de otra manera, en gran compañía y muy divertida. Por la tarde me quedo con la resolución de los retos publicados para la NcN, con regalo final para los ponentes. Oh, y esa entrega de premios, donde se ha visto que el contenido desconocido de unas cajas está más valorado que un descuento para el CEH. Poco más dio de sí el día, ya que no pudimos quedarnos a la última charla, había que pasar por el hotel a recoger las cosas y volar a la estación de Sants a coger el AVE de vuelta a Madrid; aunque hemos coincidido varios en el tren y hemos venido charlando tranquilamente. Espero que los que os habéis quedado por Barcelona estéis todavía de fiesta en el local que tenía reservado la organización y que lo estéis pasando en grande por todos los demás
El público en general no ha estado muy participativo en ninguna de las charlas, a pesar de los esfuerzos de algunos ponentes por hacernos partícipes de la explicación y tratar de que interviniéramos más. Aún así, lo mejor de la NcN 2010 ha sido la gente, conoceros a muchos que no teníais cara (para mí, imagino que siempre la tuvisteis, o eso quiero creer) y pasar buenos ratos charlando con vosotros. Especial mención para Miguel Gesteiro (@mgesteiro), al que no conocía y con el que he pasado buena parte de estas conferencias, así como revskills, que es otra persona a la que tenía ganas de “fichar” en persona.
En fin, que ha estado genial, a ver cuándo tenemos la oportunidad de asistir a otras conferencias y de pasarlo tan bien, o mejor, que en estas.




