Archive for the ‘.NET’ Category

10 Años de SQL Injection

Wednesday, December 31st, 2008

Descubro via Chema Alonso( MVP Seguridad ): Link que el pasado 25 de Diciembre se cumplieron 10 años del paper donde se expone la técnica que más adelante pasaría a llamarse SQL Injection.
Link al paper original

¿ Que no sabes qué es Sql Injection ?. Resumiendo al máximo: es una técnica para atacar una aplicación que maneja sin cuidado la generación de consultas a BD, inyectando sentencias SQL en lugar de los valores esperados.

Según la Wikipedia: Wikipedia

Por poner un ejemplo claro y clásico:

Código de LogIn en la aplicación pide Usuario y Contraseña, accede a la BD y comprueba si existe una fila en la tabla Usuarios con los datos introducidos, si es así el usuario accede a la aplicación.

Si la generación de la consulta se realiza como sigue: ( Quien no lo ha visto en todos los lenguajes de programación posibles?, salvo en LINQ, claro ;) ).

string sql = "SELECT Count(*) FROM Usuarios WHERE NombreUsuario = '" + textBoxNombreUsuario.Text + "' AND Contrasenya = '"+ textBoxContraseñaUsuario.Text + "'";

Bien, si el usuario de la aplicación, espabilado él, introduce por ejemplo, como nombre de usuario: MiUsuario’ OR 1=1 — la consulta resultante sería:

string sql = "SELECT Count(*) FROM Usuarios WHERE NombreUsuario = 'MiUsuario' OR 1=1 -- AND Contrasenya = 'cualquier cosa que ponga'";

Donde “–” en SQL comenta el resto de la línea… por lo que la consulta va a evaluar solamente las filas cuyo usuario sea ‘MiUsuario’ OR 1 sea igual a 1…. que suele serlo :)

Éste es el ejemplo más simple, recordad que SQL permite realizar operaciones en batches, separando cada consulta por ‘;’, con lo que en casos tan extremos como el anterior se pueden llegar a inyectar acciones DML tan “simples” como pueden ser DROP TABLE o DROP DATABASE: MiUsuario’ OR 1=1; DROP TABLE Usuarios —

Evidentemente para que pudieran realizarse operaciones de DML en la Base de Datos el usuario que ejecuta las consultas tendría que tener esos permisos… y no debería tenerlos, debería lo menos crearse un usuario con los menos permisos posibles para ejecutar las consultas de la aplicación y otro administrador para gestionarla … pero igualmente no se deberían crear las consultas dinámicas que estamos viendo, así que mejor verlo junto :)

A partir de aquí surgen distintas variaciones de la técnica, basándose en la información que se puede obtener de la página, como por ejemplo:

-Time-Based SqlInjection: Inyectar queries en las que si se cumple la condición que esperas se ejecuta un delay con el que poder distinguir basándonos en el tiempo de respuesta si la condición se ha cumplido o no. El ejemplo básico sería deducir una password a base de ir encontrando cada caracter, sabiendo si es válido porque cuando lo es la ejecución de la página es más lenta debido a la query inyectada. En TechNet hay un artículo, también de Chema, al respecto: link

Además de las neuronas de quien pone a prueba la aplicación, existen Tools que realizan sofisticados ataques basados en diccionarios, comparando resultados de la página, aplicando Time-Based SQL Injection… un ejemplo de herramienta puede ser :sqlpowerinjector

Bueno, me estoy extendiendo demasiado y se me acaba el año :)

Espero que con este mínimo resumen haya despertado la curiosidad de algunos y elevado el nivel de atención a la seguridad. Recordad que en general estas técnicas son totalmente independientes del lenguaje de programación y de la Base de Datos, cada uno puede tener algún agujero o característica especial, pero las técnicas generales aplican a todos.

El año que viene opinamos sobre qué hacer para evitar estas vulnerabilidades, pero las recetas mágicas no existen y siempre será necesario ser consciente de las técnicas de ataque para intentar evitarlas en lo posible.

Servicios de windows e impresión de documentos

Friday, November 7th, 2008

  En un reciente proyecto me he encontrado con una situación no demasiado común: necesitábamos imprimir los documentos de Word desde un servicio sin interfaz de usuario. A los ya consabidos problemas de trabajar con documentos de Office en servidor (pero eso ya es otra historia….) se le añadía la dificultad de las pruebas en los entornos intermedios (en nuestro caso: desarrollo, integración y pre-producción), una vez verificado el resultado de la impresión.

  Primeramente intenté configurar uno de los múltiples drivers de impresión existentes en el mercado que acaban generando un documento en formato PDF y/o XPS. El problema era que todos ellos requerían de la interacción del usuario para seleccionar la ubicación del fichero a generar.

  La opción de implementar un mecanismo, que mediante configuración habilitara/deshabilitara la impresión de los documentos, la descarté porque podía acabar ocultando problemas en los entornos.

  La solución implementada consiste en la definición de una IMPRESORA NULA. Esto consiste en definir un nueva impresora local, asignándole un puerto nuevo local con valor “NUL:” En el siguiente paso de seleccionar el modelo podemos elegir cualquiera, puesto que los datos imprimidos se DESCARTAN DIRECTAMENTE. Para finalizar basta con asignarle un nombre significativo “Void Printer”, o “Impresora Pozo Negro” y configurarla en nuestro servicio en el modo adecuado

  De este modo habremos conseguido, sin alterar en lo más mínimo el comportamiento de la aplicación, trabajar con la aplicación evitando talar árboles de manera innecesaria.

  Os dejo unos pantallazos de la configuración de la impresora en mi máqiuna (Windows Vista). Por cierto, esto está probado en Windows Vista y Windows 2003 Server.

Problemas Team Foundation Build y ClickOnce

Friday, October 31st, 2008

En el proyecto actual nos hemos encontrado con la problemática de realizar construcciones automáticas de TFS con un proyecto de tipo “Office AddIn”. Este tipo de proyectos utilizan ClickOnce para el despliegue, lo cual implica firmar el manifest. Aunque esto es algo que podemos obviar cuando estamos trabajando en nuestra máquina, puesto que Visual Studio nos genera de manera automática un certificado con funcionalidad “Code Signing”, provoca errores de construcción en el servidor de integración

  • C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(1805,7): error MSB3323: Unable to find manifest signing certificate in the certificate store.

Para resolver esto, basta con seguir estos pasos:

  1. Copiar el certificado utilizado para la firma, ya sea el generado por VS o uno de nuestra propia cosecha, a una carpeta del servidor de compilación
  2. Iniciar sesión con el usuario que ejecuta el servicio TFS Build
  3. Iniciar la consola de administración de certificados: Run => certmgr.msc
  4. Importar el certificado a la carpeta de certificados personales. En este momento se solicitará el password que le hayamos asignado.

A partir de este momento el certificado es accesible para el servicio de build y habremos solucionado el error anterior.

Salu2 a tod@s,

Lanzado oficialmente Mono 2.0

Tuesday, October 7th, 2008

Ayer 6 de Octubre ha salido oficialmente Mono 2.0. Entre otras características y mejoras, Mono 2.0 da soporte para C# 3.0 y Linq. Además se ha completado la implementación de Windows.Forms 2.0, ASP.NET 2.0 (con todos sus respectivos controles) entre otras APIs. Así que sólo queda descargarlo aquí y cacharrear con él.

Por cierto y como curiosidad, a la hora de elegir la plataforma para la descarga, es posible descargar una imagen de VMWare con openSUSE 11.0 con Mono 2.0 incluido, ideal para no perder el tiempo montandolo y poder probarlo directamente.

Google Chrome

Wednesday, September 3rd, 2008

Google acaba de presentar su browser, Google Chrome:

La versión beta ( hay algún servicio de Google que no sea beta? ;) ) se puede descargar de:

link

Como adelanto publicaron el fin de semana pasado un comic que detalla cada una de las nuevas características y es la mejor forma de conocer el navegador y sus características, es bastante técnico y visual al mismo tiempo:

link al comic

En vez de detallar las features como en todos los blogs del universo propongo discutir qué impacto pueden tener algunas features y qué opináis de la “fragmentación de la web”, para abrir el tema:

Una de las características más comentadas es el aislamiento entre los distintos tabs abiertos, cada uno corre en su propio proceso y el browser actúa como “coordinador”. Con ésto se tienen aislados los espacios de memoria de cada tab y un cuelgue en uno no afectará a otro… pero a cambio cada uno de los tabs tendrá su propio tamaño mínimo de stack, el código que use se cargará repetidas veces en cada proceso… y toda comunicación entre tabs y con el “browser coordinador” será mucho más costosa al ser “remota”.

El motor de javascript, V8, lo venden como la próxima maravilla del mundo: corre en una máquina virtual, entiendo que se precompila a un bytecode en vez de interpretarse, contiene heurísticas para detectar paths de ejecución repetidos y optimizarlos… veremos si sufre de problemas de compatibilidad con otros browsers( que posiblemente sean porque éste sea más fiel a un Standard que otros ).

La cantidad de browsers que una aplicación web debe soportar sigue creciendo y creciendo, desde distintas versiones del mismo navegador a los distintos navegadores disponibles. Todos hemos sufrido páginas webs que no funcionan bien en algún browser, incluso hemos visto o participado en webs donde el código cliente tiene 2 ramas, una para IE y otra para FF…

Dónde está aquella supuesta facilidad de despliegue y esa multiplataforma cuando puedes tener 8-12 browsers distintos y donde sabes que en algún momento saldrá otra versión de algún otro que será más o menos standard y tendrás que retocar-actualizar-probar tu aplicación web.

Todo esto lleva a otra discusión, cómo hemos partido de “la web original”, una arquitectura pensada para transmitir cadenas de texto con formato y mostrarlas por pantalla ( algo así como un visor de documentos simples remoto, sin estado ) a una plataforma de de aplicaciones a base de capas y capas y cantidades inmensas de “pequeños hacks” donde cada uno a ido por su lado. Esa es la historia de la web para lo bueno y para lo malo :)

Y otra batallita distinta va a ser opinar sobre los intereses de Google, claramente es un paso más en intentar llegar a un Sistema Operativo Web, que corra sobre cualquier SO. Está claro que la transición entre la “página web” donde se mostraba texto con un formateo muy básico y la “aplicación web” necesita avanzar muchos aspectos del browser.

Depurando servicios WCF

Wednesday, July 30th, 2008

Aunque a estas alturas de la vida parezca mentira, depurar un servicio de WCF “selft-hosted” en Visual Studio 2008 da muchos dolores de cabeza. Para empezar, cuando estás depurando la aplicación aparece un maravilloso dialogo que te avisa que no vas a poder depurar el código del servicio (aun cuando no fueras a hacerlo!). Si, ignorando la advertencia, intentas hacer un “step into”, descubriras que el entorno no te permite meterte dentro y pasa a la siguiente instrucción.

Para conseguir hacerlo funcionar hay que realizar dos sencillos pasos (una vez que los conoces, claro):
1. Habilitar la depuración de servicios WCF en la máquina. Por defecto, el framework no permite hacer depuración remota de los servicios WCF. Esto es una característica que aumenta la seguridad y el rendimiento de estos. Lo malo es que somos desarrolladores y en nuestras máquinas queremos hacer de todo. La solución es bien sencilla:
a. Abrir el fichero “machine.config”. Su ubicación es: %windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config. Cuidado con lo que tocamos, esto es parte del core del framework. Si hacemos lago mal podemos dejarlo KO.
b. Buscar el nodo: configuration/system.servicemodel/commonBehaviours
c. Comentamos los dos nodos contenidos tanto en “endpointBehaviors” como en “serviceBehaviors”. Recordatorio: es un XML, los comentarios son del tipo

2. Editar la configuración de la solución de VS para que arranque múltiples proyectos al depurar:
a. Abrimos las propiedades de la solución y accedemos a “Common Properties/Starup Project”
b. Seleccionamos “Multiple Startup Projects”
c. Marcamos como “Start” todos los proyectos de WCF que queramos depurar. Nota: Para evitar que nos aparezca el cliente de pruebas (sobre todo si no vamos a probar el servicio por separado), basta con eliminar los argumentos de la línea de comandos del proyecto en cuestión.

Bueno, ha sido largo y seguramente bastante tedioso, pero confío en que os ayude y os haga más llevadero vuestros desarollos.

Salu2 y hasta la próxima,
C#

He leído: Foundations Of Programming Building Better Software

Monday, July 7th, 2008

Y os lo recomiendo, es un ebook gratuito, muy profesional, donde en 78 paginas muy amenas se tratan por encima muchas de las técnicas de desarrollo modernas:

Agile Development, Domain Driven Design, Persistance, Dependency Injection, Unit Testing, ORM Mappers así como fundamentos de programación como Memoria, Excepciones y el Patrón Proxy componen los temas principales del libro.

El link es http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx

Infraestructuras para el desarrollo con SharePoint

Thursday, June 5th, 2008

La infraestrutura típica usada para desarrollar con SharePoint es siempre una máquina virtual, donde tendremos instalado Windows Server y nuestro Visual Studio con sus extensiones. Sin embargo, suele ser bastante incómodo a la par que lento. Ahora existe una forma de poder desarrollar para SharePoint sin tener que trabajar sobre un Windows Server, instalando SharePoint en Windows Vista. En el siguiente artículo nos dan los pasos necesarios para llevar a cabo la instalación y poder así trabajar directamente en nuestro equipo.

How to install Windows SharePoint Services 3.0 SP1 on Vista x64/x86

En caso de no tener Windows Vista, aún podemos conseguir instalar las extensiones para Visual Studio haciendo un pequeño Hack en el registro.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0]
"Sharepoint"="Installed"

Hay que recordar que, como se puede intuir, ambas opciones no están soportadas por Microsoft.

Visual Studio 2008 Extensions for Windows SharePoint Services

Thursday, June 5th, 2008

Hace un par de días han aparecido las, esperadas por todos los Shareponianos, Extensiones de Visual Studio 2008 para Windows SharePoint Services. La única novedad de esta nueva versión, la 1.2, es la integración con VS 2008. Aquí os dejo el enlace:

http://www.microsoft.com/downloads/details.aspx?FamilyID=7bf65b28-06e2-4e87-9bad-086e32185e68&displaylang=en

He leido: Agile project management with Scrum

Tuesday, May 27th, 2008

Este es el libro que ha estado amenizando mis últimos viajes en metro. Un libro orientado a mostrar como ejecutar un proyecto bajo metodología Scrum.

El autor orienta su obra sobre todo a aquellos que quieren desempeñar el rol de Scrum masters dentro de un proyecto (sin ser muy exactos viene a ser el rol más parecido a un project manager en un proyecto gestionado bajo metodología tradicional). Empleando ejemplos más o menos reales, el autor nos explica como afrontar las distintas situaciones que pueden llegar a darse en un proyecto. Especial incapié hace en como conseguir que la colaboración entre los distintos roles de un proyecto dé como resultado el máximo valor añadido al mismo (despues de todo, de eso trata Scrum).

Comienza con un capítulo en el que explica de modo muy escueto el proceso de desarrollo Scrum. La explicación del proceso no es demasiado detallada: he leído explicaciones más detalladas en los muchos artículos que pueblan la red. El autor únicamente da una introducción para pasar a lo que será el grueso del libro: los ejemplos.

El autor va tomando temas que le parecen claves para explicar como funciona Scrum. Para cada tema presenta dos o tres ejemplos, explicando posibles complicaciones relacionadas con con el mismo, y como afrontarlas para llegar a buén término.

El libro termina con unos apéndices muy buenos en los que resume a modo de referencia las reglas de Scrum, y muestra como Scrum cumple con los preceptos que fija el SEI para CMMI de niveles 2 y 3.

En mi opinión el libro es útil; explica como afrontar situaciones más o menos reales. Por el lado negativo diré que la mayoría de los ejemplos me parecen muy caricaturescos: las situaciones y los problemas son un tanto simplones y las soluciones aplicadas por el Scrum Master de turno siempre terminan dando como resultado el mejor que podrían dar (¡si Murphy levantara la cabeza!). He echado de menos algún ejemplo en el que las cosas fueran mal (o no tan bién). Aún así el autor te da una idea del modo en que podría resolverse cada situación.

Bueno.. esto es todo por ahora. Voy a ver si encuentro algún otro libraco interesante…. Ya os contaré