Inyección XPath Ciega

Last revision (mm/dd/yy): //

Descripción
Editar

XPath es un tipo de lenguaje de consulta que describe cómo localizar elementos específicos (incluyendo atributos, instrucciones de procesamiento, etc.) en un documento XML. Dado que es un lenguaje de consulta, XPath es algo similar a Structured Query Language (SQL), sin embargo, XPath es diferente, ya que se puede utilizar para hacer referencia a casi cualquier parte de un documento XML y sin restricciones de control de acceso. En SQL, un “usuario” (que es un término no definido en el contexto XPath / XML) puede limitarse a determinadas bases de datos, tablas, columnas o consultas. El uso de un ataque de inyección XPath, un atacante es capaz de modificar la consulta XPATH para realizar una acción de su elección.

Los Blind XPath Injection se pueden utilizar para extraer datos de una aplicación que incrusta los datos suministrados por el usuario de una manera insegura. Cuando la entrada no es verificada apropiadamente, un atacante puede introducir código XPath válido para que se ejecuta. Este tipo de ataque se utiliza en situaciones en las que el atacante no tiene conocimiento acerca de la estructura del documento XML, o tal vez el mensaje de error se suprime, y sólo es capaz de extraer una parte de la información por cada pregunta verdadero / falso (consultas booleanizadas), como en Blind SQL Injection.

Ejemplos
El atacante puede montar un ataque con éxito utilizando dos métodos: Boolenización y XML Crawling. Para añadir a la sintaxis XPath, el atacante utiliza expresiones adicionales.

Booleanización
Utilizando el método de “Boolenización” el atacante puede averiguar si la expresión XPath dada es verdadera o falsa. Vamos a suponer que el objetivo del atacante es iniciar sesión en una cuenta en una aplicación web. Un registro de éxito en regresaría “True” y sifracasó en el intento de registro volvería “Falso”. Sólo una pequeña parte de la información se dirige a través del carácter o número analizado. Cuando el atacante se centra en una cadena que puede revelar en su totalidad por el control de cada personaje dentro de la clase / gama de personajes esta cadena pertenece.

Utilizando una función de cadena de longitud (S), donde S es una cadena, el atacante puede averiguar la longitud de esta cadena. Con el número apropiado de subcadena (S, N, 1) iteraciones de la función, donde S es una cadena mencionado previamente, N es un carácter de inicio, y “1″ es un carácter siguiente a contar desde carácter N, el atacante es capaz de enumerar la toda cadena. Código: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;data&gt; &lt;user&gt; &lt;login&gt;admin&lt;/login&gt; &lt;password&gt;test&lt;/password&gt; &lt;realname&gt;SuperUser&lt;/realname&gt; &lt;/user&gt; &lt;user&gt; &lt;login&gt;rezos&lt;/login&gt; &lt;password&gt;rezos123&lt;/password&gt; &lt;realname&gt;Simple User&lt;/realname&gt; &lt;/user&gt; &lt;/data&gt; Función:   string.stringlength (// user [position = 1] / child :: node  [position  = 2]) devuelve la longitud de la segunda cadena del primer usuario (8),  substring ((// user [position = 1] / child :: node  [position  = 2), 1,1) devuelve el primer carácter de este usuario ("r"). 

XML Crawling
Para conocer la estructura del documento XML que el atacante puede utilizar:  count(expression)  count(//user/child::node Esto retornará el numero de nodos (en este caso 2). 	stringlength(string)  string-length(//user[position=1]/child::node[position=2])=6 Usando esta consulta el atacante averiguará si la segunda cadena (password) del primer nodo (usuario "admin") consta de 6 caracteres. 	substring(string, number, number)</li> </ul> substring((//user[position=1]/child::node[position=2]),1,1)="a" Esta consulta confirmarña (True) o negará (False) que el primer carácter del password de usuario ("admin") es una "a".

Si el formulario de entrada fuese algo como esto:

C#: String FindUser; FindUser = "//user[login/text='" + Request("Username") + "' And     password/text='" + Request("Password") + "']"; entonces el atacante debería inyectar el siguiente código: Username: ' or substring((//user[position=1]/child::node[position=2]),1,1)="a" or ''=' La sintaxis XPath puede resultarte muy parecida a la de las Inyecciones SQL pero el atacante debe tener en cuenta que este lenguaje no permite comentar el resto de la consulta.Para omitir esta limitación el atacante debe usar o expresiones de anular todas las expresiones, que puede interrumpir el ataque.

Debido a Boolenization el número de consultas, incluso dentro de un pequeño documento XML, puede ser muy alto (miles, miles de miles y más). Es por ello que este ataque no se lleva a cabo de forma manual. Conocer algunas funciones básicas XPath, el atacante es capaz de escribir una aplicación en un breve periodo de tiempo que la construya la estructura del documento y lo llene con los datos por sí mismo.

Relacionados Threat Agents
TBD

Relacionados Attacks

 * Blind_SQL_Injection
 * XPATH_Injection

Relacionados Vulnerabilities

 * Injection_problem

Relacionados Controls

 * Category:Input Validation

Referencias

 * http://dl.packetstormsecurity.net/papers/bypass/Blind_XPath_Injection_20040518.pdf - by Amit Klein (much more detailes, in my opinion the best source about Blind XPath Injection).
 * http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html
 * http://projects.webappsec.org/w/page/13247005/XPath%20Injection