
domingo, 7 de octubre de 2007
Inyecciones XPATH - V

miércoles, 3 de octubre de 2007
Inyecciones XPATH - IV
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
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
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
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
Dim Iterator As XPathNodeIterator = Navigator.Select("/Tigrillos/Tigrillo/Nombre")
'Si deseo obtener los nodos que en el tag
'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
En el próximo post vamos con los ejemplos.