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.

No hay comentarios.: