Mostrando las entradas con la etiqueta Inyecciones XPATH. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Inyecciones XPATH. Mostrar todas las entradas

domingo, 7 de octubre de 2007

Inyecciones XPATH - V

Sigamos.
Obviamente hay mucho más en este tema, por ejemplo, con un mínimo conocimiento de XPATH se puede extraer la estructura completa del documento XML, este es un método llamado "Inyecciones XPATH ciegas", y se realiza en tiempo de ejecución.
Veamos un ejemplo:
Recordemos la expresión que usamos hace un rato para ingresar al sistema, finalmente resultó en esto,
' OR 1=1 AND '222'='222 cierto? ... claro pes.
Ok, ahora démosle la forma siguiente:
' OR name(//Users/UserName[1]) = 'UserName' AND '222'='222
Observen que el anterior 1=1 ha sido reemplazado por la expresión
name(//Users/UserName[1]) = 'UserName'
Y qué diablos estoy tratando de hacer?
Simplemente estoy intentando adivinar la estructura del documento XML, osea le estoy preguntando si el documento XML incluye en su estructura un nodo de nombre UserName, algo así:


Si la respuesta es afirmativa, mato dos pájaros de un tiro: 1ero. Ingreso al sistema y 2do. Ya sé que el documento tiene un nodo de nombre UserName, y así puedo continuar obteniendo los siguientes nodos.
Obviamente, con nuestro XML no lograrían obtener nada (no creo que a alguien se le ocurra pensar en la estructura Tigrillos > Tigrillo >... jaja).
Aquellas aplicaciones que piden inputs del usuario y no están suficientemente validadas son obviamente las más propensas a este tipo de ataques.
Pero, cómo nos defendemos de las inyecciones XPATH?
Cómo nos defendemos de las inyecciones SQL? es casi lo mismo, van por ahí las respuestas (chequeen los post que en su momento hice al respecto).
-Desconfía de todo, restringe al máximo los inputs del usuario:Controla el ingreso de caracteres no permitidos, esto es: comillas simples, comillas dobles, signo mayor, signo menor, ampersand, punto y coma, espresión " OR ", paréntesis, etc.
-Restringe la longitud de los datos de entrada.
-Si testeas tu aplicación para saber si es vulnerable a una inyección XPATH, y sale un error, significa que tu app es vulnerable.
-Inclusive, puedes implementar la política de prohibir el " OR " como parte del nombre de usuario o password, con eso ya estarías ganando bastante.
-Valida tanto en cliente como en el servidor.
OBS: Tengan en cuenta que muchas veces, los inputs necesariamente incluirán los caracteres prohibidos Por ejemplo, en la descripción de un libro podemos hallar el texto:
"el libro "Las aventuras de Pulgarcito & Barbie O'Tool" es altamente erótico", con lo cual tenemos que vivir... quiero decir que no le vas a decir a los usuarios que tengan cuidado con ingresar caracteres inválidos en cada cosa que escriban, cierto? claro pes, pero ese ya es tema de otro costal... nosotros básicamente nos hemos concentrado en la validación de los inputs de login de un usuario.
Crear una aplicación o sistema requiere una base de datos, y sabemos que usar una base de datos implica costo, y ese costo puede evitarse si usamos una base de datos XML (ya que simplemente es un archivo plano), pero no lo olvides, lo barato sale caro si no previenes tu aplicación de posibles ataques de inyección XPATH.

miércoles, 3 de octubre de 2007

Inyecciones XPATH - IV

Sigamos.
Hemos demostrado que, igual que las inyecciones SQL, las inyecciones XPATH permiten que una consulta XPATH sea convenientemente modificada para burlar la seguridad del sistema -en este caso web-, permitiéndonos ingresar de manera ilegal, tal vez no tenemos privilegios de administrador, pero sería bueno tenerlo.
Además, recordemos que no hemos obtenido información alguna sobre la base de datos XML, excepto el título del primer usuario.
También, hay ocasiones en las que la consulta puede devolver más de un dato.
Claro, esto va a ser posible sólo si el programador de la aplicación comete el error de recuperar el resultado en un objeto XPathNodeIterator, en lugar de hacerlo correctamente con un objeto XPathExpression.
Por ejemplo, si la rutina utilizada por el usuario fuese esta:
Private Function ValidateUser() As String
Dim Doc As XPathDocument = New XPathDocument(Server.MapPath(".") & \XML.xml")
Dim Navigator As XPathNavigator
Dim sb As New System.Text.StringBuilder
Navigator = Doc.CreateNavigator()
Dim Iterator As XPathNodeIterator = _
Navigator.Select("//Tigrillos/Tigrillo[Nombre='" & TextBox1.Text & _
"' and Email='" & TextBox2.Text & "']")
sb.Append(Iterator.Current.Value)
Return sb.ToString
End Function

y la inyección XPATH fuese esta:







el resultado sería este:




Lo cual a simple vista no es tan catastrófico, porque devuelve dos registros... pero si hubiese sido una base de datos real, imagínate que te devuelva todos los usuarios con sus contraseñas y números de cuenta de ahorro... qué rico no? digo esteeeeeeeee.... qué catastrófico jeje.
Recapitulemos
¿cómo hemos logrado burlar la expresión XPATH que pide usuario y password?
Simple, como ves... todo lo hemos reducido a una simple expresión booleana.
Así es mi estimado amigo... si devuelve verdadero ya estamos adentro, y ya conseguimos la información.
Y cómo hemos logrado que la expresión devuelva verdadero?
Simple también: poniendo un anunciado VERDADERO, osea 2=2 ... ajá.
Inicialmente nosotros nos encontramos ante una expresión de la forma:A AND B (donde A=usuario, B=password)
Pero,nosotros alteramos esa expresión a la forma (A OR B AND C) cierto? claro.
Osea, basta que (A o B AND C) sea verdadero para que toda la expresión sea verdadera.
Entonces, para nuestro caso:
A: USUARIO='' (FALSO)
B: 2=2 (VERDADERO)
C: PASSWORD='zzz' (VERDADERO, pues noten que en la parte de password también pongo zzz)
Según la lógica booleana, (A OR B AND C) se econvierte en esto:
(A OR (B AND C)),
por teoría booleana, y dado que (2=2 and C) es VERDADERO (debido a esto: zzz=zzz), quedaría: (A OR VERDADERO), lo cual resulta verdadero nuevamente, y con eso, la inyección XPATH se ha consumado.
La seguimos en la próxima.

sábado, 22 de setiembre de 2007

Inyecciones XPATH - III

Hola, sigamos con las inyecciones XPATH. Haremos un ejemplo de una inyección XPATH simple.
Tenemos una aplicación web que usa XPATH para consultar información guardada directamente en el documento XML que previamente hemos construido.
Se pretende recuperar el elemento del documento XML, para eso ingresamos previamente los datos Email y Password.
Algunas aplicaciones pueden embeber esos datos ingresados directamente en la consulta XPATH, lo cual significaría que la aplicación web tiene un hueco de seguridad.

Esta función nos va a validar los datos de los usuarios, y si estos datos ingresados son correctos, la aplicación debería devolver el título... por poner un ejemplo.

Private Function GetTitle(ByVal strUser As String, ByVal strPassword As String) As String
Dim Doc As New XmlDocument

Doc.Load(Server.MapPath(".") & "\XML.xml")

Dim nav As XPathNavigator = Doc.CreateNavigator()
Dim expr As XPathExpression = nav.Compile( _
"string(//Tigrillo[Nombre/text()='" + strUser + _
"' and Password/text()='" + strPassword + "']/Titulo/text())")

Dim Titulo As String = Convert.ToString(nav.Evaluate(expr))

If Titulo = String.Empty Then Return "Credenciales incorrectas, trate de nuevo" _
Else Return Titulo

End Function

No lo crean confuso, que es bastante sencillo. La función recibe dos parámetros: Usuario y Password y, devuelve el título. Nada más.

Si nosotros no somos usuarios de una aplicación web... nos podemos pasar toda la vida intentando ingresar, probando a poner usuarios y passwords que se nos ocurran.

Lógicamente nadie sería tan tonto de hacer eso, verdad? ...verdad?
Claro, para eso se hicieron las inyecciones XPATH (pareciera que se las estoy recomendando jeje).
En los datos de autenticación ingresamos esto,

Usuario:' or 1=1 or ''=' (Esta sentencia es quien hace todo el trabajo sucio)

Password: loquequieras (debes ingresar algo, pero no será tomado en cuenta)
Esta imagen me ayudará,


al presionar el botón OK, voilá... recibimos el título... de quién? del primer registro en el XML.

Pareciera poco importante, pero qué hubiera pasado si en lugar del título obtuviéramos un dato importante? por ejemplo, el número de la tarjeta de crédito u otra información confidencial? Eso sería preocupante, no es cierto?



No es mi costumbre alargar tanto un post, así que en la próxima la seguimos. Chau.

viernes, 14 de setiembre de 2007

Inyecciones XPATH - II

Este post es la continuación del anterior, jeje.
Como les decía, Xpath permite realizar consultas en un documento XML.
Los ejemplos que a continuación se mostrarán involucran XPATH + VB.NET, pero tú puedes practicar con el lenguaje de programación que prefieras y en el entorno de desarrollo que desees (yo estoy usando VS.NET 2003), ten en cuenta que XPATH es un estándar, y las especificaciones las dicta la W3C.
Vamos con el ejemplo:


Este será el documento XML (XML.xml)que usaremos para realizar las pruebas:


Recordemos algo básico de XPATH:
'//Imports System.Xml.XPath
Dim Doc As XPathDocument = New XPathDocument(Server.MapPath(".") & "\XML.xml")
Dim Navigator As XPathNavigator

Navigator = Doc.CreateNavigator()
'Si quiero filtrar obtener, de todos los nodos, los tag , hago esto:
Dim Iterator As XPathNodeIterator = Navigator.Select("/Tigrillos/Tigrillo/Nombre")


'Si deseo obtener los nodos que en el tag coincidan con 'Don', hago esto:
Dim Iterator As XPathNodeIterator = Navigator.Select("/Tigrillos/Tigrillo[Nombre='Don']")

'o también así:
Dim Iterator As XPathNodeIterator = _
Navigator.Select("//Tigrillos/Tigrillo/Nombre[text()='Don']")

'y con dos restricciones sería así:
Dim Iterator As XPathNodeIterator = _
Navigator.Select("//Tigrillos/Tigrillo[Nombre='Don' and Email='donbox@hotmail.com']")


Cómo que eso no es una inyección XPATH ?
Sí, sí ya sé... estamos llegando a eso... con calma.

La seguimos en la próxima.

domingo, 9 de setiembre de 2007

Inyecciones XPATH - I

Recordemos:
Las inyecciones SQL permiten modificar las consultas T-SQL originales, con propósitos deshonestos (obtener/alterar/borrar información de una base de datos SQL).
Nosotros hemos hecho un análisis serio de este tema en este blog, sírvase buscarlo por favor.
Las inyecciones HTML o XSS, consisten en incluir código script sobre las páginas web, para robar información (comoel número de su tarjeta de crédito, etc). De este tema también hicimos un análisis detallado en este blog.
Ahora,
continuándo con el tema de las inyecciones, vamos a hacer una serie de posts sobre las inyecciones XPATH.
Pero, qué son las inyecciones XPATH?
Pues, son los mismo que las inyecciones SQL, sólo que esta vez aplicados a base de datos XML. Clarísimo no?

Cómo que no entiendes?
Si SQL tiene un lenguaje de consulta llamado T-SQL, pues XML también tiene un lenguaje de consulta, llamado XPATH, ahhhhhhhhhhh.
En las inyecciones SQL, el objetivo son las bases de datos de tipo SQL.
En las inyecciones XPATH, el objetivo son las bases de datos de tipo XML.
Pero, cuál es más fácil de burlar... las bases de datos SQL o XML?
La verdad que XML es más fácil de burlar.
Te diré por qué:
1.-XPATH es un standard, siempre se escribe igual.
2.-El lenguaje SQL tiene diferentes implementaciones, por ejemplo: el T-SQL de MYSQL no es igual al de SQL SERVER y tampoco es igual al PL-SQL de Oracle, etc, son sólo parecidos, debido a ello, la inyección SQL para cada caso es distinta.

3.-El XPATH puede referirse a todas las partes del documento/database XML, osea: no hay restricciones a información del documento.
4.-En SQL, la cosa cambia, se puede limitar el acceso a sólo determinadas tablas de la base de datos, inclusive a columnas específicas de las tablas, pudiéndose de esta manera evitar muchas catástrofes, aún si hubiesen logrado ingresar a tu base de datos de manera ilícita.

En el próximo post vamos con los ejemplos.
Chau.